简短的版本:我在一些数据上使用了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方面做得很好,但还不足以解决类似的问题。我试着读了“滑雪板”文档和“状态模型”文档,但是如果答案就在我面前,我就不明白了。
我很想知道:
我知道这个问题有一些相当模糊的部分(没有代码,没有数据,没有输出),但是我认为它更多的是关于这两个包的一般过程。当然,一个似乎是更多的统计数据,另一个似乎是更多的机器学习,但它们都是OLS,所以我不明白为什么输出不一样。
(我甚至尝试了其他一些OLS调用,其中一个的R^2要低得多,一个循环了5分钟,然后我就把它杀死了,还有一个崩溃了。)
谢谢!
发布于 2014-02-27 13:42:25
听起来,您没有将相同的回归矩阵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()编辑:这个示例可能有用:formulas.html
发布于 2019-08-23 23:30:39
如果您使用状态模型,我强烈建议使用statsmodel公式接口。使用statsmodel公式接口可以从OLS获得与sklearn.linear_model.LinearRegression、R、SAS或Excel相同的旧结果。
smod = smf.ols(formula ='y~ x', data=df)
result = smod.fit()
print(result.summary())如果有疑问,请
发布于 2018-06-18 22:35:25
我只想在这里补充一下,在学习滑雪板方面,它不使用OLS方法进行线性回归。由于sklearn来自于数据挖掘/机器学习领域,他们喜欢使用最陡峭的下降梯度算法。这是一种对初始条件等敏感的数值方法,而OLS则是一种解析封闭形式的方法,因此应该考虑不同的情况。因此,状态模型来自于经典的统计领域,因此它们将使用OLS技术。因此,两个不同的库之间的线性回归是有区别的。
https://stackoverflow.com/questions/22054964
复制相似问题