天天看點

LASSO回歸LASSO回歸

LASSO回歸

添加l2正則的懲罰項,不管怎麼縮減,都會保留模組化時的所有變量,無法降低模型複雜度。

LASSO回歸,不重要的回歸系數縮減為0。

LASSO回歸模型的目标函數:

LASSO回歸LASSO回歸

使用坐标軸下降法:

疊代算法,坐标軸下降法是沿着坐标軸下降,梯度下降是沿着梯度的負方向下降,對于p維參數的可微凸函數J(B)而言,如果存在一點B,使得函數J(B)在每個坐标軸上均達到最小值,則J(B)就是B上的全局最小值。

坐标軸下降法,對目标函數中的某個Bi做偏導,即控制其他p-1個參數不變,沿着一個軸的方向求導,再對剩下的p-1個參數求導,令每個分量下的導函數為0,得到使目标函數達到全局最小值。

LASSO回歸LASSO回歸

其中ESS(B)代表誤差平方和,\lambdal(B)代表懲罰項,

LASSO回歸LASSO回歸

假設xij=hj(xi)

LASSO回歸LASSO回歸

LASSO回歸LASSO回歸
LASSO回歸LASSO回歸
LASSO回歸LASSO回歸

由于懲罰項是不可導函數,不能直接使用梯度方法,而使用次梯度方法,解決不可導凸函數的最小值。

對于某個分量Bj來說,懲罰項為\lambda|Bj|

次導函數為:

LASSO回歸LASSO回歸

為了求解最終的LASSO回歸函數,需要将ESS與l1的分量導函數相結合,令函數為0

LASSO回歸LASSO回歸

轉化為:

LASSO回歸LASSO回歸

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()
           
LASSO回歸LASSO回歸

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回歸模型

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))
           
LASSO回歸LASSO回歸

繼續閱讀