回歸模型 第5篇:knn回歸


基於最鄰近算法的分類,本質上是對離散的數據標簽進行預測,實際上,最鄰近算法也可以用於對連續的數據標簽進行預測,這種方法叫做基於最鄰近數據的回歸,預測的值(即數據的標簽)是連續值,通過計算數據點最臨近數據點平均值而獲得預測值。

一,sklearn的knn回歸

scikit-learn實現了兩個不同的最鄰近回歸模型:

  • KNeighborsRegressor:根據每個查詢點的最鄰近的k個數據點的均值作為預測值,其中,k是用戶指定的整數。
  • RadiusNeighborsRegressor:基於查詢點的固定半徑內的數據點的均值作為預測值,其中r是用戶指定的浮點值。

回歸模擬器的定義如下,該定義只列出最重要的參數,詳細參數請參考sicikit-learn 官網:

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.RadiusNeighborsRegressor(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)

參數注釋:

  • radius:尋找最鄰近數據點的半徑
  • n_neighbors:最鄰近的鄰居數量
  • algorithm:尋找最鄰近的數據點的算法,有效值是['auto','ball_tree','kd_tree','brute']
  • metric:計算距離的度量,詳細信息請查看:DistanceMetric 
  • weights:權重,默認值weights ='uniform',為每個鄰居分配統一的權重。 weights ='distance'分配的權重與距查詢點的距離成反比。用於也可以提供定義函數來計算權重。在某些情況下,最好對鄰居加權,以使較近的鄰居對擬合的貢獻更大,這可以通過weights關鍵字完成。

最基本的最鄰近回歸使用統一的權重,也就是說,在特定范圍中的每個數據點對查詢點的分類(回歸)的作用是相同的。在某些情況下,對權重點進行加權可能會比較有利,以使鄰近的點比遠離的點對回歸的貢獻更大,這可以通過weights關鍵字完成。默認值weights ='uniform',為所有點分配相等的權重。 weights ='distance'分配的權重與距查詢點的距離成反比。

二,基於最鄰近的數據點的數量來預測

當使用knn計算某個數據點的預測值時,模型會從訓練數據集中選擇離該數據點最近的k個數據點,並且把它們的y值取均值,把該均值作為新數據點的預測值:

from sklearn.neighbors import KNeighborsRegressor

對於knn分類,使用score方法評估模型,對於回歸的問題,返回的是R^2分數,R^2分數也叫做決定系數,是回歸模型預測的優度度量,位於0到1之間,R^2等於1對應完美預測,R^2等於0對應於常數模型,即總是預測訓練集響應(y_train)的均值。

from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split

kng=KNeighborsRegressor(n_neighbors=5)

x_data,y_data=make_regression(n_features=1,n_informative=1,noise=50,random_state=1)
x_train,x_test,y_train,y_test=train_test_split(x_data,y_data,random_state=1)

kng.fit(x_train,y_train)
prediction=kng.predict(x_test)

kng_test_score=kng.score(x_test,y_test)
kng_train_score=kng.score(x_train,y_train)
print('test data score:{:.2f}'.format(kng_test_score))

三,knn回歸模型的優缺點

knn回歸有兩個重要的參數:最鄰近數據點的數量k,數據點之間距離的度量方法。

在實踐中,通常使用較小的k值,在knn分類中通常把k值設置為奇數,便於找到多數鄰居的標簽。默認的距離度量是歐式距離,它在多數情況下的效果都很好,除此之外,還有曼哈頓距離等,詳細信息,請閱讀《Scipy 學習第3篇:數字向量的距離計算》。

在確定knn回歸或knn分類的k值時,可以通過折疊交叉驗證來尋找最佳的k值,示例代碼如下:

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV  #通過網絡方式來獲取參數

# 導入iris數據集
iris2=datasets.load_iris()
X2=iris2.data
y2=iris2.target
print(X2.shape,y2.shape)

# 設置需要搜索的K值,'n_neightbors'是sklearn中KNN的參數
parameters={'n_neightbors':[1,3,5,7,9,11,13,15]}
knn=KNeighborsClassifier()#注意:這里不用指定參數

# 通過GridSearchCV來搜索最好的K值。這個模塊的內部其實就是對每一個K值進行評估
clf=GridSearchCV(knn,parameters,cv=5)  #5折
clf.fit(X2,y2)

# 輸出最好的參數以及對應的准確率
print("最終最佳准確率:%.2f"%clf.best_score_,"最終的最佳K值",clf.best_params_)

knn回歸模型的優點之一是模型很容易理解,通常不需要過多的調參就可以得到不錯的性能,並且構建模型的速度通常很快。但是使用knn算法時,對數據進行預處理是很重要的,對特征很多的數據集、對於大多數特征值都為0的數據集,效果往往不是很好。

雖然k鄰近算法很容易理解,但是由於預測速度慢,且不能處理具有很多特征的數據集,所以,在實踐中往往不會用到。

 

 

參考文檔:

sklearn.neighbors.KNeighborsRegressor

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM