一個樣本在特徵空間中最鄰近(距離)的K個樣本大多數屬於某一個類別,則該樣本也屬於這個類別。git
# 倒入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)
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
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)
一、超參數和模型參數算法
二、KNN算法中的超參數dom
三、距離權重超參數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)
一、數據歸一化的概念
把數據映射到同一尺度上,數據歸一化可讓算法更快收斂
二、經常使用的數據歸一化的方法
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)
一、流程
二、優缺點