尽管我使用相同的输入,为什么我对sm.OLS和sklearn.linear_model的结果不同?

时间:2019-05-21 18:18:58

标签: python scikit-learn statistics linear-regression statsmodels

我正在尝试运行具有两个不同功能的回归模型:statsmodels.api中的OLS和sklearn中的linear_regression,输出似乎彼此完全不同。

这是我的代码:

import statsmodels.api as sm
import pandas as pd
import matplotlib
import scipy.stats as stats
import matplotlib.pyplot as plt
from patsy import dmatrices
from sklearn import linear_model

data = pd.read_excel("2001_SCF_Pivot.xlsx")
y,x = dmatrices("np.log(RETQLIQ) ~ W_P_ADJ+np.power(W_P_ADJ,2)+np.power(W_P_ADJ,3)+INCOME+np.power(INCOME,2)+WHITE+AGE+EDUC+FEMALE+SINGLE",data = data)

LinearRegression = linear_model.LinearRegression()
ols = LinearRegression.fit(x,y)
sm_prediction = ols.predict(x)

model_fit = sm.OLS(y,x)
results = model_fit.fit()
sklearn_prediction = results.predict(x)

当我分散数据并在图形上添加两个预测时,从理论上讲,我需要相互绘制两个图,如您从所附图像中看到的那样,这两个函数的预测似乎完全不同。我的问题是,为什么我会得到不同的结果?在这种情况下,正确的方法是什么?在此先感谢您!

您可以在此处找到相关的图形:https://imgur.com/a/OkqCcd1

1 个答案:

答案 0 :(得分:0)

我在 OLS 上遇到了类似的问题,直到我看到这个:

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

我看了摘要,没有常数!!!

我使用一个新变量修复了这个问题:

x_ols = sm.add_constant(x_my_old_data)

然后我将 OLS 与该变量一起使用:

linear_sm = sm.OLS(y_my_old_data,x_ols).fit()

如果我想要一个预测,那么我必须使用这个奇怪的 x_ols:

y_pred = linear_sm.predict(x_ols)

如果我想绘制它,那么我使用 x_my_old_data:

plt.plot(x_my_old_data,y_my_old_data)

statsmodels.formula.api 包含了常量,所以你不需要做这些奇怪的事情。