statsmodel OLS和scikit线性回归之间的差异


16

我有一个关于来自不同库的两种不同方法的问题,这些方法似乎做同样的工作。我正在尝试建立线性回归模型。

这是我将statsmodel库与OLS一起使用的代码:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

打印输出GFT + Wiki / GT R平方0.981434611923

第二个是scikit学习库线性模型方法:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

打印输出GFT + Wiki / GT R平方:0.8543

所以我的问题是这两种方法都可以打印出R ^ 2结果,但是一种方法可以打印出0.98,而另一种方法可以打印出0.85。

据我了解,OLS可以与训练数据集一起使用。所以我的问题

  • 有没有办法使用OLS处理测试数据集?
  • 转换数据集得分是否给我们任何意义(在OLS中,我们未使用测试数据集)?根据我过去的知识,我们必须使用测试数据。
  • OLS和scikit线性回归之间有什么区别。我们使用哪一个来计算模型的分数?

谢谢你的帮助。

Answers:


14

首先在用法上。您可以按照与scikit-learn中非常相似的方式在statsmodels中获得预测,除了我们使用由返回的结果实例外fit

predictions = results.predict(X_test)

给定预测,我们可以基于预测误差计算统计量

prediction_error = y_test - predictions

有一个单独的函数列表可用来计算预测统计的优度,但是它没有集成到模型中,也不包含R平方。(我从未听说过R平方用于样本数据。)计算这些值需要用户​​做更多的工作,并且statsmodels没有相同的统计信息集,尤其是对于分类或具有二进制响应变量的模型而言。

对于您的另外两点:

线性回归的基本形式在statsmodels和scikit-learn中相同。但是,实现方式不同,在极端情况下可能会产生不同的结果,并且scikit learning通常为更大的模型提供更多支持。例如,statsmodels当前很少使用稀疏矩阵。

最重要的区别在于周围的基础架构和直接支持的用例。

Statsmodels在很大程度上遵循传统模型,在该模型中,我们想知道给定模型与数据的拟合程度,以及哪些变量“解释”或影​​响结果,或影响的大小。Scikit-learn遵循机器学习的传统,其中主要的支持任务是选择“最佳”模型进行预测。

因此,statsmodels支持功能的重点在于分析训练数据,其中包括假设检验和拟合优度度量,而scikit-learn支持基础设施的重点在于针对不合时宜的模型选择。样本预测,因此对“测试数据”进行交叉验证。

这就指出了区别,在用法上还是有很多重叠的。statsmodels还可以进行预测,还可以在时间序列上下文中进行预测。但是,当我们想对statsmodels中的预测进行交叉验证时,当前通常仍然更容易将scikit-learn的交叉验证设置与statsmodels的估计模型一起重用。


嗯,我正在尝试使用statsmodels.tsa中的ARMA模型,但是预报的接口在那里完全不同。您知道如何提供测试数据吗?
ephes

1
这是一个不同的问题,您需要查看文档或示例。时间序列模型中的预测由于顺序的时间结构而有很大不同,而预测是对下一个时间段中的值进行预测。
约瑟夫(Josef)

您是对的,这是另一个问题,不过感谢您的解释。我已经阅读了文档,并使其能够以某种方式工作。但是我仍然不明白为什么界面不同。特别是为什么无法提供特征向量和获得预测(预测)的原因。
ephes

ARMA和SARIMAX允许将解释性变量exog包括在估计和预测中。
约瑟夫(Josef)

在Stackowerlow这个问题在不会忽略接口的区别:stackoverflow.com/questions/41045752/...
戴维·戴尔

1

在OLS模型中,您正在使用训练数据进行拟合和预测。

使用LinearRegression模型,您将使用训练数据来拟合和测试数据来进行预测,因此R2分数的结果不同。

如果要在OLS模型中获取测试数据,则结果应相同且值较低


1

我遇到了类似的问题,与Sklearn LinearRegression模型相比,OLS给出的Rsquared和Adjusted Rsquared值不同。

这样做的原因:OLS不会(默认情况下)考虑截距系数,因此会在不使用截距系数的情况下构建模型,而Sklearn在构建模型时会考虑使用截距系数。

解决方案:在数据集中添加一列1,并使用OLS拟合模型,您将获得几乎相同的Rsquared和Adj。两个模型的Rsquared值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.