首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OLS回归: Scikit与Statsmodels?

OLS回归: Scikit与Statsmodels?
EN

Stack Overflow用户
提问于 2014-02-26 22:34:31
回答 3查看 33.9K关注 0票数 31

简短的版本:我在一些数据上使用了LinearRegression,但是我习惯了p-值,所以把数据放到状态模型OLS中,尽管R^2差不多,但是变量系数都有很大的差异。这让我感到担忧,因为最可能的问题是我在某个地方犯了错误,现在我对这两个输出都没有信心(因为我可能做错了一个模型,但不知道是哪个模型)。

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

我的印象是,scikit的LR模型和状态模型OLS都应该做OLS,据我所知,OLS是OLS,所以结果应该是相同的。

对于scikit的LR,无论我是否设置了normalize=True或=False,结果(在统计上)都是相同的,我发现这有点奇怪。

对于statsmodels,我使用sklearn的StandardScaler对数据进行规范化。我添加了一个列,这样它就包含了一个拦截(因为scikit的输出包括一个拦截)。在这里更详细的介绍:ols.html (添加此列并没有将变量系数改变到任何显著的程度,并且截距非常接近于零)。StandardScaler不喜欢我的ints没有浮动,所以我尝试了这样的方法:让警告消失的https://github.com/scikit-learn/scikit-learn/issues/1709,但是结果完全一样。

当然,对于sklearn方法,我使用的是5折叠cv (每次测试和训练数据的R^2都是一致的),而对于状态模型,我只是抛出所有的数据。

R^2对于滑雪模型和状态模型都是0.41左右(这对社会科学是有益的)。这可能是个好兆头,或者只是个巧合。

这些数据是对WoW中的化身的观察(来自http://mmnet.iis.sinica.edu.tw/dl/wowah/),我每周都要用一些不同的特性来制作它。最初,这是一个数据科学类的类项目。

自变量包括一周内的观察次数(int)、字符级别(int)、如果在一个协会中(布尔值)、当看到时(工作日、工作日前夕、工作日晚、周末相同的三个)、字符类的虚拟(在数据收集时,WoW中只有8个类,所以有7个虚拟变量和原始字符串分类变量被删除)等等。

因变量是每个字符在这一周(int)中获得多少级别。

有趣的是,类似变量中的一些相对顺序是在状态模型和sklearn之间保持的。因此,“看到时”的秩顺序是相同的,尽管加载是非常不同的,而字符类假人的秩顺序是相同的,尽管加载也是非常不同的。

我认为这个问题类似于这个问题:Difference in Python statsmodels OLS and R's lm

我在Python和stats方面做得很好,但还不足以解决类似的问题。我试着读了“滑雪板”文档和“状态模型”文档,但是如果答案就在我面前,我就不明白了。

我很想知道:

  1. 哪个输出可能是准确的?(当然,如果我错过了一次克沃格,他们可能都是。)
  2. 如果我犯了一个错误,它是什么以及如何修复它?
  3. 我能不问这里就想清楚了吗?如果是的话,我怎么知道的?

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

(我甚至尝试了其他一些OLS调用,其中一个的R^2要低得多,一个循环了5分钟,然后我就把它杀死了,还有一个崩溃了。)

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-27 13:42:25

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

代码语言:javascript
复制
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来处理这个问题:

代码语言:javascript
复制
import pandas as pd
from patsy import dmatrices

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

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

代码语言:javascript
复制
import statsmodels.formula.api as smf
dat = pd.read_csv('wow.csv')
mod = smf.ols('levels ~ week + character + guild', data=dat).fit()

编辑:这个示例可能有用:formulas.html

票数 42
EN

Stack Overflow用户

发布于 2019-08-23 23:30:39

如果您使用状态模型,我强烈建议使用statsmodel公式接口。使用statsmodel公式接口可以从OLS获得与sklearn.linear_model.LinearRegression、R、SAS或Excel相同的旧结果。

代码语言:javascript
复制
smod = smf.ols(formula ='y~ x', data=df)
result = smod.fit()
print(result.summary())

如果有疑问,请

  1. 试着读取源代码
  2. 为基准测试尝试另一种语言,或
  3. 从零开始尝试OLS,这是基本的线性代数。
票数 1
EN

Stack Overflow用户

发布于 2018-06-18 22:35:25

我只想在这里补充一下,在学习滑雪板方面,它不使用OLS方法进行线性回归。由于sklearn来自于数据挖掘/机器学习领域,他们喜欢使用最陡峭的下降梯度算法。这是一种对初始条件等敏感的数值方法,而OLS则是一种解析封闭形式的方法,因此应该考虑不同的情况。因此,状态模型来自于经典的统计领域,因此它们将使用OLS技术。因此,两个不同的库之间的线性回归是有区别的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22054964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档