KNN算法中的K有多重要

2021-01-10 人工智慧遇見磐創

K-最近鄰(KNN)是一種有監督的機器學習算法,可用於解決分類和回歸問題。它基於一個非常簡單的想法,數據點的值由它周圍的數據點決定。考慮的數據點數量由k值確定。因此,k值是算法的核心。

KNN分類器根據多數表決原則確定數據點的類別。如果k設置為5,則檢查5個最近點的類別。也可以根據多數類進行回歸預測,同樣,KNN回歸取5個最近點的平均值。

在本文中,我們將研究k值對於分類任務的重要性。

使用Scikit learn的make_classification函數創建一個示例分類數據集。

import numpy as npimport pandas as pdfrom sklearn.datasets import make_classificationX, y = make_classification( n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_classes=2, class_sep=0.8)數據集包含屬於2個類的1000個樣本。還可以創建數據點的散點圖(即樣本)。

import matplotlib.pyplot as pltplt.figure(figsize=(12,8))plt.scatter(X[:,0], X[:,1], c=y)

選擇最優k值是建立一個合理、精確的knn模型的必要條件。

如果k值太低,則模型會變得過於具體,不能很好地泛化。它對噪音也很敏感。該模型在訓練組上實現了很高的精度,但對於新的、以前看不到的數據點,該模型的預測能力較差。因此,我們很可能最終得到一個過擬合的模型。如果k選擇得太大,模型就會變得過於泛化,無法準確預測訓練和測試集中的數據點。這種情況被稱為欠擬合。我們現在創建兩個不同的knn模型,k值為1和50。然後創建預測的散點圖,以查看差異。

第一步是將數據集拆分為測試子集。

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)第一個模型是k=1的knn模型。

from sklearn.neighbors import KNeighborsClassifierknn1 = KNeighborsClassifier(n_neighbors=1)knn1.fit(X_train, y_train)predict1 = knn1.predict(X_test)plt.figure(figsize=(12,8))plt.title("KNN with k=1", fontsize=16)plt.scatter(X_test[:,0], X_test[:,1], c=predict1)

只需將n_neighbors參數更改為50,就可以創建下一個模型。下面是這個模型在測試集上的預測。

你可以看到當k增加時,泛化是如何變化的。

我們需要的不是一個過於籠統或過於具體的模型。我們的目標是創建一個健壯和精確的模型。

過擬合模型(過於具體)對數據點值的細微變化很敏感。因此,在數據點發生微小變化後,預測可能會發生巨大變化。

欠擬合模型(過於通用)可能在訓練和測試子集上都表現不佳。

不幸的是,沒有一個找到最佳k值的解決方案。它取決於數據集的底層結構。然而,有一些工具可以幫助我們找到最佳k值。

GridSearchCV函數可用於創建、訓練和評估具有不同超參數值的模型。k是knn算法中最重要的超參數。

我們將創建一個GridSearchCV對象來評估k值從1到20的20個不同knn模型的性能。參數值作為字典傳遞給param_grid parameter。

from sklearn.model_selection import GridSearchCVknn = GridSearchCV( estimator = KNeighborsClassifier(), param_grid = {'n_neighbors': np.arange(1,21)}, scoring='neg_log_loss', cv = 5)你可以使用scikit learn的任何評分標準。我使用了log丟失,這是分類任務中常用的度量。

我們現在可以將數據集調整到GridSearchCV對象。不需要分割訓練和測試子集,因為應用了5倍交叉驗證。

knn.fit(X, y)我們得到每個k值的交叉驗證的平均測試分數。

scores = pd.Series(abs(knn.cv_results_['mean_test_score']))scores.index = np.arange(1,21)我更喜歡將結果保存在Pandas系列中,以便能夠輕鬆地繪製它們。畫出分數。

scores.plot(figsize=(12,8))plt.title("Log loss of knn with k vales from 1 to 20", fontsize=16)

在k值為10之後,測試集上的損失似乎沒有多少改善。

結論

knn算法是一種應用廣泛的算法。它簡單易懂。由於它不作任何假設,所以也可以用來解決非線性問題。

消極的一面是,由於模型需要存儲所有的數據點,因此隨著數據點數量的增加,knn算法變得非常緩慢。由於這個原因,它也不具有內存效率。

最後,它對離群值很敏感,因為離群值在決策中也有投票權。

感謝你的閱讀。

相關焦點

  • R語言實現K最近鄰算法(KNN)
    生活中我們發現既不脆也不甜的是蛋白質,脆而不甜的是蔬菜,而水果往往是甜的,有可能脆也有可能不脆。基於以上生活經驗(人以群分,物以類聚),那麼你知道西紅柿是水果還是蔬菜呢?首先我們來看下面一組數據。這裡其實是只選了一個最近的「鄰居」,即k=1,是一個1NN分類。如果我們使用k=3的KNN算法。那麼它會在三個最近鄰居即橙子、葡萄和堅果之間進行投票表決。因為這個裡面有兩票歸為水果(2/3的票數),所以西紅柿再次歸為水果。那麼k究竟選擇多少合適呢?顯然,最好的k值應該是兩個極端值之間的某個值。在實際中,k一般選擇樣本量的平方根。
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • R語言--鄰近算法KNN
    ❝KNN(k鄰近算法)是機器學習算法中常見的用於分類或回歸的算法。它簡單,訓練數據快,對數據分布沒有要求,使它成為機器學習中使用頻率較高的算法,並且,在深度學習大行其道的今天,傳統可解釋的簡單模型在工業大數據領域的應用更為廣泛。本文介紹KNN算法的基本原理和用R代碼實現。
  • 機器學習(二)-------KNN算法的sklearn KNN實踐
    前面說到過,通過調整 K 值,算法會有不同的效果。- weights(權重):最普遍的 KNN 算法無論距離如何,權重都一樣,但有時候我們想搞點特殊化,比如距離更近的點讓它更加重要。這時候就需要 weight 這個參數了,這個參數有三個可選參數的值,決定了如何分配權重。參數選項如下: • 'uniform':不管遠近權重都一樣,就是最普通的 KNN 算法的形式。
  • 機器學習:基於Knn算法的用戶屬性判斷方案設計
    本文作者通過Knn算法進行了一次用戶判斷預測的流程,文章為作者根據自身經驗所做出的總結,希望通過此文能夠加深你對Knn算法的認識。knn算法簡介K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。
  • 數據科學經典算法 KNN 已被嫌慢,ANN 比它快 380 倍
    解決方案 將最近鄰算法擴展至大規模數據的方法是徹底避開暴力距離計算,使用 ANN 算法。 近似最近距離算法(ANN) 嚴格地講,ANN 是一種在 NN 搜索過程中允許少量誤差的算法。但在實際的 C2C 市場中,真實的鄰居數量比被搜索的 K 近鄰數量要多。與暴力 KNN 相比,人工神經網絡可以在短時間內獲得卓越的準確性。
  • 機器學習算法推導&實現——k近鄰和kd樹實現
    KNN算法簡單、直觀,是最著名的「惰性學習」算法,不具有顯示的學習過程。K近鄰推導與kd樹過程我們可以用文字簡單描述下KNN算法:給定一個訓練數據集T,對於新的目標實例x,我們在訓練集T中找到與實例x最鄰近的k個實例,這k個實例大多屬於哪一類,目標實例x就被分為這個類。
  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。在這裡順便多說一句,我們之前學的用pandas進行數據分析在這裡也完全用的上。熟練使用pandas是用python進行數據分析和數據挖掘必須要過的坎,也是機器學習的基礎。在訓練模型之前,我們可以習慣性的查看一下各項數據的相關性。我們知道數據集中有32列,除了id和Diagnosis之外還有30個欄位。
  • 機器學習之KNN分類算法介紹: Stata和R同步實現(附數據和代碼)
    在Stata和R(knn3函數)中,默認的距離指歐式距離(Euclidean Distance,記為L2)。近年來計量經濟學也已經把KNN納入,當成一種非參估計的方法。KNN可看成一種基於實例的學習算法,通過局部近似及推遲所有計算到分類之後,故也被稱為「惰性學習算法」。KNN分類通過最近的k個近鄰樣本的類別,來推測目標樣本的類別。
  • kNN算法量化交易初試
    我們的任務是將沒有標籤的測試集數據貼上標籤,這個問題在kNN算法中的解決辦法就是在n維的特徵空間當中找出離要分類的測試集數據最近的k個有標籤的訓練集數據然後多數表決選擇k個最近的訓練集數據中的眾數作為的分類結果。舉個形象的慄子,當特徵空間是一個二維平面 (n=2) 時,kNN算法如下圖所示:
  • 實例最簡,帶你輕鬆進階機器學習K最近鄰算法
    前言K最近鄰(k-NearestNeighbor,K-NN)算法是一個有監督的機器學習算法,也被稱為K-NN算法,由Cover和Hart於1968年提出。可以用於解決分類問題和回歸問題。此外,作為一個理論上比較成熟的機器學習算法,關於K近鄰算法的介紹有很多,比如算法執行的步驟、應用領域等。
  • k-means聚類算法原理總結
    小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • 比KNN快380倍!我們有了新選擇
    如果數據中有1000項的話,要找到一個新產品中K=3的最近鄰,該算法就會把新產品與資料庫中其他產品一起執行1000次距離計算。這還不算太糟糕。但試想在現實中,顧客對顧客(C2C)的市場資料庫裡有著上百萬的產品,並且每天都可能會上傳新的產品。把新產品與所有數百萬的產品進行比對的做法確實太浪費時間了,也就是說根本無法拓展。
  • 教你學Python26-knn臨近算法
    KNN 概述k-近鄰(kNN, k-NearestNeighbor)算法是一種基本分類與回歸方法,我們這裡只討論分類問題中的 k-近鄰算法。一句話總結:近朱者赤近墨者黑!輸入沒有標籤的新數據後,將新的數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本最相似數據(最近鄰)的分類標籤。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大於20的整數。最後,選擇k個最相似數據中出現次數最多的分類,作為新數據的分類。k近鄰算法的輸入為實例的特徵向量,對應於特徵空間的點;輸出為實例的類別,可以取多類。
  • 分類算法之K近鄰算法(KNN)
    算法思路K最近鄰(k-Nearest Neighbor)算法是比較簡單的機器學習算法。它採用測量不同特徵值之間的距離方法進行分類。思路: 如果一個樣本在特徵空間中的k個最近鄰(最相似)的樣本中的大多數都屬於某一個類別,則該樣本也屬於這個類別。算法分析這裡我以javaml庫為例分析算法實現步驟。
  • k-means聚類算法從入門到精通
    小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • 圖像識別之KNN算法的理解與應用
    本文首先講解KNN算法的原理,接著講解Opencv中的KNN算法模塊,然後再使用Opencv中的KNN算法模塊對手寫數字圖像進行識別。KNN算法主要包含以下幾個要素:1. 訓練樣本。訓練樣本就是預先準備好的數據集,該數據集必須包含所有可能的數據類別,而且數據集中的每個數據都有一個唯一的標籤,用來標識該數據所屬的類別。
  • 數據驅動優化:如何利用 KNN 算法驅動產品優化?
    在網際網路行業中常常有利用數據分析或者數據挖掘的結論來應用到產品中,驅動產品的優化,提升產品的各項KPI 指標, 在數據挖掘和數據分析的背後會涉及到一些數據挖掘或者機器學習的算法。本文主要是knn算法原理的介紹,以及在它在網際網路行業中的具體應用,後續會介紹這個算法的具體實現(R 語言和python 語言)。
  • 【機器學習基礎】數學推導+純Python實現機器學習算法3:k近鄰
    ,k 近鄰在眾多有監督機器學習算法中算是一種比較獨特的方法。說它獨特,是因為 k 近鄰不像其他模型有損失函數、有優化算法、有訓練過程。對於給定的實例數據和實例數據對應所屬類別,當要對新的實例進行分類時,根據這個實例最近的 k 個實例所屬的類別來決定其屬於哪一類。所以相對於其它機器學習模型和算法,k 近鄰總體上而言是一種非常簡單的方法。
  • 人工智慧之K近鄰算法(KNN)
    前言:人工智慧機器學習有關算法內容,請參見公眾號「科技優化生活」之前相關文章。人工智慧之機器學習主要有三大類:1)分類;2)回歸;3)聚類。今天我們重點探討一下K近鄰(KNN)算法。^_^本文引用地址:http://www.eepw.com.cn/article/201806/381808.htm  K近鄰KNN(k-Nearest Neighbor)算法,也叫K最近鄰算法,1968年由 Cover 和 Hart 提出,是機器學習算法中比較成熟的算法之一。K近鄰算法使用的模型實際上對應於對特徵空間的劃分。