在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn

Posted

技术标签:

【中文标题】在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn【英文标题】:Different Results using Simple Linear Regression Packages in Python: statsmodel.api vs sklearn 【发布时间】:2021-02-04 22:53:22 【问题描述】:

我希望了解为什么我会得到两个不同的线性回归模型预测结果。我使用相同的数据集,并要求相同的预测值。我在下面粘贴了一些示例代码,以及一个指向打开的 Google Colab 的链接,available here。

import pandas as pd
from sklearn import linear_model, metrics
import statsmodels.api as sm

temp = [73,65,81,90,75,77,82,93,86,79]
gallons = [110,95,135,160,97,105,120,175,140,121]
merged = list(zip(temp, gallons))
df = pd.DataFrame(merged, columns = ['temp', 'gallons'])

X = df[['temp']]
Y = df['gallons']

regr = linear_model.LinearRegression().fit(X,Y)
print("Using sklearn package, 80 temp predicts rent of:", regr.predict([[80]]))

model = sm.OLS(Y,X).fit()
print("Using statsmodel.api package, 80 temp predicts rent of:", model.predict([80]))

使用上面的代码,我收到以下结果: 使用 sklearn 包,80 temp 预测租金:[125.5013734] 使用 statsmodel.api 包,80 temp 预测租金为:[126.72501891]

有人可以解释为什么结果不一样吗?我的理解是它们都是线性回归模型。

谢谢!

【问题讨论】:

【参考方案1】:

Statsmodel doesn't use intercept by default,而sklearn默认使用它。您必须在statsmodel中手动添加拦截。

Statsmodel OLS 文档。

注意事项

除非您使用公式,否则模型不会添加任何常数。

Sklearn

fit_interceptbool, default=True 是否计算截距 这个模型。如果设置为 False,则不会在计算中使用截距 (即数据应该居中)。

使用add_constant 函数将截距添加到 X,这将为两种算法提供相同的结果。

X = sm.add_constant(X)
model = sm.OLS(Y,X).fit()
print("Using statsmodel.api package, 80 temp predicts rent of:", model.predict([1,80]))

【讨论】:

以上是关于在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn的主要内容,如果未能解决你的问题,请参考以下文章

python实现简单线性回归

每次我使用 scikit 运行线性回归时都会得到不同的结果

回归分析 R语言 -- 多元线性回归

如何使用Pulp Gekko和Scipy软件包修复具有不同结果的代码以解决线性优化问题?

深度学习核心技术精讲100篇(八十二)-Statsmodels线性回归看特征间关系

用Python开始机器学习(3:数据拟合与广义线性回归)