基於sklearn的嶺迴歸實現及效果分析
阿新 • • 發佈:2019-01-02
嶺迴歸也是一種用於迴歸的線性模型,預測公式與最小二乘法相同,但在嶺迴歸中,對係數w的選擇不僅要在訓練資料上得到好的預測結果,而且還要擬合附加約束。我們還希望係數儘量小。換句話說,w的所有元素都應接近於0.直觀上來看,這意味著每個特徵對輸出的影響儘可能小(即斜率很小),同時仍然給出很好的預測結果。這種約束就是所謂正則化的一個例子。正則化是指對模型做顯式約束,以避免過擬合。嶺迴歸用到的這種被稱為L2正則化。以下是嶺迴歸在波士頓房價資料集的效果:
#匯入相關包
from sklearn.linear_model import Ridge,LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import mglearn
# 匯入資料
X,y = mglearn.datasets.load_extended_boston()
# 劃分訓練集和測試集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
# 三個嶺迴歸和一個線性迴歸模型
ridge = Ridge().fit(X_train,y_train)
ridge10 = Ridge(alpha=10,).fit(X_train,y_train)
ridge01 = Ridge(alpha=0.1 ).fit(X_train,y_train)
lr = LinearRegression().fit(X_train,y_train)
# 列印ridge函式的資訊
print ("training set score:{:.2f}".format(ridge.score(X_train,y_train)))
print ("test set score:{:.2f}".format(ridge.score(X_test,y_test)))
# 繪製三個嶺迴歸和線性迴歸的準確率曲線
plt.figure(figsize = (7,7))
plt.plot(ridge.coef_,'s',label = "Ridge alpha=1" )
plt.plot(ridge10.coef_,'^',label = "Ridge alpha=10")
plt.plot(ridge01.coef_,'v',label = "Ridge alpha=0.1")
plt.plot(lr.coef_,'o',label = 'LinearRegression')
plt.xlabel('Coefficient indx')
plt.ylabel('Coefficient magnitude')
plt.hlines(0,0,len(lr.coef_))
plt.ylim(-25,25)
plt.legend()
plt.show()
# 繪製 嶺迴歸和特徵個數的關係圖
plt.figure()
mglearn.plots.plot_ridge_n_samples()
三個嶺迴歸和線性迴歸的準確率如下圖所示:
可以看到,時,特徵係數大多在-3到3之間,時,係數要稍大一點,對於,點的範圍更大,對於沒有做正則化的線性迴歸(),點的範圍更大。
如果固定,改變訓練資料量,則可得到學習曲線(將模型效能作為資料集大小的函式進行繪圖,這樣的影象叫做學習曲線)
上圖中,藍色線表示嶺迴歸,橙色線表示線性迴歸,實線表示測試集,虛線表示訓練集。
首先,可以看到無論是嶺迴歸和線性迴歸,所有資料集大小對應的訓練分數都要高於測試集。由於嶺迴歸採用正則化,所以訓練分數整體低於線性迴歸,但嶺迴歸的測試分數要高,特別是對於較小的資料集。如果少於400個數據點,線性迴歸學習不到任何內容。如果有足夠多的訓練資料,正則化變得不那麼重要,並且嶺迴歸和線性迴歸將具有相同的效能。還有一個現象,隨著資料的不斷增加,線性迴歸的訓練效能在下降,如果新增更多資料,模型將更加難以過擬合或記住所有資料。