如何获得 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_
对应模型中的 B
。 model.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 中统计比较两种不同线性回归模型的截距和斜率?