可能是關於 kNN 算法最詳細的入門總結

2021-02-19 高級農民工

【從零開始學機器學習第 10 篇】

摘要:機器學習最簡單算法——kNN 算法總結。

對於不少想學機器學習的初學者來說,可能聽到「機器學習」四個字就有點發怵,覺得難學門檻高,既要會編程數學還要好,那些科班出身的研究生才幹得了。

這話也對也不對,要說它對是因為要學的內容的確不少也不簡單,遠不像數據分析、爬蟲看著好學。其次,學習路徑一定程度地被魔化了:很多人說學機器學習要先去啃《西瓜書》、《統計學習方法》這些大篇幅的數學公式算法書,很容易讓新手放棄。

要說它不對也有道理。一是可能你並沒有真正想去學它,沒發現它有用或者至少有趣的地方;二是機器學習真的沒有那麼難入門,前提是找到合適自己的方法。所以想清楚為什麼學和從哪兒開始學很重要。

看了很多教程後,找到了合適自己的機器學習入門方法,也覺得適合很多人,接下來會一點點分享出來。

作為入門的第一課,kNN 算法是最好的選擇,因為它是機器學習中最簡單的算法,學會它幾乎沒有難度只需要會兩點:高中數學和一點 Python 編程基礎(遠沒有爬蟲那麼難)。

雖然是最簡單的算法,但我們還是花了大量篇幅(9 篇文章)來介紹它,為的是打好基礎,今天這一篇做個總結。

kNN 算法(K-Nearest Neighbor),也叫 K 近鄰算法,在具體介紹它之前,記住它的兩個特點。

它有什麼用途?主要有兩種。

一是可以解決分類問題,比如預測紅酒屬於哪一類,花屬於哪一種,是良性腫瘤還是惡性腫瘤等。除了二分類,它還可以解決多分類問題。

二是可以解決回歸問題,比如預測房價多少、學生成績多高等。

kNN 算法是少數能同時解決分類和回歸問題的算法,很實用。

它的算法思想和實現難麼?非常簡單。

kNN 算法思想可以用「近朱者赤近墨者黑」形容,誰離待預測值近,待預測值就屬於哪一類,就這麼簡單。判斷遠近可以用中學學過的歐拉距離公式計算。

知道特點後,我們通過一個酒吧猜酒的例子引入了 kNN算法:桌上倒的紅酒屬於兩類,需要根據它們的顏色深度、酒精濃度值去預測新倒的酒屬於哪一類:

【機器學習01】Python 手寫機器學習最簡單的 kNN 算法(可點擊)

具體如何預測呢?很簡單,只需要兩步:先把場景抽象為數學問題,然後將數學問題寫成 Python 代碼得到預測結果

抽象為數學問題就是把酒映射到坐標軸中,接著根據歐拉公式計算待預測酒(黃色點)同每杯樣本酒(紅綠色點)之間的距離,然後排序並取前 k 杯酒(k 個點),哪一類酒佔比多,則新倒的酒就歸屬哪一類。

理清數學思路後就可以手寫代碼,手寫代碼可以加深對算法的理解,同時也能搞懂 Sklearn 調包背後的真正含義。

在這第一篇文章中,我們就手寫了 kNN  算法,預測出新倒的酒(黃色點)屬於綠色的赤霞珠。

接下來為了作對比,我們又調用了 Sklearn 中的 kNN 算法包,僅 5 行代碼就得到了相同的結果。

初次接觸 sklearn 的話,可能並不清楚代碼背後的 fit、predict 做了什麼,於是我們仿寫了 Sklearn 的 kNN 算法包,加深了對 Sklearn 調包的理解:

【機器學習02】sklearn 中的 kNN 封裝算法實現

通過以上兩篇我們就初步學會了 kNN 算法。不過在對算法做預測時,使用了全部數據作為訓練集,這樣一來算法的預測準確率如何並不清楚。

所以我們做了改進,將數據集拆成一大一小兩部分,大的作為訓練集,小的作為測試集。在訓練集上訓練好 kNN 模型後,把測試集餵給它得到預測結果,接著和測試集本身的真實標籤值作比較,得到了模型的準確率。

這一過程用到了 sklearn 的 train_test_split 方法,最終將一份有 178 個樣本的葡萄酒數據集,按照 7:3 的比例隨機劃分出了 124 個訓練樣本和 54 個測試樣本。

【機器學習03】手寫 Sklearn 的 train_test_split 函數

具體如何計算模型的分類準確率呢?我們又用到了 sklearn 的 accuracy_score 方法,在葡萄酒數據集上達到了 76% 的準確率 。(54 個測試樣本中,預測對了 41 個)

【機器學習04】Sklearn 的 model.score 和 accuracy_score 函數

為了鞏固之前 4 節內容,我們又以兩個機器學習中常見的數據集為例:鳶尾花手寫數字識別,初步走了一遍 kNN 分類算法。

【機器學習05】kNN小結:解決鳶尾花和手寫數字識別分類

最後,模型在鳶尾花數據集上的準確率達到 97.8%(45 個花樣本僅預測錯 1 個),在手寫數字數據集上的預測準確率達到了 98.7%。這是在使用默認參數而未調參的情況下得到的結果,可見 kNN 算法雖簡單但效果很好。

不過,我們又發現存在一個問題:kNN 模型有很多參數(叫超參數),我們使用的都是默認參數,這樣建立得到的模型不一定是最好的,而我們期望找到最好的模型。

如何做到呢?這就需要調參,於是我們了解了 kNN 算法幾個重要的超參數,手動搭配組合之後找到了更好的模型,分類準確率進一步提升:

【機器學習06】調參——得到更好的 kNN 模型

但手動調整超參數很不方便,為此我們想到了 Sklearn 中專門實現調參功能的網格搜索方法(GridSearchCV),只需要指定超參數範圍,它就會運行所有超參數組合建立模型,最後返回其中效果最好的一組,這比我們自己手寫的方法方便地多。

【機器學習07】使用網格搜索(GridSearchCV)快速找到 kNN 模型最佳超參數

通過網格搜索我們進一步優化了 kNN 模型,這並沒有完,還有很重要的一點工作:對數據做歸一化處理。因為 kNN 模型跟樣本距離有密切關係,如果特徵之間的數量級相差很大的話,在計算距離時就容易產生偏差影響分類效果,所以最好建模前先去除數據量綱。

原始特徵最值歸一化後均值方差歸一化後

常用的數據歸一化方式有最值歸一化均值方差歸一化,詳細對比了兩種方法的特點,最終建議使用均值方差歸一化:

【機器學習08】數據歸一化 Feature Scaling

歸一化處理後,之前葡萄酒模型的分類準確率從最初的 0.76 飆升到了 0.96。(54 個測試樣本中,正確分類的樣本數從 41 個上升到 52 個),可見數據歸一化對 kNN 算法的重要性。

以上我們主要介紹的是 kNN 算法解決分類問題,它還可以解決回歸問題,方法大同小異。為了加深理解,我們以常見的回歸數據集波士頓房價為例,運用 kNN 回歸模型預測了房價,效果不錯。

【機器學習09】kNN 解決回歸問題:以波士頓房價為例

以上就是 kNN 算法的主要內容,最後總結一下 kNN 算法的特點:

優點:

缺點:

kNN 算法在計算樣本距離時,每個樣本都要遍歷計算一篇全部訓練樣本,當數據量很大時,會很耗時,雖然可以用 KD 樹、球樹等改進方法但效率依然不高。

kNN 算法預測結果依賴最近的 K 個點,一旦 K 個點之中有異常值,很可能會分類錯誤。

對於預測的結果,並不能解釋預測值為什麼屬於這個類別。不像線性回歸算法具有可解釋性。

隨著維度的增加,「看似相近」的兩個點,它們之間的距離會隨著特徵維數的增多而越來越大。比如有 2 個特徵的數據集,兩個點之間的距離是1.4,一旦特徵數量增大到 10000 維時,距離就變成了 100。

相信看完這十篇文章,應該就可以搞明白 kNN 算法了,也能看得懂李航《統計學習方法》第 3 章的 kNN 算法。

到這兒,你就邁出了機器學習的第一步。接下來一起學習第二個算法吧:線性回歸

最後以上所有文章代碼,可以在下方公眾號中回覆:knn 得到。

相關焦點

  • 機器學習:基於Knn算法的用戶屬性判斷方案設計
    本文作者通過Knn算法進行了一次用戶判斷預測的流程,文章為作者根據自身經驗所做出的總結,希望通過此文能夠加深你對Knn算法的認識。knn算法簡介K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。
  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。 = KNeighborsClassifier()knn.fit(X_train, y_train)y_ = knn.predict(X_test)score1_ = (y_ == y_test).mean()print('使用算法的默認參數獲得的正確率為: {:.3f}'.format(score1_))>>>使用算法的默認參數獲得的正確率為
  • KNN算法中的K有多重要
    K-最近鄰(KNN)是一種有監督的機器學習算法,可用於解決分類和回歸問題。它基於一個非常簡單的想法,數據點的值由它周圍的數據點決定。考慮的數據點數量由k值確定。因此,k值是算法的核心。KNN分類器根據多數表決原則確定數據點的類別。如果k設置為5,則檢查5個最近點的類別。也可以根據多數類進行回歸預測,同樣,KNN回歸取5個最近點的平均值。
  • 圖像識別之KNN算法的理解與應用
    KNN是最經典的機器學習算法之一。
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • 機器學習之KNN分類算法介紹: Stata和R同步實現(附數據和代碼)
    ,2前沿: 機器學習在金融和能源經濟領域的應用分類總結,3文本分析的步驟, 工具, 途徑和可視化如何做?4文本大數據分析在經濟學和金融學中的應用, 最全文獻綜述,5最全: 深度學習在經濟金融管理領域的應用現狀匯總與前沿瞻望, 中青年學者不能不關注!
  • KNN算法(三)-sklearn實現
    上篇講到KNN算法的實例。在python中sklearn庫可直接實現KNN算法。本篇介紹運用sklearn庫實現KNN算法。
  • R語言--鄰近算法KNN
    ❝KNN(k鄰近算法)是機器學習算法中常見的用於分類或回歸的算法。它簡單,訓練數據快,對數據分布沒有要求,使它成為機器學習中使用頻率較高的算法,並且,在深度學習大行其道的今天,傳統可解釋的簡單模型在工業大數據領域的應用更為廣泛。本文介紹KNN算法的基本原理和用R代碼實現。
  • 數據科學經典算法 KNN 已被嫌慢,ANN 比它快 380 倍
    在模式識別領域中,K - 近鄰算法(K-Nearest Neighbor, KNN)是一種用於分類和回歸的非參數統計方法。K - 近鄰算法非常簡單而有效,它的模型表示就是整個訓練數據集。就原理而言,對新數據點的預測結果是通過在整個訓練集上搜索與該數據點最相似的 K 個實例(近鄰)並且總結這 K 個實例的輸出變量而得出的。
  • 機器學習(二)-------KNN算法的sklearn KNN實踐
    一.Skelarn KNN參數概述要使用sklearnKNN算法進行分類,我們需要先了解sklearnKNN算法的一些基本參數,那麼這節就先介紹這些內容吧。前面說到過,通過調整 K 值,算法會有不同的效果。- weights(權重):最普遍的 KNN 算法無論距離如何,權重都一樣,但有時候我們想搞點特殊化,比如距離更近的點讓它更加重要。這時候就需要 weight 這個參數了,這個參數有三個可選參數的值,決定了如何分配權重。參數選項如下: • 'uniform':不管遠近權重都一樣,就是最普通的 KNN 算法的形式。
  • 圖像識別之KNN算法的理解與應用(2)
    在上一篇文章中,我們介紹了KNN算法的原理,並詳細闡述了使用Opencv的KNN算法模塊對手寫數字圖像進行識別,發現識別的準確率還是比較高的,達到
  • R語言實現K最近鄰算法(KNN)
    生活中我們發現既不脆也不甜的是蛋白質,脆而不甜的是蔬菜,而水果往往是甜的,有可能脆也有可能不脆。基於以上生活經驗(人以群分,物以類聚),那麼你知道西紅柿是水果還是蔬菜呢?首先我們來看下面一組數據。例如西紅柿和四季豆之間的距離為:d(西紅柿,四季豆)=√(6−3)2+(4−7)2=4.2d(西紅柿,四季豆)=(6−3)2+(4−7)2=4.2根據以上算法,我們分別計算了西紅柿和葡萄、四季豆、堅果、橙子之間的距離,分別是2.2、4.2、3.6、1.4。我們發現西紅柿和橙子之間的距離最短,那麼我們據此認為西紅柿是一種水果。
  • k-means聚類算法從入門到精通
    算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。若給定足夠的迭代次數,k-means算法就能收斂,但是有可能在局部最小值點收斂。k-means收斂局部極值的原因很可能是初始化簇類中心的距離很接近,而且算法的收斂時間也加長了,為了避免這一情況,多次運行k-means聚類算法,每次運行初始化不同的簇類中心。
  • k-means聚類算法原理總結
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理
  • kNN算法量化交易初試
    當然,二分類器的選擇是一個算法問題,kNN,Logistic Regression,GBDT,ect. 都能用上。不過應用於股票漲跌分類更需要解決的是特徵工程方面的問題,即找到真正對分類有意義的特徵,整個算法框架裡面最值錢的就是這個了。
  • 機器學習之KNN檢測惡意流量
    概念算法分類解決什麼問題分類算法是什麼回歸算法是多少聚類算法怎麼分數據降維怎麼壓強化學習怎麼做目的通過機器學習的方式識別惡意流量特徵工程使用sklearn的TFIDF、2ngram進行分詞什麼是TF-IDFTF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。
  • 有人斷言KNN面臨淘汰,更快更強的ANN將取而代之
    K - 近鄰算法非常簡單而有效,它的模型表示就是整個訓練數據集。就原理而言,對新數據點的預測結果是通過在整個訓練集上搜索與該數據點最相似的 K 個實例(近鄰)並且總結這 K 個實例的輸出變量而得出的。KNN 可能需要大量的內存或空間來存儲所有數據,並且使用距離或接近程度的度量方法可能會在維度非常高的情況下(有許多輸入變量)崩潰,這可能會對算法在你的問題上的性能產生負面影響。這就是所謂的維數災難。
  • 數據驅動優化:如何利用 KNN 算法驅動產品優化?
    本文主要是knn算法原理的介紹,以及在它在網際網路行業中的具體應用,後續會介紹這個算法的具體實現(R 語言和python 語言)。一、knn 算法原理:現在假如有一個樣本, 樣本中的每一個叫做個體, 我們已經知道這些個體所屬的類別,現在有一個新的未知類別的個體,我們可以通過計算它與樣本中所有個體的相似距離,然後找出與它具體最小的k個個體, 這k個個體最多的類別就是這個新的個體的預測的類別。
  • 教你學Python26-knn臨近算法
    KNN 概述k-近鄰(kNN, k-NearestNeighbor)算法是一種基本分類與回歸方法,我們這裡只討論分類問題中的 k-近鄰算法。一句話總結:近朱者赤近墨者黑!輸入沒有標籤的新數據後,將新的數據的每個特徵與樣本集中數據對應的特徵進行比較,然後算法提取樣本最相似數據(最近鄰)的分類標籤。一般來說,我們只選擇樣本數據集中前k個最相似的數據,這就是k-近鄰算法中k的出處,通常k是不大於20的整數。最後,選擇k個最相似數據中出現次數最多的分類,作為新數據的分類。k近鄰算法的輸入為實例的特徵向量,對應於特徵空間的點;輸出為實例的類別,可以取多類。
  • 5分鐘讀懂入門推薦算法庫:surprise
    在 surprise 中,所有的算法類都繼承於一個父類:algo_base(),這個類中抽象出來了一些子類都容易用到的方法,有的給出了具體的實現,有的只是抽象出了一個接口,如 fit() 方法,在 algo_base() 中和其子類 knn() 中都有定義。這裡幫助大家再進一步梳理算法類之間的關係。對 algo_base() 而言,其是一切 surprise 中的算法的父類。那麼