线性回归系数如何存储在 Sklearn 管道中?
How Linear Regression coefficients are stored in Sklearn pipelines?
我们来回答我在 Whosebug 上的第一个问题 :)
我一直在努力了解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,因为将其从管道中移除后可以使用上面的代码单元找到回归系数。
关于非标准化回归系数和截距存储在管道对象中的位置有什么想法吗?或者等价地,我们如何使用标准缩放器从归一化回归系数计算它们?
非常感谢!
Any ideas on where the unnormalised regression coefficients and intercept are stored in the pipeline object?
它们不是,因为管道除了将转换器和模型串在一起之外不做任何事情。而模型对象只知道缩放后的输入数据。
Or equivalently, how can we compute them from the normalised regression coefficients, using the standard scaler?
StandardScaler
具有属性 mean_
和 scale_
(还有 var_
),其中包含原始数据的 per-column 均值和标准差用于转换数据。所以我们有:
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_
。
(我还没有测试过,所以请检查它是否有意义。)
我们来回答我在 Whosebug 上的第一个问题 :)
我一直在努力了解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,因为将其从管道中移除后可以使用上面的代码单元找到回归系数。
关于非标准化回归系数和截距存储在管道对象中的位置有什么想法吗?或者等价地,我们如何使用标准缩放器从归一化回归系数计算它们?
非常感谢!
Any ideas on where the unnormalised regression coefficients and intercept are stored in the pipeline object?
它们不是,因为管道除了将转换器和模型串在一起之外不做任何事情。而模型对象只知道缩放后的输入数据。
Or equivalently, how can we compute them from the normalised regression coefficients, using the standard scaler?
StandardScaler
具有属性 mean_
和 scale_
(还有 var_
),其中包含原始数据的 per-column 均值和标准差用于转换数据。所以我们有:
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_
。
(我还没有测试过,所以请检查它是否有意义。)