由於計算一般線性回歸的時候,其計算方法是: 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…相對於線性回歸以及嶺回歸來說,還行。
希望大家給予意見和建議。謝謝。