1、sklearn實現K鄰近分類算法

1、K鄰近算法的基本概念

  一個樣本在特徵空間中最鄰近(距離)的K個樣本大多數屬於某一個類別,則該樣本也屬於這個類別。git

2、sklearn使用歐氏距離實現KNN算法

# 倒入sklearn庫中的KNN算法類
from sklearn.neighbors import KNeighborsClassifier

# 建立KNN算法實例並設置K值
KNN_classifier = KNeighborsClassifier(n_neighbors=4)

# 傳入訓練樣本數據擬合KNN模型
KNN_classifier.fit(train_x, train_y)

# 傳入測試樣本數據進行預測,並返回預測結果
KNN_classifier.predict(test_x)
View Code

3、sklearn使用train_test_split來測試模型的性能(iris鳶尾花數據)

import numpy as np

# 導入sklearn模塊的數據集
from sklearn import datasets

# 導入sklearn模塊中的隨機拆分數據的模塊
from sklearn.model_selection import train_test_split 

# 導入sklearn模塊中的KNN算法模塊
from sklearn.neighbors import KNeighborsClassifier

# 取iris數據集
iris = datasets.load_iris() 

X = iris.data  # 樣本特徵集(150, 4)
y = iris.target # 樣本標籤集(150,)

# 隨機拆分數據,默認test_size=0.2 20%拆分
# random_state = 666 設置隨機種子
# X_train.shape = (112, 4)
# X_test.shape = (38, 4)
# y_test.shape = (38,)
# y_train.shape = (112,)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)

# 建立KNN算法實例並設置K值
KNN_classifier = KNeighborsClassifier(n_neighbors=6) 

# 傳入訓練樣本數據擬合KNN模型
KNN_classifier.fit(X_train, y_train)

# 傳入測試樣本數據進行預測,並返回預測結果
y_predict = KNN_classifier.predict(X_test)

# 驗證預測準確率
sum(y_predict == y_test)/len(y_test) # 0.9210526315789473
View Code

4、sklearn實現預測準確率算法

import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 判斷模型預測準確率的模型
from sklearn.metrics import accuracy_score

# 導入手寫數據集
digits = datasets.load_digits()
# X樣本數據集:(1797, 64)
# y標籤數據集:(1797,)
X = digits.data
y = digits.target

# 按2:8隨機拆分數據集
X_train, X_test, y_train, y_test = train_test_split(X, y ,test_size=0.2)

# 生成KNN算法實例,並設置K=3
KNN_classifier = KNeighborsClassifier(n_neighbors=3)

# KNN擬合模型
KNN_classifier.fit(X_train, y_train)

# 經過擬合的KNN模型預測結果,並返回預測結果集
y_predict = KNN_classifier.predict(X_test)

# 返回預測準確率
accuracy_score(y_test, y_predict) # 0.9916666666666667
# KNN_classifier.score(X_test, y_test)
View Code

5、sklearn經過網格搜索來優化KNN算法中的超參數

一、超參數和模型參數算法

  • 超參數:在算法運行前須要決定的參數
  • 模型參數:算法運行過程當中學習到的參數

二、KNN算法中的超參數dom

  • K值:鄰近的點的數量選擇
  • 距離權重
  • p值

三、距離權重超參數ide

定義:通常距離權重是距離的倒數值性能

EXP:學習

  當1個樣本的最近的3個樣本(A類一個,B類兩個),距離A類爲1個單位,距離B類分別是3個和4個單位,不考慮距離權重時,樣本是B類,考慮距離權重時,距離A類的權重爲1,B類權重爲1/3+1/4=7/12爲A類;當3個點是3類是不考慮權重則屬於3個類別的機率相同,因此KNN算法應當考慮距離權重。測試

sklearn.KNeighborsClassifier類中有一個weights參數默認是uniform(不考慮距離權重),distance(考慮距離權重)優化

四、p超參數spa

距離的定義有:歐氏距離、曼哈頓距離、明科夫實際距離、....code

sklearn.KNeighborsClassifier類中有一個p參數,接受整型值(默認值爲2,歐氏距離)

五、網格搜索尋找最優超參數

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

# 導入網格搜索模塊
from sklearn.model_selection import GridSearchCV

# 導入手寫數據集
digits = datasets.load_digits()

# X樣本數據集:(1797, 64)
# y標籤數據集:(1797,)
X = digits.data
y = digits.target

# 按2:8隨機拆分數據集
X_train, X_test, y_train, y_test = train_test_split(X, y ,test_size=0.2)

# 定義網格搜索參數
# weights='distance', p參數纔有意義
param_grid = [    
    {
        'weights':['uniform'],
        'n_neighbors': [i for i in range(1, 11)]
    },
    {
        'weights':['distance'],
        'n_neighbors': [i for i in range(1, 11)],
        'p': [i for i in range(1, 6)]
    }]

# 建立KNN算法類實例
KNN_clf = KNeighborsClassifier()

# 建立網格搜索類實例
# n_jobs設置並行運行,默認是1,-1是最大並行運行
# verbose=int 設置輸出
grid_search = GridSearchCV(KNN_clf, param_grid,n_jobs=2, verbose=2)

# 擬合網格搜索算法
grid_search.fit(X_train, y_train)

# 搜索到的最優參數的分類器
# 能夠直接調用knn_clf.precdi
knn_clf = grid_search.best_estimator_

# 搜索到的最優參數
grid_search.best_params_

# 最優參數下的準確率
grid_search.best_score_

# 使用最優參數分類器預測
knn_clf.predict(X_test)

# 使用最優參數分類器預測的準確率
knn_clf.score(X_test, y_test)
View Code

6、sklearn實現數據歸一化

一、數據歸一化的概念

把數據映射到同一尺度上,數據歸一化可讓算法更快收斂

二、經常使用的數據歸一化的方法

  • 最值歸一化:當數據有明顯邊界時,把全部數據映射到0-1之間,x_scale = (x-x_min)/(x_max-x_main)
  • 均值方差歸一化:當數據沒有明顯邊界時,把全部數據歸一到均值爲0方差爲1的分佈中,x_scale = (x - x_mean)/ s  (s爲方差),測試集的均值方差歸一化使用的是訓練集的x_mean和s
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

iris = datasets.load_iris()

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)

standard_scaler = StandardScaler()
standard_scaler.fit(X_train)

# 均值
standard_scaler.mean_

# 方差
standard_scaler.var_

# 標準差
standard_scaler.scale_

# 訓練集歸一化操做
X_train = standard_scaler.transform(X_train)

# 測試集歸一化操做
X_test = standard_scaler.transform(X_test)
KNN_clf = KNeighborsClassifier(n_neighbors=3)
KNN_clf.fit(X_train, y_train)
KNN_clf.score(X_test, y_test)
View Code

7、總結sklearn實現並優化KNN算法的流程

一、流程

  • 導入數據
  • 使用train_test_split隨機拆分數據
  • 使用StandardScaler對數據進行均值方差歸一化
  • 使用GridSearchCV網格搜索來優化k值、距離權重和p值等超參數
  • 使用accuracy_score或者score來取得預測值的準確率

二、優缺點

  • 優勢:自然的單、多分類算法,簡單、效果好
  • 缺點:
    •   效率低,每同樣本的計算複雜度高
    •   高度數據相關
    •   預測結果不具有可解釋性
    •   維數災難,處理高維度數據會出現問題
相關文章
相關標籤/搜索