如何获得PLS-Regression(sklearn)的截距

时间:2016-12-16 16:15:32

标签: python scikit-learn regression

使用sklearn的PLS回归给出非常差的预测结果。当我得到模型时,我找不到找到"拦截"的方法。也许这会影响模型的预测?分数和负荷的矩阵很好。系数的排列也是。在任何情况下,如何使用已经获得的属性获得拦截?

此代码抛出变量的系数。

from pandas import DataFrame
from sklearn.cross_decomposition import PLSRegression

X = DataFrame( {
        'x1': [0.0,1.0,2.0,2.0],
        'x2': [0.0,0.0,2.0,5.0],
        'x3': [1.0,0.0,2.0,4.0],
    }, columns = ['x1', 'x2', 'x3'] )
Y = DataFrame({
        'y': [ -0.2, 1.1, 5.9, 12.3 ],
    }, columns = ['y'] )

def regPLS1(X,Y):
    _COMPS_ = len(X.columns) # all latent variables
    model = PLSRegression(_COMPS_).fit( X, Y )
    return model.coef_

结果是:

regPLS1(X,Y)
>>> array([[ 0.84], [ 2.44], [-0.46]])

除了这些系数之外,截距的值是:0.26。我做错了什么?

修改的 正确的预测(评估)响应是Y_hat(与观察到的Y完全相同):

Y_hat = [-0.2  1.1  5.9 12.3]

2 个答案:

答案 0 :(得分:2)

要计算截距,请使用以下内容:

plsModel = PLSRegression(_COMPS_).fit( X, Y )

y_intercept = plsModel.y_mean_ - numpy.dot(plsModel.x_mean_ , plsModel.coef_)

我直接从R" pls"得到了公式。包裹:

 BInt[1,,i] <- object$Ymeans - object$Xmeans %*% B[,,i]

我测试了结果并计算了R&#39;中的相同截距。和scikit-learn。

答案 1 :(得分:1)

根据我对_PLS执行情况的解读,公式为Y = XB + Err,其中model.coef_B的估算值。如果您查看predict方法,它看起来使用拟合参数y_mean_作为Err,所以我相信您想要的。使用model.y_mean_代替model.coef_。希望这有帮助!