【问题标题】:OLS Regression: Scikit vs. Statsmodels? [closed]OLS 回归:Scikit 与 Statsmodels? [关闭]
【发布时间】:2014-03-30 01:58:44
【问题描述】:

短版:我在一些数据上使用了 scikit LinearRegression,但我习惯了 p 值,所以将数据放入 statsmodels OLS,虽然 R^2 是关于同样,变量系数都相差很大。这让我很担心,因为最可能的问题是我在某处犯了错误,现在我对任何一个输出都没有信心(因为我可能错误地制作了一个模型,但不知道是哪一个)。

加长版:因为我不知道问题出在哪里,所以我不知道具体要包含哪些细节,而且包含所有内容可能太多了。我也不确定是否包含代码或数据。

我的印象是scikit的LR和statsmodels OLS都应该做OLS,据我所知OLS就是OLS所以结果应该是一样的。

对于 scikit 的 LR,无论我设置 normalize=True 还是 =False,结果(统计上)都是相同的,我觉得这有点奇怪。

对于 statsmodels OLS,我使用来自 sklearn 的 StandardScaler 对数据进行标准化。我添加了一列,因此它包含一个截距(因为 scikit 的输出包含一个截距)。更多信息在这里:http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html(添加此列并未将变量系数更改为任何显着程度,并且截距非常接近于零。)StandardScaler 不喜欢我的整数不是浮点数,所以我尝试了这个: https://github.com/scikit-learn/scikit-learn/issues/1709 这会使警告消失,但结果完全相同。

当然,我在 sklearn 方法中使用了 5 倍 cv(R^2 每次对于测试和训练数据都是一致的),而对于 statsmodels,我只是将所有数据都扔掉。

对于 sklearn 和 statsmodels,R^2 约为 0.41(这对社会科学有好处)。这可能是个好兆头,也可能只是巧合。

这些数据是对《魔兽世界》中化身的观察(来自http://mmnet.iis.sinica.edu.tw/dl/wowah/),我打算每周制作一些不同的功能。最初这是一个数据科学课程的课程项目。

自变量包括一周内的观察次数 (int)、角色级别 (int)、是否在公会 (Boolean)、何时被看到 (Booleans on weekday day, weekday eve, weekday late, and the same 三个为周末),字符类的一个dummy(在数据收集时,WoW中只有8个类,所以有7个dummy vars并且删除了原始字符串分类变量)等。

因变量是每个角色在该周内获得了多少级别(整数)。

有趣的是,类似变量中的一些相对顺序在 statsmodels 和 sklearn 中保持不变。因此,“当看到时”的排名顺序是相同的,尽管负载非常不同,而角色类假人的排名顺序是相同的,尽管负载又是非常不同的。

我觉得这个问题和这个问题差不多:Difference in Python statsmodels OLS and R's lm

我在 Python 和统计方面足够好,可以尝试一下,但还不足以解决这样的问题。我尝试阅读 sklearn 文档和 statsmodels 文档,但如果答案就在眼前,我不明白。

我很想知道:

  1. 哪个输出可能是准确的? (当然,如果我错过了一个 kwarg,他们可能都是。)
  2. 如果我犯了错误,这是什么错误以及如何解决?
  3. 我能不在这里问就知道这一点吗?如果可以,怎么办?

我知道这个问题有一些相当模糊的位(没有代码,没有数据,没有输出),但我认为它更多的是关于两个包的一般过程。当然,一个似乎是更多的统计数据,一个似乎是更多的机器学习,但它们都是 OLS,所以我不明白为什么输出不一样。

(我什至尝试了其他一些 OLS 调用来进行三角测量,其中一个给出了低得多的 R^2,一个循环了 5 分钟然后我杀死了它,一个崩溃了。)

谢谢!

【问题讨论】:

  • 你能在一个小的输入上复制你的问题吗?如果是这样,您可以在此处发布输入和您的代码吗?
  • 只有一种可能性:您检查了解释变量矩阵的等级吗?会不会是单数?但是,如果没有更明确的示例,很难说出可能导致差异的原因。
  • 啊,好吧——明天(美国东部时间)我会看看我是否可以用这些东西来改进 q。我担心我无法针对这个案例提出正确的具体问题。
  • 一种可能性是您生成一些随机数据并使用它运行您的程序,看看您是否得到相同的差异。通过这种方式,您可以查看是数据问题还是 statsmodels 与 scikit-learn 的使用问题。
  • 哦,这也是个好主意!顺便说一句,我不确定“解释变量矩阵的等级”是什么意思。我的统计数据都陈旧而生疏,机器学习方面的东西似乎使用不同的名称,方法也有点不同,所以我有时会在命名法上苦苦挣扎。

标签: python scikit-learn linear-regression statsmodels


【解决方案1】:

如果您使用 statsmodels,我强烈建议您改用 statsmodels 公式界面。您将使用 statsmodels 公式界面从 OLS 获得与从 sklearn.linear_model.LinearRegression、R、SAS 或 Excel 获得相同的旧结果。

smod = smf.ols(formula ='y~ x', data=df)
result = smod.fit()
print(result.summary())

如有疑问,请

  1. 尝试阅读源代码
  2. 尝试使用其他语言进行基准测试,或者
  3. 从头开始尝试 OLS,这是基本的线性代数。

【讨论】:

  • statsmodelsscikit-learn 更友好方式。我即将完成(大部分失败)来破译后者所需的难以理解的输入和输出数组/矩阵格式
【解决方案2】:

听起来您没有向两个程序提供相同的回归矩阵X(但请参见下文)。下面是一个示例,向您展示您需要为 sklearn 和 statsmodels 使用哪些选项才能产生相同的结果。

import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression

# Generate artificial data (2 regressors + constant)
nobs = 100 
X = np.random.random((nobs, 2)) 
X = sm.add_constant(X)
beta = [1, .1, .5] 
e = np.random.random(nobs)
y = np.dot(X, beta) + e 

# Fit regression model
sm.OLS(y, X).fit().params
>> array([ 1.4507724 ,  0.08612654,  0.60129898])

LinearRegression(fit_intercept=False).fit(X, y).coef_
>> array([ 1.4507724 ,  0.08612654,  0.60129898])

正如评论者所建议的那样,即使您为两个程序提供相同的 X,X 也可能没有完整的列排名,并且它们 sm/sk 可能会在后台采取(不同的)操作来进行 OLS 计算通过(即删除不同的列)。

我建议您使用pandaspatsy 来处理这个问题:

import pandas as pd
from patsy import dmatrices

dat = pd.read_csv('wow.csv')
y, X = dmatrices('levels ~ week + character + guild', data=dat)

或者,或者,statsmodels 公式接口:

import statsmodels.formula.api as smf
dat = pd.read_csv('wow.csv')
mod = smf.ols('levels ~ week + character + guild', data=dat).fit()

编辑:这个例子可能有用:http://statsmodels.sourceforge.net/devel/example_formulas.html

【讨论】:

  • 非常感谢。让我......好吧,我将发布我构建的功能,然后回来尝试应用这些想法。我确实明白“不提供相同的矩阵”是什么意思,#win...我希望我没有在那个级别上搞砸,但当然有可能。
  • 其实我会在粘贴 75 行代码(我的两个不同的函数调用)之前尝试这里的代码示例。如果答案已经在这里,我不想让他们阅读代码来浪费人们的时间。 (当然,如果此代码有效,我可能最终会发布它,然后我无法完全弄清楚我哪里出错了,但一步一步来。)应该能够在今天的某个时间(也许稍后)。谢谢大家!
  • 好的!对于相同的数据,该代码确实让我在两个库中得到了相同的结果!好的!但是,这些数字与我之前的两个数字完全不同——我在这里问的是好事!既然我有一个很好的起点和一些我认为我可以信任的数字,我会努力弄清楚这一点。 (我有点失望,我设法进行了两次回归,但它们完全出错了......也许我应该坚持使用 SPSS 和 R......没办法!)
  • 总结:好的,我得到了带有归一化(StandardScaler)的 SM 和带有 CV(和 SS)的 SK,它们的结果大致相同。问题似乎是我必须将整数转换为 numpy 浮点数(此时我不记得为什么),这适用于 SM 和 SK(无 CV)版本(有效的意思,它们给出了相同的结果,我我相信这些结果是准确的)。当我将 CV 添加到工作 SK 函数(使用 numpy 浮点数)时,R^2 变成了 -5000。所以,有些东西(?也许很明显?)在 CV 和 np 浮点数之间不起作用。我把 np 浮点数拿出来,没关系!
  • 嗨,我只是想在这里补充一点,就 sklearn 而言,它在后台不使用 OLS 方法进行线性回归。由于 sklearn 来自数据挖掘/机器学习领域,他们喜欢使用最速下降梯度算法。这是一种对初始条件等敏感的数值方法,而 OLS 是一种解析封闭形式的方法,因此应该预料到差异。因此 statsmodels 来自经典统计领域,因此他们将使用 OLS 技术。因此,来自 2 个不同库的两个线性回归之间存在差异。
【解决方案3】:

我只是想在这里补充一点,就 sklearn 而言,它不使用 OLS 方法进行线性回归。由于 sklearn 来自数据挖掘/机器学习领域,他们喜欢使用最速下降梯度算法。这是一种对初始条件等敏感的数值方法,而 OLS 是一种解析封闭形式的方法,因此应该预料到差异。因此 statsmodels 来自经典统计领域,因此他们将使用 OLS 技术。因此,来自 2 个不同库的两个线性回归之间存在差异

【讨论】:

  • 这个答案是错误的。 sklearn 的 LinearRegression 使用 OLS。直接看源码:github.com/scikit-learn/scikit-learn/blob/1495f6924/sklearn/…
  • 嗨,在我回答这个问题的地方,我联系了 sklearn 的人,他们告诉我他们没有 OLS 实现,只有 SDG 算法。但我没有尝试查看 git 代码库。所以感谢你找到这个,莎拉。所以要么回复我的人不知道,要么他们最近实施了 OLS。无论哪种方式,感谢莎拉指出这一点,非常感谢。
  • 感谢帕卢回复您的好 cmets :)
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 2020-09-12
  • 2016-12-29
  • 2017-12-31
  • 2014-02-09
  • 2016-05-03
  • 2014-12-19
相关资源
最近更新 更多