You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义岭回归Python实现与sklearn Ridge结果差异排查求助

问题原因及解决办法
  • 截距项与数据中心化差异:
    sklearn的Ridge默认开启fit_intercept=True,会自动拟合截距,并在拟合前对输入特征X和目标y做中心化处理(每个特征减去均值,目标也减去均值),再求解系数。而你的手动实现直接使用原始数据计算,没有做中心化,也未考虑截距项,这是结果差异的核心原因。

  • 正则化项的适配:
    当fit_intercept=True时,sklearn不会对截距项施加正则化,而你的手动实现是对所有参数(若X包含截距列)施加正则化,这也会导致结果偏差。


修正后的手动实现

要和sklearn结果对齐,需先做中心化处理,且不将截距纳入正则化:

import numpy as np
from sklearn.linear_model import Ridge

# 假设X是(m, n)特征矩阵,y是(m,)目标向量
m, n = X.shape

# 1. 中心化数据(匹配sklearn默认行为)
X_mean = X.mean(axis=0)
y_mean = y.mean(axis=0)
X_centered = X - X_mean
y_centered = y - y_mean

# 2. 求解岭回归系数
lam = 1.0  # 你的正则化参数
w = np.linalg.solve(X_centered.T @ X_centered + lam * np.eye(n), X_centered.T @ y_centered)

# 3. 计算截距(对应sklearn的intercept_)
intercept = y_mean - X_mean @ w

# 与sklearn结果对比
clf = Ridge(alpha=lam, fit_intercept=True, normalize=False)
clf.fit(X, y)

print("手动实现系数:", w)
print("sklearn系数:", clf.coef_)
print("手动实现截距:", intercept)
print("sklearn截距:", clf.intercept_)

无截距场景验证

若想跳过中心化,直接对齐sklearn无截距的结果,可设置Ridge(fit_intercept=False),此时两者结果会完全一致:

# sklearn无截距版本
clf_no_intercept = Ridge(alpha=lam, fit_intercept=False)
clf_no_intercept.fit(X, y)

# 手动无截距实现
w_no_intercept = np.linalg.solve(X.T @ X + lam * np.eye(n), X.T @ y)

print("手动无截距系数:", w_no_intercept)
print("sklearn无截距系数:", clf_no_intercept.coef_)

内容的提问来源于stack exchange,提问作者Henry T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:12:26