![]() 介紹在我遇到的所有機器學(xué)習(xí)算法中,KNN是最容易上手的。盡管它很簡單,但事實上它其實在某些任務(wù)中非常有效(正如你將在本文中看到的那樣)。 甚至它可以做的更好?它可以用于分類和回歸問題!然而,它其實更擅長用于分類問題。我很少看到KNN在任何回歸任務(wù)上實現(xiàn)。我在這里的目的是說明并強調(diào),當(dāng)目標(biāo)變量本質(zhì)上是連續(xù)的時,KNN是如何有效的運作的。 ![]() 在本文中,我們將首先了解KNN算法背后的思維,研究計算點與點之間距離的不同方法,然后最終在Big Mart Sales數(shù)據(jù)集上用Python實現(xiàn)該算法。讓我們動起來吧 1.用簡單的例子來理解KNN背后的邏輯讓我們從一個簡單的例子開始。請考慮下表 - 它包含10人的身高,年齡和體重(目標(biāo))值。如你所見,缺少ID11的重量值。我們需要根據(jù)他們的身高和年齡來預(yù)測這個人的體重。 注意:此表中的數(shù)據(jù)不代表實際值。它僅用作一個例子來解釋這個概念。 ![]() 為了更清楚地了解這一點,下面是上表中高度與年齡的關(guān)系圖: ![]() 在上圖中,y軸表示人的身高(以英尺為單位),x軸表示年齡(以年為單位)。這些點是根據(jù)ID值進行編號。黃點(ID 11)是我們的測試點。 如果我要求你根據(jù)圖來確定ID11的重量,你的答案會是什么?你可能會說,因為ID11 更接近第 5點和第1點,所以它必須具有與這些ID類似的重量,可能在72-77千克之間(表中ID1和ID5的權(quán)重)。這實際上是有道理的,但你認(rèn)為算法會如何預(yù)測這些值呢?讓我們在下邊進行試驗討論。 2. KNN算法是怎樣工作的如上所述,KNN可用于分類和回歸問題。該算法使用“ 特征相似性 ”來預(yù)測任何新數(shù)據(jù)點的值。這意味著新的點將根據(jù)其與訓(xùn)練集中的點的接近程度而進行分配。從我們的例子中,我們知道ID11的高度和年齡類似于ID1和ID5,因此重量也大致相同。 如果這是一個分類問題,我們會采用該模式作為最終預(yù)測。在這種情況下,我們有兩個重量值--72和77.猜猜最終值是如何計算的?是取兩個重量的平均值來作為最終的預(yù)測值。 以下是該算法的逐步說明:
![]()
![]()
在接下來的幾節(jié)中,我們將詳細(xì)討論這三個步驟中的每一個。 3.點與點之間距離的計算方法所述第一步驟是計算新點和每個訓(xùn)練點之間的距離。計算該距離有多種方法,其中最常見的方法是 - 歐幾里德,曼哈頓(用于連續(xù))和漢明距離(用于分類)。
![]()
![]() 一旦一個新的觀測值與我們訓(xùn)練集中的點之間的距離被測量出來,下一步就是要選擇最近的點。要考慮的點的數(shù)量由k的值定義。 4.如何選擇k因子第二個步驟是選擇k值。這決定了我們在為任何新的觀察值賦值時所要考慮到的鄰居的數(shù)量。 在我們的示例中,k值 = 3,最近的點是ID1,ID5和ID6。 ![]() ![]() ID11的重量預(yù)測將是: ID11 =(77 + 72 + 60)/ 3 如果k的值 = 5的話,那么距離最近的點將是ID1,ID4,ID5,ID6,ID10。 ![]() ![]() 那么ID11的預(yù)測將是: ID 11 =(77 + 59 + 72 + 60 + 58)/ 5 我們注意到,基于k值,最終結(jié)果將趨于變化。那我們怎樣才能找出k的最優(yōu)值呢?讓我們根據(jù)我們的訓(xùn)練集和驗證集的誤差計算來決定它(畢竟,最小化誤差是我們的最終目標(biāo)?。?。 請看下面的圖表,了解不同k值的訓(xùn)練誤差和驗證誤差。 ![]() ![]() 對于非常低的k值(假設(shè)k = 1),模型過度擬合訓(xùn)練數(shù)據(jù),這導(dǎo)致驗證集上的高錯誤率。另一方面,對于k的高值,該模型在訓(xùn)練集和驗證集上都表現(xiàn)不佳。如果仔細(xì)觀察,驗證誤差曲線在k = 9的值處達(dá)到最小值。那么該k值就是是模型的最佳K值(對于不同的數(shù)據(jù)集,它將有所不同)。該曲線稱為“ 肘形曲線 ”(因為它具有類似肘部的形狀),通常用于確定k值。 你還可以使用網(wǎng)格搜索技術(shù)來查找最佳k值。我們將在下一節(jié)中實現(xiàn)這一點。 5.處理數(shù)據(jù)集(Python代碼)到目前為止,你應(yīng)該清楚的了解這個算法。我們現(xiàn)在將繼續(xù)在數(shù)據(jù)集上實現(xiàn)該算法。我使用Big Mart銷售數(shù)據(jù)集來進行代碼實現(xiàn),你可以從此鏈接下載它,邀請碼為b543。 1.閱讀文件 import pandas as pd 2.計算缺失值 df.isnull().sum() 3.處理分類變量并刪除id列 df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1, inplace=True) 4.創(chuàng)建訓(xùn)練集和測試集 from sklearn.model_selection import train_test_split 5.預(yù)處理 - 擴展功能 from sklearn.preprocessing import MinMaxScaler 6.查看不同K值的錯誤率 #導(dǎo)入所需要的包 輸出: RMSE value for k = 1 is: 1579.8352322344945 #根據(jù)K值繪制RMSE值 ![]() 正如我們所討論的,當(dāng)我們?nèi) = 1時,我們得到一個非常高的RMSE值。隨著我們增加k值,RMSE值不斷減小。在k = 7時,RMSE約為1219.06,并且隨著K值在進一步增加,RMSE值會迅速上升。我們可以有把握地說,在這種情況下,k = 7會給我們帶來最好的結(jié)果。 這些是使用我們的訓(xùn)練數(shù)據(jù)集進行的預(yù)測?,F(xiàn)在讓我們預(yù)測測試數(shù)據(jù)集的值并進行提交。 7.對測試數(shù)據(jù)集的預(yù)測 #閱讀測試和提交文件 在提交此文件后,我得到的RMSE為1279.5159651297。 8.實現(xiàn)GridsearchCV 為了確定k的值,每次繪制肘部曲線是一個繁瑣且繁瑣的過程。你只需使用gridsearch即可簡單的找到最佳值。 from sklearn.model_selection import GridSearchCV 輸出: {'n_neighbors': 7} 6.結(jié)束語和其他資源在本文中,我們介紹了KNN算法的工作原理及其在Python中的實現(xiàn)。它是最基本但最有效的機器學(xué)習(xí)技術(shù)之一。并且在本文中,我們是直接調(diào)用了Sklearn庫中的KNN模型,如果你想更仔細(xì)的研究一下KNN的話,我建議你可以手敲一下有關(guān)KNN的源代碼。 本文作者介紹了如何使用KNN算法去進行完成回歸任務(wù),大家如果感興趣的話,可以跟著本文敲一遍代碼,進行練習(xí),畢竟看10篇文章也不如去敲一遍代碼,畢竟看文章看看也就過去了,如果敲一遍代碼的話,就會加深自己的印象,如果想深入的去了解KNN算法的話,可以自己去研究一下KNN的源代碼,然后敲一遍,我們后邊也會放出有關(guān)KNN源代碼的文章,當(dāng)然其他算法的文章我們也會發(fā)布,請大家到時候多多捧場。 A Practical Introduction to K-Nearest Neighbors Algorithm for Regression (with Python code) |
|
|