Hike News
Hike News

機器學習-演算法-K Neighbors Classifier

Introduction

  • 透過鄰居(離自己最近的點)來推斷所屬的類別
  • 比較樣本之間的特徵遠近;相似的樣本,特徵之間的值應該都是相近的
  • 定義:如果一個樣本在特徵空間中 與K個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於同一個類別,則該樣本也屬於這個類別
  • 兩個樣本的距離可以通過如下公式計算,又稱歐式距離,比如a(a1,a2,a3), b(b1,b2,b3)

  • 在計算兩個樣本的距離時,會因為某些特徵值本就屬於非常大的數值,在求其距離時會直接影響最後的結果

    • 使用KNN算法時需將數據集做標準化或是歸一化處理(無量綱化)
    • 使用標準化較為穩定
  • 使用sklearn.neighbors.KNeighborsClassifier() 調用此演算法的API


K Neighbors Classifier

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, algorithm='auto')
  • n_neighbors:為int類型,可選,預設值為5,選擇查詢的鄰居數
  • algorithm:有'auto','ball_tree','kd_tree','brute'幾種選擇,可選用於計算最近鄰居的算法,'auto'將嘗試根據傳遞給fit()方法的值來決定最合適的算法
  • metric:預設為"minkowski"(明可夫斯基距離)
    • 其為歐式距離曼哈頓距離兩種計算距離的延伸
    • 其實例化KNN算法時參數p預設為2
      • p為2時所使用的是曼哈頓距離:兩點絕對值距離
      • p為1時所使用的是歐式距離

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 1)獲取數據
iris_data = load_iris()
# 2)數據集劃分
X_train,X_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target)

# 3)特徵工程 --- 標準化
transfer = StandardScaler()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)

# 4)KNN estimator流程
KNN = KNeighborsClassifier()
KNN.fit(X_train,y_train)
KNN.predict(X_test)

# 5)模型評估
print("score = ",KNN.score(X_test,y_test))

result

1
score = 1.0

tips

  • 須考慮k值須取多大
    • k值取太小容易受異常點的影響
    • k值如果取得太大容易受到鄰近點(類別)結果比例影響
      • 訓練集的各類別樣本不均衡時造成誤判
  • 因為每個點都需計算距離造成性能低落

優缺點

  • 優點
    • 簡單
    • 易於理解及實現
    • 無須估計參數(演算法所需參數),無須訓練(不是迭代,而是單純的計算距離)
  • 缺點
    • 對測試樣本分類時計算量大
    • 內存開銷大
    • 必須指定k值,且k值選擇不當分類精確度不能保證
  • 使用場景
    • 小數據(幾千~幾萬樣本)