【scikit-learn基礎】--『監督學習』之 嶺迴歸

wang_yb發表於2023-12-26

嶺迴歸(Ridge Regression)是一種用於處理共線性資料的線性迴歸改進方法。
和上一篇用基於最小二乘法的線性迴歸相比,它透過放棄最小二乘的無偏性,
以損失部分資訊、降低精度為代價來獲得更實際和可靠性更強的迴歸係數。

1. 概述

嶺迴歸的模型對於存在大量相關特徵(這些特徵之間存在很高的相關性)的資料時效果遠好於基於最小二乘法的線性模型。

原因就是它透過給係數的大小增加一個約束條件(即L2正則化項),來防止模型過度擬合訓練資料。
損失函式一般定義為:\(L(w) = (y-wX)^2+\lambda\parallel w\parallel_2\)
其中 \(\lambda\parallel w\parallel_2 = \lambda\sum_{i=1}^{n}w_i^2\),也就是 L2正則化項

模型訓練的過程就是尋找讓損失函式\(L(w)\)最小的引數\(w\)
也就等價於:\(\begin{align} & arg\ min(y-wX)^2 \\ & s.t. \sum w_{ij}^2 < s \end{align}\)
這兩個公式表示,在滿足約束條件 \(\sum w_{ij}^2 < s\)的情況下,計算 \((y-wX)^2\)的最小值。

2. 建立樣本資料

嶺迴歸適用於特徵之間有很高關聯性的資料集。
所以用scikit-learn中的加州住房資料集,這個資料集有8個房屋售價相關的屬性,屬性之間關聯性高。
資料集的檔案獲取可以參考:TODO

從上面的文章中下載資料集(是一個zip壓縮檔案),
如下例所示,下載之後在 D:\share\data 中解壓,就可以載入了。

import os
from sklearn.datasets import fetch_california_housing

home_dir = "D:\share\data"
data = fetch_california_housing(data_home=os.path.join(home_dir, "cal_housing"))
X = data["data"]
y = data["target"]

大約有2萬多條資料。

3. 模型訓練

資料載入之後,首先劃分訓練集和測試集。

from sklearn.model_selection import train_test_split

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

然後用嶺迴歸模型訓練資料:

from sklearn.linear_model import Ridge

# 初始化嶺迴歸線性模型
reg = Ridge()
# 訓練模型
reg.fit(X_train, y_train)

這裡,用的Ridge()模型的預設引數,它的一些主要引數如下(訓練模型時可根據情況調整引數):

  1. alpha:控制正則化強度的常量,也就是上面公式中的 \(\lambda\),預設值1,設定為0時,就是最小二乘法
  2. fit_intercept:是否擬合此模型的截距,預設 True
  3. copy_X:是否複製X(也就是訓練資料),預設 True,設定為False的話,有可能會改變訓練資料
  4. tol:演演算法迭代時,收斂的精度上限
  5. solver:迭代時使用的求解器,包含** {auto, svd, cholesky, lsqr, sparse_cg, sag, saga, lbfgs}** 等演演算法,預設 auto(根據資料型別自動選擇求解器)

最後,用測試資料來驗證訓練後模型的效能。

y_pred = reg.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
m_error = metrics.median_absolute_error(y_test, y_pred)

print("均方誤差:{}".format(mse))
print("複相關係數:{}".format(r2))
print("中位數絕對誤差:{}".format(m_error))

# 執行結果
均方誤差:0.0029948538129997903
複相關係數:0.9987534427417275
中位數絕對誤差:0.049467455621301726

從結果來看,模型的效能還不錯,均方誤差中位數絕對誤差都比較小,而複相關係數高,說明在測試資料中,預測的值和實際的值比較接近。

4. 總結

總之,嶺迴歸在很多場景下都有應用,例如多元線性迴歸、時間序列預測、特徵選擇等。
它的主要優點是可以處理共線性資料,並且在加入噪聲的情況下會有更穩定的效能。

然而,由於其對資料的縮放敏感嶺迴歸的一個主要侷限性是它可能對資料的尺度非常敏感
此外,嶺迴歸正則化引數的選擇通常需要一些經驗或者實驗來確定,這也增加了其應用的複雜性

PS.
共線性是指特徵之間存在高度相關性,這可能導致線性迴歸模型的不穩定。

相關文章