摘要:計算該距離有多種方法,其中最常見的方法是歐幾里德,曼哈頓用于連續和漢明距離用于分類。曼哈頓距離這是實際向量之間的距離,使用它們的絕對差值之和表示。
介紹
在我遇到的所有機器學習算法中,KNN是最容易上手的。盡管它很簡單,但事實上它其實在某些任務中非常有效(正如你將在本文中看到的那樣)。
甚至它可以做的更好?它可以用于分類和回歸問題!然而,它其實更擅長用于分類問題。我很少看到KNN在任何回歸任務上實現。我在這里的目的是說明并強調,當目標變量本質上是連續的時,KNN是如何有效的運作的。
在本文中,我們將首先了解KNN算法背后的思維,研究計算點與點之間距離的不同方法,然后最終在Big Mart Sales數據集上用Python實現該算法。讓我們動起來吧
1.用簡單的例子來理解KNN背后的邏輯讓我們從一個簡單的例子開始。請考慮下表 - 它包含10人的身高,年齡和體重(目標)值。如你所見,缺少ID11的重量值。我們需要根據他們的身高和年齡來預測這個人的體重。
注意:此表中的數據不代表實際值。它僅用作一個例子來解釋這個概念。
為了更清楚地了解這一點,下面是上表中高度與年齡的關系圖:
在上圖中,y軸表示人的身高(以英尺為單位),x軸表示年齡(以年為單位)。這些點是根據ID值進行編號。黃點(ID 11)是我們的測試點。
如果我要求你根據圖來確定ID11的重量,你的答案會是什么?你可能會說,因為ID11?更接近第?5點和第1點,所以它必須具有與這些ID類似的重量,可能在72-77千克之間(表中ID1和ID5的權重)。這實際上是有道理的,但你認為算法會如何預測這些值呢?讓我們在下邊進行試驗討論。
2. KNN算法是怎樣工作的如上所述,KNN可用于分類和回歸問題。該算法使用“?特征相似性?”來預測任何新數據點的值。這意味著新的點將根據其與訓練集中的點的接近程度而進行分配。從我們的例子中,我們知道ID11的高度和年齡類似于ID1和ID5,因此重量也大致相同。
如果這是一個分類問題,我們會采用該模式作為最終預測。在這種情況下,我們有兩個重量值--72和77.猜猜最終值是如何計算的?是取兩個重量的平均值來作為最終的預測值。
以下是該算法的逐步說明:
首先,計算新的點與每個訓練點之間的距離。
選擇最接近的k個數據點(基于距離)。在我們演示的例子中,如果k的值為3,則將選擇點1,5,6。我們將在本文后面進一步探索選擇正確的k值的方法。
這些數據點的平均值是新點的最終預測值。在這里,我們的ID11的重量為 =(77 + 72 + 60)/ 3 = 69.66千克。
在接下來的幾節中,我們將詳細討論這三個步驟中的每一個。
3.點與點之間距離的計算方法所述第一步驟是計算新點和每個訓練點之間的距離。計算該距離有多種方法,其中最常見的方法是 - 歐幾里德,曼哈頓(用于連續)和漢明距離(用于分類)。
歐幾里德距離:歐幾里德距離計算為新點(x)和現有點(y)之間的差的平方和的平方根。
曼哈頓距離:這是實際向量之間的距離,使用它們的絕對差值之和表示。
漢明距離:用于分類變量。如果值(x)和值(y)相同,則距離D將等于0。否則D = 1。
一旦一個新的觀測值與我們訓練集中的點之間的距離被測量出來,下一步就是要選擇最近的點。要考慮的點的數量由k的值定義。
4.如何選擇k因子第二個步驟是選擇k值。這決定了我們在為任何新的觀察值賦值時所要考慮到的鄰居的數量。
在我們的示例中,k值 = 3,最近的點是ID1,ID5和ID6。
ID11的重量預測將是:
ID11 =(77 + 72 + 60)/ 3?
ID11 = 69.66千克
如果k的值 = 5的話,那么距離最近的點將是ID1,ID4,ID5,ID6,ID10。
那么ID11的預測將是:
ID 11 =(77 + 59 + 72 + 60 + 58)/ 5?
ID 11 = 65.2千克
我們注意到,基于k值,最終結果將趨于變化。那我們怎樣才能找出k的最優值呢?讓我們根據我們的訓練集和驗證集的誤差計算來決定它(畢竟,最小化誤差是我們的最終目標!)。
請看下面的圖表,了解不同k值的訓練誤差和驗證誤差。
對于非常低的k值(假設k = 1),模型過度擬合訓練數據,這導致驗證集上的高錯誤率。另一方面,對于k的高值,該模型在訓練集和驗證集上都表現不佳。如果仔細觀察,驗證誤差曲線在k = 9的值處達到最小值。那么該k值就是是模型的最佳K值(對于不同的數據集,它將有所不同)。該曲線稱為“?肘形曲線?”(因為它具有類似肘部的形狀),通常用于確定k值。
你還可以使用網格搜索技術來查找最佳k值。我們將在下一節中實現這一點。
5.處理數據集(Python代碼)到目前為止,你應該清楚的了解這個算法。我們現在將繼續在數據集上實現該算法。我使用Big Mart銷售數據集來進行代碼實現,你可以從此鏈接下載它,邀請碼為b543。
1.閱讀文件
import pandas as pd
df = pd.read_csv("train.csv")
df.head()
2.計算缺失值
df.isnull().sum()
輸入Item_weight和Outlet_size中缺少的值mean = df["Item_Weight"].mean() #imputing item_weight with mean
df["Item_Weight"].fillna(mean, inplace =True)
mode = df["Outlet_Size"].mode() #imputing outlet size with mode
df["Outlet_Size"].fillna(mode[0], inplace =True)
3.處理分類變量并刪除id列
df.drop(["Item_Identifier", "Outlet_Identifier"], axis=1, inplace=True)
df = pd.get_dummies(df)
4.創建訓練集和測試集
from sklearn.model_selection import train_test_split
train , test = train_test_split(df, test_size = 0.3)
x_train = train.drop("Item_Outlet_Sales", axis=1)
y_train = train["Item_Outlet_Sales"]
x_test = test.drop("Item_Outlet_Sales", axis = 1)
y_test = test["Item_Outlet_Sales"]
5.預處理 - 擴展功能
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
x_train_scaled = scaler.fit_transform(x_train)
x_train = pd.DataFrame(x_train_scaled)
x_test_scaled = scaler.fit_transform(x_test)
x_test = pd.DataFrame(x_test_scaled)
6.查看不同K值的錯誤率
導入所需要的包from sklearn import neighbors
from sklearn.metrics import mean_squared_error?
from math import sqrt
import matplotlib.pyplot as plt
%matplotlib inline
rmse_val = [] #存儲不同K值的RMSE值
for K in range(20):
K = K+1
model = neighbors.KNeighborsRegressor(n_neighbors = K)
model.fit(x_train, y_train) #合適的模型
pred=model.predict(x_test) #對測試集進行測試
error = sqrt(mean_squared_error(y_test,pred)) #計算RMSE值
rmse_val.append(error) #存儲RMSE值
print("RMSE value for k= " , K , "is:", error)
輸出:
RMSE value for k = 1 is: 1579.8352322344945
RMSE value for k = 2 is: 1362.7748806138618
RMSE value for k = 3 is: 1278.868577489459
RMSE value for k = 4 is: 1249.338516122638
RMSE value for k = 5 is: 1235.4514224035129
RMSE value for k = 6 is: 1233.2711649472913
RMSE value for k = 7 is: 1219.0633086651026
RMSE value for k = 8 is: 1222.244674933665
RMSE value for k = 9 is: 1219.5895059285074
RMSE value for k = 10 is: 1225.106137547365
RMSE value for k = 11 is: 1229.540283771085
RMSE value for k = 12 is: 1239.1504407152086
RMSE value for k = 13 is: 1242.3726040709887
RMSE value for k = 14 is: 1251.505810196545
RMSE value for k = 15 is: 1253.190119191363
RMSE value for k = 16 is: 1258.802262564038
RMSE value for k = 17 is: 1260.884931441893
RMSE value for k = 18 is: 1265.5133661294733
RMSE value for k = 19 is: 1269.619416217394
RMSE value for k = 20 is: 1272.10881411344
curve = pd.DataFrame(rmse_val) #elbow curve?
curve.plot()
正如我們所討論的,當我們取k = 1時,我們得到一個非常高的RMSE值。隨著我們增加k值,RMSE值不斷減小。在k = 7時,RMSE約為1219.06,并且隨著K值在進一步增加,RMSE值會迅速上升。我們可以有把握地說,在這種情況下,k = 7會給我們帶來最好的結果。
這些是使用我們的訓練數據集進行的預測。現在讓我們預測測試數據集的值并進行提交。
7.對測試數據集的預測
閱讀測試和提交文件test = pd.read_csv("test.csv")
submission = pd.read_csv("SampleSubmission.csv")
submission["Item_Identifier"] = test["Item_Identifier"]
submission["Outlet_Identifier"] = test["Outlet_Identifier"]
test.drop(["Item_Identifier", "Outlet_Identifier"], axis=1, inplace=True)
test["Item_Weight"].fillna(mean, inplace =True)
test = pd.get_dummies(test)
test_scaled = scaler.fit_transform(test)
test = pd.DataFrame(test_scaled)
predict = model.predict(test)
submission["Item_Outlet_Sales"] = predict
submission.to_csv("submit_file.csv",index=False)
在提交此文件后,我得到的RMSE為1279.5159651297。
8.實現GridsearchCV
為了確定k的值,每次繪制肘部曲線是一個繁瑣且繁瑣的過程。你只需使用gridsearch即可簡單的找到最佳值。
from sklearn.model_selection import GridSearchCV
params = {"n_neighbors":[2,3,4,5,6,7,8,9]}
knn = neighbors.KNeighborsRegressor()
model = GridSearchCV(knn, params, cv=5)
model.fit(x_train,y_train)
model.best_params_
輸出:
{"n_neighbors": 7}
6.結束語和其他資源在本文中,我們介紹了KNN算法的工作原理及其在Python中的實現。它是最基本但最有效的機器學習技術之一。并且在本文中,我們是直接調用了Sklearn庫中的KNN模型,如果你想更仔細的研究一下KNN的話,我建議你可以手敲一下有關KNN的源代碼。
本文作者介紹了如何使用KNN算法去進行完成回歸任務,大家如果感興趣的話,可以跟著本文敲一遍代碼,進行練習,畢竟看10篇文章也不如去敲一遍代碼,畢竟看文章看看也就過去了,如果敲一遍代碼的話,就會加深自己的印象,如果想深入的去了解KNN算法的話,可以自己去研究一下KNN的源代碼,然后敲一遍,我們后邊也會放出有關KNN源代碼的文章,當然其他算法的文章我們也會發布,請大家到時候多多捧場。
A Practical Introduction to K-Nearest Neighbors Algorithm for Regression (with Python code)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43772.html
摘要:是一種非參數的懶惰的監督學習算法非參數的意思是,模型不會對基礎數據分布做出任何假設。電腦端查看源碼參考資料網址是一個支持的人工智能建模平臺,能幫助你快速開發訓練并部署應用。 KNN 是一種非參數的懶惰的監督學習算法. 非參數的意思是,模型不會對基礎數據分布做出任何假設。換句話說,模型的結構是根據數據確定的。懶惰的意思是沒有或者只有很少的訓練過程. KNN 算法既可以處理分類問題,測試數...
摘要:機器學習算法類型從廣義上講,有種類型的機器學習算法。強化學習的例子馬爾可夫決策過程常用機器學習算法列表以下是常用機器學習算法的列表。我提供了對各種機器學習算法的高級理解以及運行它們的代碼。決策樹是一種監督學習算法,主要用于分類問題。 showImg(https://segmentfault.com/img/remote/1460000019086462); 介紹 谷歌的自動駕駛汽車和機...
閱讀 2787·2021-11-17 09:33
閱讀 2169·2021-09-03 10:40
閱讀 522·2019-08-29 18:45
閱讀 2956·2019-08-29 16:21
閱讀 613·2019-08-29 11:11
閱讀 3394·2019-08-26 12:00
閱讀 2947·2019-08-23 18:19
閱讀 1094·2019-08-23 12:18