2014-02-26 2 views
15

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

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

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

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

Для statsmodels OLS, я нормализую данные, используя StandardScaler из sklearn. Я добавляю столбец из них, поэтому он включает в себя перехват (так как вывод scikit включает в себя перехват). Подробнее об этом здесь: http://statsmodels.sourceforge.net/devel/examples/generated/example_ols.html (добавление этого столбца не изменило переменные коэффициенты на любую заметную степень, и перехват был очень близок к нулю.) СтандартScaler не понравился, что мой ints не был плавающим, поэтому я пробовал это: 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/), которые я собирался сделать еженедельно с некоторыми различными функциями. Первоначально это был классный проект для класса данных.

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

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

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

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

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

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

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

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

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

Спасибо!

+1

Можете ли вы воспроизвести свою проблему на небольшом входе? Если да, можете ли вы разместить ввод и код здесь? – Akavall

+2

только одна возможность: вы проверили ранг вашей матрицы объясняющих переменных? Может ли оно быть сингулярным? Но трудно сказать, что может вызвать различия без более явного примера. – user333700

+0

Ah ok - Я посмотрю, смогу ли я улучшить q с некоторыми из этих вещей завтра (восточное время США). Я был обеспокоен тем, что не смог бы задать вопрос с правильной спецификой для этого дела. –

ответ

26

Похоже, что вы не подаете одну и ту же матрицу регрессоров 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 не может иметь полный ранг столбцов, и они см/ск можно принимать (разные) действия под капотом, чтобы сделать выполняется вычисление 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

+1

Удивительная благодарность. Позвольте мне ... ну, я отправлю функции, которые я построил, а затем вернусь и попытаюсь применить эти идеи. Я понимаю, что означает «не кормить одну и ту же матрицу», #win ... Надеюсь, я не испортил этот уровень, но, конечно, это возможно. –

+0

На самом деле я попробую пример кода здесь, прежде чем вставлять в 75 строк кода (мои два разных вызова функций). Я не хочу тратить время людей, чтобы они прочитали код, если ответ уже здесь. (Конечно, я мог бы опубликовать его, если этот код работает, и тогда я не могу понять, где я поступил не так, но по одному шагу за раз.) Должен быть в состоянии добраться до него когда-нибудь сегодня (может быть, позже). Всем спасибо! –

+1

Хорошо! Этот код действительно дал мне те же результаты в обеих библиотеках для одних и тех же данных! Ницца! Тем не менее, цифры полностью отличаются от предыдущих двух, что я имею - хорошая вещь, которую я задал здесь! Я буду работать над тем, чтобы понять это, теперь, когда у меня есть хорошая отправная точка и некоторые цифры, которые, я думаю, я могу доверять. (Я немного разочарован тем, что мне удалось сделать две регрессии, и все же они пошатнулись ... Может быть, я должен придерживаться SPSS и R .... нет!) –

Смежные вопросы