用Skiti-learn和pandas實現嶺迴歸
阿新 • • 發佈:2018-11-12
Ridge迴歸的損失函式:
J(θ)=1/2 (Xθ-Y)T (Xθ-Y) +1/2 α||θ||²2
對於演算法的實現,一般先確定模型,然後根據模型確定目標函式。而機器學習的實現基礎是資料,對資料的處理分析必不可少,演算法實現後還需對模型評估對比。
設定線性迴歸模型如下:
PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH
- 資料的讀取以及資料集的劃分
import matplotlib.pyplot as plt %matplotlib inline import pandas as pd import numpy as np from sklearn import datasets,linear_model data=pd.read_csv('...\data.csv') X=data[['AT','V','AP','RH']] Y=data[['PE']] #劃分資料集 from sklearn.cross_validation import train_test_split X_train ,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
- 用skiti-learn執行Ridge迴歸
from sklearn.cross_model import Ridge
ridge=Ridge(alpha=1)
ridge.fit(X_train,y_train)
#超引數的設定對結果影響比較大,我們先設為1,觀察結果
print ridge.coef_
print ridge.intercept_
- 選擇超引數,並研究超引數與迴歸係數θ的關係
from sklearn.linear_model import RidgeCV ridgecv=RidgeCV(alphas=[0.01,0.1,0.5,1,3,5,7,10,20,100]) ridgecv.fit(X_train,y_train) ridgecv.alpha_ # 得到最優超引數
通過Ridge迴歸的損失函式表示式可以看到,超引數越大,那麼正則項懲罰的就越厲害,得到迴歸係數θ就越小,最終趨近與0。而如果超引數越小,即正則化項越小,那麼迴歸係數θ就越來越接近於普通的線性迴歸係數。
#研究超引數與迴歸係數θ的關係 X=1./(np.arange(1,11)+np.arrage(0,10)[:,np,newaxis]) y=np.ones(10) #說實話,矩陣很多東西我還不是很明白,X,y的構造不是很明白 n_alphas=200 #設定200個超引數 alphas=pd.logspace(-10,-2,n_alphas) #超引數在10的-10次方和10的-2次方中取值 clf= linear_model.Ridge(fit_intercept=False) coefs = [] for a in alphas: clf.set_params(alpha=a) clf.fit(X, y) coefs.append(clf.coef_) #用圖形標識 ax = plt.gca() ax.plot(alphas, coefs) ax.set_xscale('log') #翻轉x軸的大小方向,讓alpha從大到小顯示 ax.set_xlim(ax.get_xlim()[::-1]) plt.xlabel('alpha') plt.ylabel('weights') plt.title('Ridge coefficients as a function of the regularization') plt.axis('tight') #座標軸適應資料 plt.show()