1. 程式人生 > >用Skiti-learn和pandas實現嶺迴歸

用Skiti-learn和pandas實現嶺迴歸

Ridge迴歸的損失函式:
J(θ)=1/2 (Xθ-Y)T (Xθ-Y) +1/2 α||θ||²2
對於演算法的實現,一般先確定模型,然後根據模型確定目標函式。而機器學習的實現基礎是資料,對資料的處理分析必不可少,演算法實現後還需對模型評估對比。
設定線性迴歸模型如下:
PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH

  1. 資料的讀取以及資料集的劃分
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)
  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_
  1. 選擇超引數,並研究超引數與迴歸係數θ的關係
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()