線性回歸模型的短板
當自變量個數多於樣本量或自變量間存在多重共線性時,將無法根據公式計算回歸系數的估計值。
嶺回歸模型
為了解決多元線性模型中回歸參數β存在的不可逆問題,統計學家提出了嶺回歸模型。
該模型解決問題的思路是在線性模型的目標函數之上添加L2正則項(也稱為懲罰項)。
λ值的確定--交叉驗證法
'''
交叉驗證的基本思想是將原始數據進行分組,一部分做為訓練集,另一部分做為驗證集。
首先用訓練集對分類器進行訓練,再利用驗證集來測試訓練得到的模型,以此來做為評價分類器的性能指標。
多重交叉驗證目的是為了讓所有的數據都參與模型的構造和模型的驗證,從而得到最優的模型。
'''
# 使用方法
RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False,
scoring=None, cv=None)
alphas:⽤於指定多個lambda值的元組或數組對象,默認該參數包含0.1、1和10三種值。
fit_intercept:bool類型參數,是否需要擬合截距項,默認為True。
normalize:bool類型參數,建模時是否需要對數據集做標准化處理,默認為False。
scoring:指定⽤於評估模型的度量⽅法。
cv:指定交叉驗證的重數。
嶺回歸模型應⽤
尋找最佳的Lambda值
# 導入第三方模塊
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge,RidgeCV
import matplotlib.pyplot as plt
# 讀取數據集
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 = np.logspace(-5, 2, 200)
# 嶺回歸模型的交叉驗證
# 設置交叉驗證的參數,對於每一個Lambda值,都執行10重交叉驗證
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error', cv = 10)
# 模型擬合
ridge_cv.fit(X_train, y_train)
# 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_
ridge_best_Lambda
基於最佳的Lambda值建模
# 導入第三方包中的函數
from sklearn.metrics import mean_squared_error
# 基於最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True)
ridge.fit(X_train, y_train)
# 返回嶺回歸系數
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist())
# 預測
ridge_predict = ridge.predict(X_test)
# 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict))
RMSE # 越小越好
Lasso回歸模型
嶺回歸模型解決線性回歸模型中回歸參數β不可逆的辦法是添加L2懲罰項,
但缺陷在於始終保留建模時的所有變量,無法降低模型的復雜度。
對於此,Lasso回歸采用了L1正則的懲罰項。
LASSO回歸模型的交叉驗證
LassoCV(alphas=None, fit_intercept=True, normalize=False,max_iter=1000, tol=0.0001)
alphas:指定具體的Lambda值列表⽤於模型的運算
fit_intercept:bool類型參數,是否需要擬合截距項,默認為True
normalize:bool類型參數,建模時是否需要對數據集做標准化處理,默認為False
max_iter:指定模型最⼤的迭代次數,默認為1000次
Lasso回歸模型應用
# 導入第三方模塊中的函數
from sklearn.linear_model import Lasso,LassoCV
# 構造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)
# 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_
# 基於最佳的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)
# 預測效果驗證
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))
RMSE