为何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
相关产品推荐
相关产品推荐

