1. 程式人生 > >機器學習實踐(七)—sklearn之K-近鄰演算法

機器學習實踐(七)—sklearn之K-近鄰演算法

一、K-近鄰演算法(KNN)原理

K Nearest Neighbor演算法又叫KNN演算法,這個演算法是機器學習裡面一個比較經典的演算法, 總體來說KNN演算法是相對比較容易理解的演算法

  • 定義

    如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

    來源:KNN演算法最早是由Cover和Hart提出的一種分類演算法

  • 距離公式

    兩個樣本的距離可以通過如下公式計算,又叫歐式距離
    d

    i s t a n c e =
    i n ( a i
    b i ) 2
    distance = \sqrt{\sum_i^n (a_i-b_i)^2}

    A = ( a 1 , a 2 , a 3 , . . . . . , a n ) A = (a_1,a_2,a_3,.....,a_n)

    B = ( b 1 , b 2 , b 3 , . . . . . , b n ) B = (b_1,b_2,b_3,.....,b_n)

二、簡單例項-電影型別分析

假設我們現在有幾部電影

在這裡插入圖片描述

其中 $ ?$表示的電影不知道類別,如何去預測?我們可以利用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 - 案例:鳶尾花種類預測

  • 資料集介紹

    Iris資料集是常用的分類實驗資料集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉資料集,是一類多重變數分析的資料集。關於資料集的具體介紹:

在這裡插入圖片描述

  • 步驟分析

    • 獲取資料集與分割資料集
    • 特徵工程:標準化
    • 模型訓練評估
  • 完整程式碼

    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值選擇不當則分類精度不能保證
  • 使用場景:小資料場景,幾千~幾萬樣本,具體場景具體業務具體分析