线性回归系数如何存储在 Sklearn 管道中?

Posted

技术标签:

【中文标题】线性回归系数如何存储在 Sklearn 管道中?【英文标题】:How Linear Regression coefficients are stored in Sklearn pipelines? 【发布时间】:2021-02-16 10:33:46 【问题描述】:

这是我关于 *** 的第一个问题 :)

我一直在尝试了解 Sklearn Pipelines 的使用。

我运行以下代码来缩放我的数据并在管道中拟合线性回归并绘制回归:

pipe = make_pipeline(StandardScaler(), LinearRegression())
pipe.fit(x_train, y_train) 

xfit = np.linspace(0, 1.25, 50) #Fake data to plot straight line
yfit = pipe.predict(xfit[:, np.newaxis])
plt.scatter(x_train, y_train)
plt.plot(xfit, yfit, color='r')

PlotLinearRegression

但是,当尝试手动绘制线性回归时,即使用以下代码从存储在管道中的 LinearRegression 对象中找到线性回归系数和截距。涉及到黑魔法,因为它不会显示与管道使用的回归(系数 + 截距)相同的回归(参见图表)。

print("Linear Regression intercept: ", pipe['linearregression'].intercept_)
print("Linear Regression coefficients: ", pipe['linearregression'].coef_)

可能会涉及到 StandardScaler,因为将其从管道中移除允许使用上面的代码单元找到回归系数。

关于非归一化回归系数和截距存储在管道对象中的位置的任何想法?或者等效地,我们如何使用标准缩放器从归一化回归系数中计算它们?

非常感谢!

【问题讨论】:

【参考方案1】:

关于非标准化回归系数和截距存储在管道对象中的位置有什么想法吗?

它们不是,因为管道除了将转换器和模型串在一起之外什么都不做。而模型对象只知道缩放后的输入数据。

或者等效地,我们如何使用标准缩放器从归一化回归系数中计算它们?

StandardScaler 具有属性mean_scale_(也称为var_),它们包含用于转换数据的原始数据的每列均值和标准差。所以我们有:

y_hat = lr.coef_ * x_transformed + lr.intercept_
      = lr.coef_ * (x - scaler.mean_) / scaler.scale_ + lr.intercept_
      = (lr.coef_ / scaler.scale_) * x + (lr.intercept_ - lr.coef_ * scaler.mean_ / scaler.scale_)

也就是说,你的非标准化回归系数是lr.coef_ / scaler.scale_,非标准化截距是lr.intercept_ - lr.coef_ * scaler.mean_ / scaler.scale_

(我还没有测试过,所以请检查它是否有意义。)

【讨论】:

以上是关于线性回归系数如何存储在 Sklearn 管道中?的主要内容,如果未能解决你的问题,请参考以下文章

SKlearn 线性回归系数等于 0

SKLearn 线性回归,但在开始之前设置某些系数

如何使用 Pipeline 和 GridSearchCV 找到线性回归问题的系数

Python中具有正系数的线性回归

Python - 多元线性回归 - 每个输入变量的确定系数

python:如何在sklearn中使用逻辑回归系数构建决策边界