如何获得 PLS 回归的截距(sklearn)

Posted

技术标签:

【中文标题】如何获得 PLS 回归的截距(sklearn)【英文标题】:How obtain the intercept of the PLS-Regression (sklearn) 【发布时间】:2017-05-02 11:41:39 【问题描述】:

使用 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]

【问题讨论】:

预测[0, 0, 0, 0]怎么样? 我已经编辑了我的答案。预测值(使用 3 VL)与观测值完全相等。 使用model.predict(X)获取: 你必须预测你的数据。你没有在你展示给我们的 sn-p 中 使用model.predict(X)获取:array([[ 2.07322661], [ 3.21992642], [ 5.62383293], [ 8.18301403]]) 【参考方案1】:

根据我对_PLS 实现的阅读,公式是Y = XB + Err,其中model.coef_B 的估计值。如果您查看predict 方法,它看起来像是使用拟合参数y_mean_ 作为Err,所以我相信这就是您想要的。使用model.y_mean_ 而不是model.coef_。希望这会有所帮助!

【讨论】:

没错,但我指的是预测模型的常数。一旦获得所有潜在变量。我想知道该模型在常数和预测变量方面是什么。在 R 中使用相同的数据,我得到系数和截距。显然,预测要好得多。我已经在 R 中使用 Geladi & Kowalski 算法手动完成了 [“偏最小二乘回归:教程”,Analytica Chimica Acta,185 (1986)]。 澄清一下。 model.coef_ 对应模型中的 Bmodel.y_mean_ 对应于它们模型中的Err(截距)。如果你得到更糟糕的结果,那可能是你在实现中发现了一个错误。可能值得深入研究 R 实现并确定他们是否使用 y_mean_ 作为拦截。如果没有,您可能需要考虑向 sklearn 提交问题或错误修复。 哦……是的!我正在使用两个包(“pls”和“plsdepot”)进行 pls 回归,并且预测很好。显然,预测值 [[ 2.07322661]、[ 3.21992642]、[ 5.62383293]、[ 8.18301403]] 与观察值相差甚远......如何报告 sklearn 上的错误修复?【参考方案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 'pls' 和 scikit-learn 中计算了相同的截距。

【讨论】:

是的,现在生成完整的模型可以正确输出预测值。 plsModel.predict(X) 预测错误,或者不知道准确预测。非常感谢!

以上是关于如何获得 PLS 回归的截距(sklearn)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中统计比较两种不同线性回归模型的截距和斜率?

我们如何计算 statsmodels OLS 中的截距和斜率?

我的自定义逻辑回归实现有啥问题?

为啥 sklearn 逻辑回归正则化权重和截距?

Python Sklearn 线性回归产生不正确的系数值

如何在 R 中拟合分段回归,并限制第一次拟合通过截距..?