Регрессия OLS: Scikit против Statsmodels?

короткая версия: я использовал Scikit LinearRegression для некоторых данных, но я привык к P-значениям, поэтому помещаю данные в OLS statsmodels, и хотя R^2 примерно одинаковый, переменные коэффициенты все разные на большие суммы. Это касается меня, так как наиболее вероятной проблемой является то, что я где-то допустил ошибку, и теперь я не уверен в любом выходе (так как, вероятно, я сделал одну модель неправильно, но не знаю, какая один.)

версия: потому что я не знаю, где проблема, я не знаю точно, какие детали включать, и в том числе все, вероятно, слишком много. Я также не уверен в включении кода или данных.

У меня сложилось впечатление, что LR scikit и statsmodels OLS должны оба делать OLS, и, насколько я знаю, OLS-это OLS, поэтому результаты должны быть одинаковыми.

для LR scikit результаты (статистически) одинаковы ли или не я устанавливаю normalize=True или = False, что мне кажется несколько странным.

для OLS statsmodels я нормализую данные с помощью StandardScaler из sklearn. Я добавляю столбец из них, поэтому он включает перехват (поскольку выход scikit включает перехват). Подробнее об этом здесь:http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html (добавление этого столбца не изменило переменных коэффициентов в какой-либо заметной степени, и перехват был очень близок к нулю.) StandardScaler не нравится, что моя Интса не плавает, так что я попытался это: https://github.com/scikit-learn/scikit-learn/issues/1709 Что делает предупреждение уйти, но результаты точно такие же.

конечно, я использую 5-кратное cv для подхода sklearn (R^2 согласованы как для тестовых, так и для учебных данных каждый раз), и для statsmodels я просто бросаю все данные.

R^2 составляет около 0,41 как для sklearn, так и для statsmodels (это хорошо для социальных наука.) Это может быть хорошим знаком или просто совпадением.

данные наблюдений аватаров в WoW (от http://mmnet.iis.sinica.edu.tw/dl/wowah/), который я жевал, чтобы сделать его еженедельно с некоторыми различными функциями. Первоначально это был классный проект для класса data science.

независимые переменные включают количество наблюдений в неделю (int), уровень символов (int), если в гильдии (Boolean), когда видно (Booleans on weekday day, weekday Ева, будний день поздно, и те же Три на выходные), манекен для класса символов (в то время для сбора данных было только 8 классов в WoW, поэтому есть 7 манекенов vars и исходная строка категориальной переменной отброшена) и другие.

зависимой переменной является то, сколько уровней каждый символ получил в течение этой недели (int).

интересно, что некоторые из относительного порядка внутри подобных переменных поддерживаются через statsmodels и sklearn. Итак, ранг порядка "когда видно" то же самое, хотя нагрузки очень разные, и порядок рангов для манекенов класса персонажей тот же, хотя снова нагрузки очень разные.

Я думаю, что этот вопрос похож на этот: разница в Python statsmodels OLS и R's lm

Я достаточно хорош в Python и статистике, чтобы справиться с этим, но тогда недостаточно хорош, чтобы понять что-то подобное. Я попытался прочитать документы sklearn и документы statsmodels, но если ответ и был у меня на лице, я его не понял.

Я хотел бы знать:

  1. какой выход может быть точным? (Конечно, они оба могли бы быть, если бы я пропустил кварг.)
  2. если я ошибся, что это и как это исправить?
  3. я бы понял это, не спрашивая здесь, и если да, то как?

Я знаю, что этот вопрос имеет некоторые довольно расплывчатые биты (без кода, без данных, без вывода), но я думаю речь идет об общих процессах двух пакетов. Конечно, кажется, что больше статистики, и кажется, что больше машинного обучения, но они оба OLS, поэтому я не понимаю, почему выходы не одинаковы.

(Я даже попробовал некоторые другие вызовы OLS для триангуляции, один дал гораздо более низкий R^2, один зациклился на пять минут, и я убил его, и один разбился.)

спасибо!

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 (т. е. падение различные колонки.)

Я рекомендую вам использовать pandas и patsy для этого:

import pandas as pd
from patsy import dmatrices

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

или statsmodels формула интерфейса:

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

Edit: этот пример может быть полезен:http://statsmodels.sourceforge.net/devel/example_formulas.html


Я просто хотел добавить, что с точки зрения sklearn, он не использует метод МНК для линейной регрессии под капотом. Поскольку sklearn происходит из области интеллектуального анализа данных / машинного обучения, им нравится использовать алгоритм градиента крутого спуска. Это численный метод, чувствительный к начальным условиям и т. д., В то время как OLS-аналитический подход с закрытой формой, поэтому следует ожидать различий. Таким образом, statsmodels происходит из области классической статистики, поэтому они будут использовать технику OLS. Так существуют различия между двумя линейными регрессиями из 2 разных библиотек