LASSO回歸
添加l2正則的懲罰項,不管怎麼縮減,都會保留模組化時的所有變量,無法降低模型複雜度。
LASSO回歸,不重要的回歸系數縮減為0。
LASSO回歸模型的目标函數:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmLxcjN4UjMykTM3ITOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
使用坐标軸下降法:
疊代算法,坐标軸下降法是沿着坐标軸下降,梯度下降是沿着梯度的負方向下降,對于p維參數的可微凸函數J(B)而言,如果存在一點B,使得函數J(B)在每個坐标軸上均達到最小值,則J(B)就是B上的全局最小值。
坐标軸下降法,對目标函數中的某個Bi做偏導,即控制其他p-1個參數不變,沿着一個軸的方向求導,再對剩下的p-1個參數求導,令每個分量下的導函數為0,得到使目标函數達到全局最小值。
其中ESS(B)代表誤差平方和,\lambdal(B)代表懲罰項,
假設xij=hj(xi)
令
由于懲罰項是不可導函數,不能直接使用梯度方法,而使用次梯度方法,解決不可導凸函數的最小值。
對于某個分量Bj來說,懲罰項為\lambda|Bj|
次導函數為:
為了求解最終的LASSO回歸函數,需要将ESS與l1的分量導函數相結合,令函數為0
轉化為:
1.可視化
標明懲罰系數\lambda的值
from sklearn.linear_model import Lasso,LassoCV
Lasso(alpha=1.0,fit_intercept,normalize,precompute,copy_X,max_iter,tol,
warm_start,positive,random_state,selection='cyclic')
#precompute:在模組化前通過計算Gram矩陣提升運算速度,預設False
#copy_X:複制自變量X的數值
#tol:模型收斂阙值
#warm_start:将前一次訓練結果作為下一次開始,預設false
#positive:回歸系數強制為正數
#selection:疊代時選擇的回歸系數
#random:随機更新回歸系數
#cyclic:更新基于上一次運算
lasso_coefficients=[]
for Lambda in Lambdas:
lasso = Lasso(alpha=Lambda,normalize=True,max_iter=10000)
lasso.fit(x_train,y_train)
lasso_coefficients.append(lasso.coef_)
plt.plot(Lambdas,lasso_coefficients)
plt.xscale('log')
plt.show()
2.交叉驗證
LassoCV(eps=0.001,n_alphas,alphas,fit_intercept,normalize,precompute,max_iter,
tol,copy_X,cv,verbose,n_jobs,positive,random_state,selection)
#eps:指定正則化路徑長度,預設0.001,指代lambda的最大值與最小值之商
#n_alphas:指定正則化lambda的個數,預設100個
#verbose:傳回日志
#n_jobs:使用并行處理
lasso_cv = LassoCV(alphas=Lambdas,normalize=True,cv=10,max_iter=10000)
lasso_cv.fit(x_train,y_train)
lasso_best_alpha = lasso_cv.alpha_
lasso_best_alpha
借助Lasso重構Lasso回歸模型
lasso = Lasso(alpha=lasso_best_alpha,normalize=True,max_iter=10000)
lasso.fit(x_train,y_train)
pd.Series(index=['Intercept']+x_train.columns.tolist(),
data=[lasso.intercept_]+lasso.coef_.tolist())
lasso_predict = lasso.predict(x_test)
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))