【火爐煉AI】機器學習031-KNN迴歸器模型的構建
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
在上一篇文章中我們學習了構建KNN分類器模型,但是KNN不僅可以用於分類問題,還可以用於迴歸問題,本章我們來學習KNN迴歸模型的構建和訓練。
1. 準備資料集
此處我們使用隨機函式構建了序列型資料集,其產生方式是用函式np.sinc()來產生y值。
# 準備資料集,此處用隨機的方式生成一些樣本資料
amplitute=10
num_points=100
dataset_X=amplitute*np.random.rand(num_points,1)-0.5*amplitute
dataset_y=np.sinc(dataset_X).ravel()
dataset_y+=0.2*(0.5-np.random.rand(dataset_y.size))
print(dataset_X.shape)
print(dataset_y.shape)
複製程式碼
用plt將該資料集繪製到圖表中,可以看到如下結果。
2. KNN迴歸模型的構建和訓練
構建和訓練KNN迴歸器與KNN分類器一樣簡單,如下程式碼。
# 構建KNN迴歸模型
from sklearn.neighbors import KNeighborsRegressor
K=8
KNN_regressor=KNeighborsRegressor(K,weights='distance')
KNN_regressor.fit(dataset_X,dataset_y)
複製程式碼
雖然此處構建了KNN迴歸器並對該回歸器進行了訓練,可是怎麼知道訓練結果了?
如下我定義了一個繪圖函式,可以用散點圖的方式來繪製原始的資料集和預測之後的資料集
# 將回歸器繪製到圖中
def plot_regressor(regressor, X, y):
# 將資料集繪製到圖表中看看分佈情況
plt.scatter(X,y,color='k',marker='o',label='dataset')
predicted=regressor.predict(X)
plt.scatter(dataset_X,predicted,color='blue',marker='*',label='predicted')
plt.xlim(X.min() - 1, X.max() + 1)
plt.ylim(y.min() - 0.2, y.max() + 0.2)
plt.legend()
plt.show()
複製程式碼
在本資料集上的表現可以從下圖中看出:
上面可以看出該KNN迴歸器在訓練集上的表現貌似還不錯,那麼怎麼用該訓練完成的KNN迴歸器來預測新資料集了?如下我們先構建一序列新樣本資料,然後將該樣本資料繪製到圖中,看看其分佈是否符合原來的分佈特性。
# 下面用本KNN迴歸器來預測新樣本資料,如下
# 構建了10倍的新資料,並且建立第二個軸,用於KNNregressor.predict
new_samples=np.linspace(-0.5*amplitute, 0.5*amplitute, 10*num_points)[:, np.newaxis]
new_predicted=KNN_regressor.predict(new_samples)
# 把原始資料也畫上來
plt.scatter(dataset_X,dataset_y,color='k',marker='o',label='dataset')
plt.plot(new_samples,new_predicted,color='r',linestyle='-',
label='new_samples')
plt.legend()
複製程式碼
得到的結果圖貌似有非常嚴重的過擬合,如下圖:
########################小**********結###############################
1,KNN迴歸器的構建,訓練,預測和KNN分類器基本一致。
2,我在使用KNN迴歸器對訓練集進行預測,得到的預測值竟然和訓練集中的Y值完全一致,一模一樣,我反覆檢查了好多遍,還是這個結果,剛開始以為是K值太小導致過擬合,但是修改K後仍然有這種情況,這個現象不知道其他人遇到沒有,我找了好久都沒找到原因所在。
#################################################################
注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯