尽管我使用相同的输入,为啥 sm.OLS 和 sklearn.linear_model 得到不同的结果?

Posted

技术标签:

【中文标题】尽管我使用相同的输入,为啥 sm.OLS 和 sklearn.linear_model 得到不同的结果?【英文标题】:Why do I get different outcomes for sm.OLS and sklearn.linear_model although I use the same input?尽管我使用相同的输入,为什么 sm.OLS 和 sklearn.linear_model 得到不同的结果? 【发布时间】:2019-10-08 04:49:04 【问题描述】:

我正在尝试运行具有两个不同函数的回归模型:来自 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

【问题讨论】:

可以在stats.se answer 和this answer 上找到两者之间的一个很好的细分,了解模型以及接口可能不同的原因。我要补充的一条评论是,您没有设置随机种子,因此即使在同一包的连续运行之间,您也可能会看到差异。 问题是你提到的这个链接主要关注训练和测试以及两个函数如何有不同的方法来处理它们,尽管在这个简单的练习中没有训练和测试数据。这两个函数唯一需要做的就是应用最小化过程,获取系数并将它们应用于原始数据,它们基本上做了一些不同的事情,我想知道为什么会这样。 我链接的第二个答案详细说明了两者在没有调整的情况下有何不同以及如何使两者更紧密地融合。这对您的情况有帮助吗? 【参考方案1】:

在看到这个之前,我遇到了类似的 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 包含常量,所以你不需要做这些奇怪的事情。

【讨论】:

以上是关于尽管我使用相同的输入,为啥 sm.OLS 和 sklearn.linear_model 得到不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥路由器链接不起作用,尽管我使用与 href 相同的组件链接并且它可以工作?

尽管代码相同,但切换菜单按钮在索引页面上有效,但在其他页面上无效 - 为啥?

尽管设置了随机状态和相同的输入,sklearn RandomForestClassifier.fit() 不可重现

尽管代码相同,为啥这两个 html/css 文件的工作方式不同? [关闭]

获取没有匹配指定签名和转换错误的循环

为啥使用相同的 Keras 模型和输入进行预测时会得到不同的结果?