嶺迴歸(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()
模型的預設引數,它的一些主要引數如下(訓練模型時可根據情況調整引數):
- alpha:控制正則化強度的常量,也就是上面公式中的 \(\lambda\),預設值
1
,設定為0
時,就是最小二乘法 - fit_intercept:是否擬合此模型的截距,預設
True
- copy_X:是否複製
X
(也就是訓練資料),預設True
,設定為False
的話,有可能會改變訓練資料 - tol:演算法迭代時,收斂的精度上限
- 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.
共線性是指特徵之間存在高度相關性,這可能導致線性迴歸模型的不穩定。