機器學習實踐(七)—sklearn之K-近鄰演算法
阿新 • • 發佈:2018-11-25
一、K-近鄰演算法(KNN)原理
K Nearest Neighbor演算法又叫KNN演算法,這個演算法是機器學習裡面一個比較經典的演算法, 總體來說KNN演算法是相對比較容易理解的演算法
-
定義
如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
來源:KNN演算法最早是由Cover和Hart提出的一種分類演算法
-
距離公式
兩個樣本的距離可以通過如下公式計算,又叫歐式距離
二、簡單例項-電影型別分析
假設我們現在有幾部電影
其中 $ ?$表示的電影不知道類別,如何去預測?我們可以利用K近鄰演算法的思想
問題
-
如果取的最近的電影數量不一樣?會是什麼結果?
-
k = 1 ,[愛情片]
-
k = 2 ,[愛情片,愛情片]
-
k = 3 ,[愛情片,愛情片,愛情片]
-
k = 4 ,[愛情片,愛情片,愛情片,動作片]
-
k = 6 ,[愛情片,愛情片,愛情片,動作片,動作片,動作片]
-
-
分析K-近鄰演算法需要做什麼樣的處理
- k 是一個超引數,需要人為指定,好的 k 值更需要人的豐富經驗
- 當 k 取很大值時,受樣本均衡影響較大
- 當 k 取很小值時,受異常點影響較大
三、sklearn - KNN - API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
-
n_neighbors
- 查詢預設使用的鄰居數
- int ,可選(預設= 5)
-
algorithm:
-
可選用於計算最近鄰居的演算法:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
- ‘ball_tree’將會使用 BallTree,
- ‘kd_tree’將使用 KDTree。
- ‘auto’將嘗試根據傳遞給fit方法的值來決定最合適的演算法。
- (不同實現方式影響效率)
-
四、KNN - 案例:鳶尾花種類預測
-
步驟分析
- 獲取資料集與分割資料集
- 特徵工程:標準化
- 模型訓練評估
-
完整程式碼
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # 載入資料 iris = load_iris() # 劃分資料集 x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.3,random_state=8) # 標準化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 訓練模型 estimator = KNeighborsClassifier() estimator.fit(x_train,y_train) # 模型評估 # 方法一 比對真實值與預測值 y_predict = estimator.predict(x_test) y_test == y_predict # 模型評估 # 方法二 計算準確率 estimator.score(x_test,y_test)
五、KNN優缺點
- 優點:
- 簡單,易於理解,易於實現,無需訓練
- 缺點:
- 懶惰演算法,對測試樣本分類時的計算量大,記憶體開銷大
- 必須指定K值,K值選擇不當則分類精度不能保證
- 使用場景:小資料場景,幾千~幾萬樣本,具體場景具體業務具體分析