简短版本:我在某些数据上使用了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文档,但是如果答案在那里,我的脸不知所措。
我愿意知道:
我知道这个问题有些模糊(没有代码,没有数据,没有输出),但是我认为这更多地是关于这两个软件包的一般过程。当然,一个似乎更多的统计数据,一个似乎更多的机器学习数据,但它们都是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计算得以通过(即删除不同的列)。
我建议您使用pandas
并patsy
注意以下事项:
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] 删除。
我来说两句