OLS回归:Scikit与Statsmodels?

纳特·普尔

简短版本:我在某些数据上使用了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模型和stats模型,R ^ 2约为0.41(这对社会科学是有益的)。这可能是一个好兆头,也可能只是一个巧合。

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

自变量包括一周中的观察次数(int),字符级别(int)(如果在行会中则为布尔值)(布尔值),看到时(在工作日,工作日前夜,工作日晚和周三是布尔值),字符类的虚拟对象(在数据收集时,WoW中只有8个类,因此有7个虚拟变量,并且删除了原始的字符串分类变量),以及其他。

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

有趣的是,类似变量内的某些相对顺序在statsmodels和sklearn中保持不变。因此,尽管加载有很大的不同,但是“看时”的排名顺序是相同的,尽管加载有很大的不同,但角色类假人的排名却是相同的。

我认为这个问题与此类似:Python statsmodels OLS和R的lm的区别

我擅长使用Python和统计数据,但还不足以解决类似问题。我试着阅读sklearn文档和statsmodels文档,但是如果答案在那里,我的脸不知所措。

我愿意知道:

  1. 哪个输出可能是准确的?(当然,如果我错过矮人的话,他们俩可能都是。)
  2. 如果我犯了一个错误,那是什么以及如何解决?
  3. 我能在不问这里的情况下解决这个问题吗?

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

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

谢谢!

文森特

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python中的Fama Macbeth回归(熊猫或Statsmodels)

来自分类Dev

Statsmodels OLS function for multiple regression parameters

来自分类Dev

Statsmodels OLS函数可用于多个回归参数

来自分类Dev

绘制熊猫OLS线性回归结果

来自分类Dev

Statsmodels OLS回归:对数似然,用法和解释

来自分类Dev

在Python中使用statsmodels的自回归模型

来自分类Dev

statsmodels logistic回归类型问题

来自分类Dev

Statsmodels-Wald检验线性回归模型(OLS)中系数趋势的显着性

来自分类Dev

连接Statsmodels.OLS的DataFrame列

来自分类Dev

使用OLS回归预测未来值(Python,StatsModels,Pandas)

来自分类Dev

OLS回归JS库

来自分类Dev

Python Statsmodels:OLS回归器无法预测

来自分类Dev

scikit-learn或statsmodels模型中用于线性回归的调整参数的极限范围

来自分类Dev

熊猫:OLS回归不输出截距

来自分类Dev

Matlab中的Ridge回归和OLS回归

来自分类Dev

Python:OLS回归不会生成拦截

来自分类Dev

Python:OLS回归不会生成拦截

来自分类Dev

OLS回归结果

来自分类Dev

多变量回归statsmodels.api

来自分类Dev

使用statsmodels约束OLS(或WLS)系数

来自分类Dev

Statsmodels OLS函数可用于多个回归参数

来自分类Dev

Python中的Fama Macbeth回归(Pandas或Statsmodels)

来自分类Dev

串联Statsmodels.OLS的DataFrame列

来自分类Dev

OLS回归JS库

来自分类Dev

Python Statsmodels:OLS回归器无法预测

来自分类Dev

Apache Spark MLlib:Java中的OLS回归

来自分类Dev

熊猫:OLS回归不输出截距

来自分类Dev

Python:OLS回归不会生成拦截

来自分类Dev

输出 Scikit Learn OLS 报告