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

为何sklearn中PLSRegression的X@coef_+intercept_与predict结果不一致?

PLSRegression手动计算预测值与predict()结果不一致的原因

你使用sklearn的PLSRegression执行偏最小二乘回归时,发现通过X@pls2.coef_ + pls2.intercept_手动计算的预测结果,与pls2.predict(X)的输出存在明显差异,相关代码及输出如下:

复现代码

from sklearn.cross_decomposition import PLSRegression
X = [[0., 0., 1.], [1.,0.,0.], [2.,2.,2.], [2.,5.,4.]]
Y = [[0.1, -0.2], [0.9, 1.1], [6.2, 5.9], [11.9, 12.3]]
pls2 = PLSRegression(n_components=2)
pls2.fit(X, Y)
Y_pred = pls2.predict(X)

两种计算方式的输出

手动计算结果(X@pls2.coef_ + pls2.intercept_)

array([[ 6.80991986,  6.88073249],
       [ 6.24687317,  6.24590503],
       [16.37620337, 16.72659034],
       [27.32746904, 28.13552828]])

predict()方法输出结果

array([[ 0.26087869,  0.15302213],
       [ 0.60667302,  0.45634164],
       [ 6.46856199,  6.48931562],
       [11.7638863 , 12.00132061]])

原因分析

核心问题出在PLSRegression默认会对输入数据做标准化处理,但手动计算时跳过了这一步:

  • 训练阶段:fit()方法默认会对X和Y执行中心化(减去均值)和缩放(除以标准差,scale=True为默认值),PLS的分解逻辑是基于标准化后的数据完成的。
  • 预测阶段:predict()会自动对输入的X应用和训练时完全一致的标准化操作,计算后再将结果转换回原始Y的尺度。
  • 手动计算时:直接用原始X与coef_做矩阵运算,没有经过标准化,相当于用未处理的数据适配基于标准化数据得到的系数,结果必然和predict()不符。

手动复现predict()结果的方法

如果要手动得到和predict()一致的结果,需要先对X做训练时相同的标准化处理:

# 获取训练过程中记录的X标准化参数
X_mean = pls2.x_mean_
X_std = pls2.x_std_

# 对输入X执行标准化
X_scaled = (X - X_mean) / X_std

# 用标准化后的X计算预测值,结果将与predict()一致
Y_pred_manual = X_scaled @ pls2.coef_ + pls2.intercept_

内容的提问来源于stack exchange,提问作者lddubs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:31:15