Регрессия 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, но если ответ и был у меня на лице, я его не понял.
Я хотел бы знать:
- какой выход может быть точным? (Конечно, они оба могли бы быть, если бы я пропустил кварг.)
- если я ошибся, что это и как это исправить?
- я бы понял это, не спрашивая здесь, и если да, то как?
Я знаю, что этот вопрос имеет некоторые довольно расплывчатые биты (без кода, без данных, без вывода), но я думаю речь идет об общих процессах двух пакетов. Конечно, кажется, что больше статистики, и кажется, что больше машинного обучения, но они оба 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 разных библиотек