statsmodel OLS 和 scikit 线性回归的区别

机器算法验证 回归 Python scikit-学习 统计模型
2022-01-24 20:02:02

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

这是我在 OLS 中使用 statsmodel 库的代码:

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 learn library 线性模型方法:

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线性回归有什么区别。我们使用哪一个来计算模型的分数?

谢谢你的帮助。

4个回答

首先在使用方面。您可以通过与 scikit-learn 中非常相似的方式在 statsmodels 中获得预测,不同之处在于我们使用返回的结果实例fit

predictions = results.predict(X_test)

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

prediction_error = y_test - predictions

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

对于您的另外两点:

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

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

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

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

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

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

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

如果您要在 OLS 模型中获取测试数据,您应该有相同的结果和较低的值

我遇到了一个类似的问题,与 Sklearn 线性回归模型相比,OLS 给出了不同的 Rsquared 和 Adjusted Rsquared 值。

原因:OLS 默认情况下不考虑截距系数,并且在没有它的情况下构建模型,Sklearn 在构建模型时考虑它。

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

让我说得很清楚:我们知道多元线性回归表示为:

y = b0 + b1X1 + b2X2 + b3X3 +…..+ bnXn

但我们也可以将其表示为: y = b0X0 + b1X1 + b2X2 + b3X3 +…..+ bnXn 其中 X0 = 1

我们必须添加一列与 1 相同的值来表示 b0X0。

为什么我们需要这样做?statsmodels Python 库提供了一个 OLS(普通最小二乘)类来实现反向消除。现在需要注意的是,OLS 类默认不提供拦截,它必须由用户自己创建。这就是为什么我们创建一个所有值都与 1 相同的列来表示 b0X0。

这就是我们在 sklearn 回归模型和 Ols statsmodel 中得到不同 R2 值的原因。