嶺回歸與Lasso回歸模型


 

由於計算一般線性回歸的時候,其計算方法是: p = (X’* X)**(-1) * X’ * y 很多時候 矩陣(X’* X)是不可逆的,所以回歸系數p也就無法求解,
需要轉換思路和方法求解:加2范數的最小二乘擬合(嶺回歸)

嶺回歸模型的系數表達式: p = (X’ * X )**(-1) *X’ *y

如何實現嶺回歸:

from sklearn.linear_model import Ridge,RidgeCV

 


Ridge用於構建嶺回歸模型、RidgeCV用於交叉驗證求解Ridge回歸模型的最佳參數。

嶺回歸解決了線性回歸中矩陣X’X不可逆的問題,即添加l2正則的懲罰項,就是第2范數,最終導致模型回歸系數的縮減,會保留所有變量,無法降低模型的復雜度。
為此:引入了Lasso回歸;
目標函數: 

J§ = ((y-Xp)**2).sum() + lambda ||p||1 = ((y-Xp)**2).sum() + (lambda*abs§).sum()

 


lambda為懲罰項系數 ; ||p||1 表示所有回歸系數絕對值的和。
實現Lasso:

from sklearn.linear_model import Lasso,LassoCV

 


LassoCV用於實現Lasso的交叉驗證,通常用於求解最佳參數。Lasso用於構建Lasso回歸模型。
Lasso回歸與嶺回歸都是用於回歸預測問題:

Lasso回歸的簡單應用:

數據集:糖尿病數據集,1個因變量、10個自變量;因變量含義:糖尿病指數,值越小說明糖尿病的治療效果越好。

from sklearn.linear_model import Lasso,LassoCV
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import model_selection

 

讀取數據:

# 讀取糖尿病數據集
diabetes = pd.read_excel(r'diabetes.xlsx', sep = '')
# 構造自變量(剔除患者性別、年齡和因變量)
predictors = diabetes.columns[2:-1]
# 將數據集拆分為訓練集和測試集
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'], test_size = 0.2, random_state = 1234 )

 

尋找最佳lambda值所在的大概范圍(如何都不合適則需要重新定義Lambdas):

# 構造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)
# 構造空列表,用於存儲模型的偏回歸系數
lasso_cofficients = []

for Lambda in Lambdas:
    lasso = Lasso(alpha = Lambda, normalize=True, max_iter=10000)
    lasso.fit(X_train, y_train)
    lasso_cofficients.append(lasso.coef_)
    
# 繪制Lambda與回歸系數的關系
plt.plot(Lambdas, lasso_cofficients)

# 對x軸作對數變換
plt.xscale('log')
# 設置折線圖x軸和y軸標簽
plt.xlabel('Lambda')
plt.ylabel('Cofficients')

# 顯示圖形
plt.show()

 

基於交叉驗證找出最佳lambda值:

# LASSO回歸模型的交叉驗證
lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000)
lasso_cv.fit(X_train, y_train)

# 輸出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_
lasso_best_alpha

 

基於最佳參數進行建模:

from sklearn.metrics import mean_squared_error
# 基於最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000)
lasso.fit(X_train, y_train)

# 返回LASSO回歸的系數
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist())

 

使用模型進行預測:

# 預測
lasso_predict = lasso.predict(X_test)
print(lasso_predict)
# 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))
RMSE

 

RMSE得到是:53.0487…
我使用線性回歸得到是53.4…,嶺回歸的是,53.12…相對於線性回歸以及嶺回歸來說,還行。
希望大家給予意見和建議。謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM