岭回归通过在$X^TX$中加入$\alpha I$使矩阵恒可逆,从而解决病态问题;需先标准化以保障L2惩罚公平性,$\alpha$过小退化为OLS、过大导致欠拟合,合理范围通常为$10^{-3}$至$10^2$。

Ridge回归能缓解病态问题,根本原因在于它把原本不可逆(或接近奇异)的 (X^T X) 替换为可逆的 (X^T X + α I) —— 这个加法操作直接修复了矩阵的数值不稳定性。
病态问题在代码里长什么样?
当你调用 np.linalg.inv(X.T @ X) 时抛出 LinAlgError: Singular matrix,或者 np.linalg.cond(X) 返回值超过 1e12,基本就坐实了病态。典型场景包括:特征之间高度相关(比如“月收入”和“年收入”同时存在)、样本数远小于特征数(n_samples )、或用了未标准化的原始数据(如身高用 cm、房价用 元,量纲差6个数量级)。
此时普通线性回归的解析解 np.linalg.solve(X.T @ X, X.T @ y) 会剧烈震荡——同一组数据微调一个点,coef_ 可能从 [2.1, -5.8] 突变为 [14.7, -23.9]。
Ridge 的核心改动只有一行矩阵运算
标准线性回归求解的是:(X^T X) w = X^T y;而 Ridge 求解的是:(X^T X + α I) w = X^T y。这个 α I 就是关键:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
α > 0保证对角线元素全部被抬高,强制矩阵满秩,np.linalg.inv(X.T @ X + alpha * np.eye(X.shape[1]))总能算出来 - 即使
X本身列相关(比如第二列 ≈ 0.99 × 第一列),X^T X的行列式可能趋近于 0,但加上α I后,最小特征值被拉高到至少α,条件数大幅下降 - sklearn 的
Ridge默认用 SVD 分解而非直接求逆,但底层逻辑仍是等价的——它避开了显式计算X^T X,但正则项的稳定作用没变
为什么必须先做 StandardScaler?
因为 Ridge 的惩罚项是 α * sum(w_i²),它对所有系数一视同仁。如果某个特征尺度是另一个的 1000 倍(比如“年龄”范围 0–100,“年收入”范围 10000–2000000),那它的系数天然小 10000 倍,L2 惩罚几乎只压着大系数走,小系数形同虚设。
所以你得先跑:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ridge = Ridge(alpha=1.0).fit(X_scaled, y)
否则 alpha 实际起效的尺度完全失真,调参失去意义。
alpha 太小或太大都会让模型失效
alpha 不是越大越好,也不是越小越接近 OLS:
-
alpha → 0:退化为普通线性回归,病态问题照旧 -
alpha过大(比如1e5):所有w_i被强压向 0,模型只剩截距项,欠拟合 - 真正有效的
alpha通常落在1e-3到1e2区间,且强烈依赖于数据尺度——这也是为什么必须标准化后调参 - 用
RidgeCV自动选参比手动试更可靠,但它默认只在[0.1, 1.0, 10.0]里搜,常需用alphas=np.logspace(-4, 2, 50)扩展搜索空间
最容易被忽略的一点:Ridge 解决的是病态性(numerical instability),不是共线性的“存在”本身。VIF 高依然高,但模型输出不再随数据抖动——它不消除共线性,而是让共线性变得“无害”。

















