日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习的练功方式(四)——KNN算法

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习的练功方式(四)——KNN算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 致謝
    • 致歉
  • 4 KNN算法
    • 4.1 sklearn轉換器和估計器
      • 4.1.1 轉換器
      • 4.1.2 估計器
    • 4.2 KNN算法
      • 4.2.1 概述
      • 4.2.2 電影類型分析
      • 4.2.3 算法實現

致謝

閔氏距離_百度百科 (baidu.com)

機器學習之KNN(k近鄰)算法詳解_平原的博客-CSDN博客_knn

鳶尾花(Iris)數據集_qinzhongyuan的博客-CSDN博客_鳶尾花數據集下載

致歉

前面發布的這一篇老版博客出現了一些腦子抽風的問題,現已修改完畢。

4 KNN算法

我們前面在第二講的時候提到了線性回歸,雖然市面上很大部分上的書都是先講線性回歸,但我更愿意先和你講講最簡單的分類算法——KNN算法。它是一種能夠找到相似對象的一個算法,這些對象彼此之間的關系比其他群組對象之間的關系更為密切。

4.1 sklearn轉換器和估計器

4.1.1 轉換器

在前一講的特征工程中,我們一直在做一件事。通過實例化一個轉換器類,然后將輸出傳入該對象,最后得出一個處理好的結果。

當我們處理數據時,通常都是調用轉換器對象中的fit_transform方法,實際上,這個轉換器方法可拆解為兩個過程,一個是fit,一個是transform。

舉標準化的過程為例,我們要做的是(x?mean)/std(x-mean)/std(x?mean)/std。而在這個過程中,fit步驟在計算mean平均值和計算std標準差,而transform步驟在計算總結果。

4.1.2 估計器

在sklearn中,估計器也是一個重要的角色,其是一類實現了算法的API。

比如用于分類的估計器:

  • sklearn.neighbors k-近鄰算法
  • sklearn.naive_bayes 貝葉斯
  • sklearn.liner_model.LogisticRegression 邏輯回歸
  • sklearn.tree 決策樹和隨機森林

比如用于回歸的估計器:

  • sklearn.linear_model.LinearRegression 線性回歸
  • sklearn.linear_model.Ridge 嶺回歸

再比如用于無監督學習的估計器:

  • sklearn.cluster.KMeans 聚類

以上所有的估計器,實際上都是估計器類的子類。其皆繼承于估計器類。

對于估計器父類來說,我們可以做這么一件事:

  • 實例化一個estimator類
  • estimator.fit(x_train,y_train)計算,當調用完畢,模型就會生成
  • 模型評估:score精度評估和predicct預測結果,其中如果想要比對真實值和預測值的差距,可以通過y_predict = estimator.predict(x_test),將測試集放于預測函數中,預測出相應的結果,預測出來的結果可以用布爾函數與y_test作比對,看看是否分類正確。而如果想要計算準確率,可以采用accuracy = estimator.score(x_test,y_test)的方法來查看預測的準確率。
  • 既然我們前面提過,上面的估計器均是估計器的子類,那么意味著一些子類應該有以上的方法,在后面的學習中,我們會學著怎么去調用它們。

    4.2 KNN算法

    4.2.1 概述

    KNN算法也叫K-近鄰算法,記得我們上面提到的簡短的定義嗎?我們用一個例子來說明KNN算法到底在做什么一件事。

    KNN(K-Nearest Neighbor)最鄰近分類算法,其為數據挖掘分類(classification)技術中最簡單的算法之一,其指導思想是”近朱者赤,近墨者黑“,即由你的鄰居來推斷出你的類別。

    假設圖上該紅點離藍色小男孩最近,小男孩位于朝陽區,那么我也判斷該點處于朝陽區。這就是KNN最簡單的一個大白話過程。

    讓我們重新看一下KNN的定義:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數屬于某一個類別,那該樣本也屬于這個類別。

    假如我們k值取1,那么只要該樣本離哪個點最近,其就會被歸屬于哪一個類別。這樣做雖然簡單粗暴,但是卻容易出現問題:該樣本容易受到異常值的影響!所以使用合適的k值可以避免異常值的影響。

    那么在以上的定義中,我們如何來確定樣本和哪個點最近呢?用什么來度量這個距離呢?

    我們常用歐式距離來度量上述的距離,歐式距離這個名詞似乎很陌生,實際上,它就是我們高中學過的兩點之間距離公式。在二維形式下,其公式為:p=(x2?x1)2+(y2?y1)2p = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}p=(x2??x1?)2+(y2??y1?)2?。在三維形式下,其公式為:p=(x2?x1)2+(y2?y1)2+(z2?z1)2p = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2}p=(x2??x1?)2+(y2??y1?)2+(z2??z1?)2?。照此規律,我們可以推廣到n維空間中。

    除了上述的歐式距離外,還有一種距離——曼哈頓距離,曼哈頓距離也叫出租車幾何距離,其由十九世紀的赫爾曼、閔可夫斯基所創,其距離計算公式為:p=∣X1?X2∣+∣Y1?Y2∣p = |X_1 - X_2|+|Y_1 - Y_2|p=X1??X2?+Y1??Y2?,照此規律,我們也可以推廣到n維空間中。

    上述兩種距離實際上是閔可夫斯基距離的特殊情況,關于閔可夫斯基的數學細節,有興趣的小伙伴可以上百度查找。

    4.2.2 電影類型分析

    我們再用一個例子來體會K近鄰算法的應用。假設我們現在有幾部電影:

    在上圖的案例中,?位置電影是不知道其類別的,根據KNN算法,我們計算器距離。

    在以上的距離中,明顯地,?離He’s not Really into dues最近,而這個電影為愛情片,?在KNN分類下k = 1時屬于愛情片。

    當k >= 2時,由于?受到多個點的共同作用,所以可能出現幾個點是愛情片幾個點是動作片的情況。這個時候如果想要確定樣本點的類別,其遵循多數表態原則。就要看靠近k個點中,哪個類別的點比較多就為哪個類別,需要注意的是,如果k個點中各個類別的點數目一樣多,那么該樣本點即無法分類。也就是說,k如果取的太大,則樣本點容易分錯類。

    多數表態原則

    k近鄰法中的分類決策規則往往是多數表決,即由輸入實例的k個鄰近的訓練實例中的多數類決定輸入實例的類。

    讓我們來總結一下上述講的關于k值的選取問題。如果選擇較小的k值,就相當于用較小的領域中的訓練實例進行預測,“學習”的近似誤差會減小,只有與輸入實例接近的(相似的)訓練實例才會對預測結果起作用。但缺點是“學習”的誤差會增大,預測結果會對近鄰的實例點非常敏感。如果鄰近的實例點恰巧是噪聲,預測就會出錯。換句話說,k值的減小就意味著整體模型變得復雜,容易發送過擬合。

    過擬合問題在線性回歸后面的代碼實現我會重新講到,這里稍微提一下就是,當過擬合出現時,用于訓練模型的訓練樣本點會準確無誤的擬合訓練出來的函數,這樣做可以使訓練集對訓練函數擬合度高,但是預測結果卻很差。

    如果選擇較大的k值,就相當于用較大領域中的訓練實例進行預測。其優點是可以減少學習的估計誤差,但是缺點是學習的近似誤差會增大。這時與輸入實例較遠的訓練實例也會對預測起作用,使預測發生錯誤。

    k值一般是采用k折交叉驗證來選取最優k值,在后面的學習中,我們會提到交叉驗證,現在僅做了解。

    4.2.3 算法實現

    說完了上面的理論知識,我們理所應當要會寫出代碼來了。我們采用的是如下API:

    sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5,algorithm = ‘auto’)

    n_neighbors:其可填一個int類型,表示默認查詢鄰居數

    algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}:除了auto之外,其余三個選項分別是用不同的數據結構來實現搜索鄰居的方式,而使用auto就可以讓傳遞給fit方法的值來決定最合適的算法。

    光說不練假把式,我們今天就先拿KNN開刀,用我們之前所學工具斬落這員大將。

    我們這里使用的是鳶尾花數據集,其詳細數據如下:

    iris_training.csv訓練數據集,120條樣本數據;iris_test.csv測試數據集,30條數據。本文只用到訓練數據集,其中有花萼長度(Sepal Length)、花萼寬度(Sepal Width)、花瓣長度(Petal Length)、花瓣寬度(Petal Width)四個屬性。標簽0、1、2分別表示山鳶尾(Setosa)、變色鳶尾(Versicolor)、維吉尼亞鳶尾(Virginical)。

    我們要做的步驟是:

    • 獲取數據集
    • 數據集劃分
    • 特征工程——標準化
    • 機器學習訓練——KNN預估器流程
    • 模型評估

    代碼實現如下:

    from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifierdef knn_iris():"""用KNN算法對鳶尾花進行分類"""# 1 導入數據集iris = load_iris()# 2 劃分數據集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3 特征工程:標準化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 實例化KNN算法預估器estimator = KNeighborsClassifier(n_neighbors=3)estimator.fit(x_train, y_train)# 5 模型評估# 方法1 直接比對真實值和預測值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接對比真實值和預測值:\n", y_test == y_predict)# 方法2 計算準確率score = estimator.score(x_test, y_test)print("準確率為:\n", score)# 調用方法 knn_iris()

    我們知道,KNN方法在確定分類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。KNN方法在類別決策時,只與極少量的相鄰樣本有關。由于KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對于類域的交叉或重疊較多的待分樣本集來說,KNN方法比其他方法更為適合。

    平時,KNN算法的精度常常不如一些先進的模型,但是我們比如現在拿到了一個學習任務,需要選擇一個學習器去解決問題,而且沒有任何對該問題的前車之鑒,那么有時候可能會無從下手。通常我們不需要一上來就用一個神經網絡或者強大的集成學習模型去做,而是可以用一用簡單的模型做一個試探,KNN就是一個非常好的試探。

    我們前面已經說過,KNN本質上屬于懶惰學習的代表,也就是說它根本就沒有用訓練數據去擬合一個什么模型,而是直接用k個近鄰的樣本點做了個投票就完成了分類任務,那么如果這樣一個懶惰模型在當前的問題上就已經能夠得到一個較高的精度,則我們可以認為當前的學習任務是比較簡單的,不同類別的樣本點在特征空間中的分布較為清晰,無需采用復雜模型。

    反之,若KNN得到的精度很低,則傳達給我們的信息是:該學習任務有點復雜。往往伴隨著的消息就是,當前問題中不同類別樣本點在特征空間中分布不是清晰,通常是非線性可分的,需要我們去調用更強大的學習器。

    雖然我們說在訓練模型,可實際上,KNN完全沒有真正意義上地訓練模型,而只是單純地分類罷了。

    總結

    以上是生活随笔為你收集整理的机器学习的练功方式(四)——KNN算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。