【问题标题】:Different Results using Simple Linear Regression Packages in Python: statsmodel.api vs sklearn在 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]

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

谢谢!

【问题讨论】:

    标签: python scikit-learn linear-regression statsmodels


    【解决方案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]))
    

    【讨论】:

      猜你喜欢
      • 2020-07-27
      • 2019-01-19
      • 2018-06-25
      • 2016-04-14
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2018-04-02
      • 2014-12-19
      相关资源
      最近更新 更多