Разница между statsmodel OLS и scikit линейной регрессии


14

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

Вот код, который я использовал с помощью библиотеки statsmodel с OLS:

X_train, X_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.3, random_state=1)

x_train = sm.add_constant(X_train)
model = sm.OLS(y_train, x_train)
results = model.fit()

print "GFT + Wiki / GT  R-squared", results.rsquared

Это распечатка GFT + Wiki / GT R-squared 0.981434611923

а второй - метод линейной модели библиотеки scikit learn:

model = LinearRegression()
model.fit(X_train, y_train)

predictions = model.predict(X_test)

print 'GFT + Wiki / GT R-squared: %.4f' % model.score(X_test, y_test)

Это распечатать GFT + Wiki / GT R-квадрат: 0,8543

Поэтому мой вопрос заключается в том, что оба метода выводят наш результат R ^ 2, но один выводит 0,98, а другой - 0,85.

Насколько я понимаю, OLS работает с набором обучающих данных. Итак, мои вопросы,

  • Есть ли способ работы с набором тестовых данных с OLS?
  • Придает ли нам значение набора данных обучения (в OLS мы не использовали набор тестовых данных)? Из моих прошлых знаний мы должны работать с тестовыми данными.
  • В чем разница между МНК и линейной регрессией Скикита? Какой из них мы используем для расчета балла модели?

Спасибо за любую помощь.

Ответы:


14

Первый с точки зрения использования. Вы можете получить прогноз в statsmodels очень похожим способом, как в scikit-learn, за исключением того, что мы используем экземпляр результатов, возвращаемыйfit

predictions = results.predict(X_test)

Учитывая прогнозы, мы можем рассчитать статистику, основанную на ошибке прогноза

prediction_error = y_test - predictions

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

К вашим двум другим пунктам:

Линейная регрессия в своей основной форме одинакова в statsmodels и scikit-learn. Однако реализация отличается, что может дать разные результаты в крайних случаях, и Scikit Learn в целом имеет большую поддержку для более крупных моделей. Например, statsmodels в настоящее время использует разреженные матрицы в очень немногих частях.

Наиболее важное различие заключается в окружающей инфраструктуре и сценариях использования, которые поддерживаются напрямую.

Statsmodels во многом следует традиционной модели, в которой мы хотим знать, насколько хорошо данная модель соответствует данным, и какие переменные «объясняют» или влияют на результат, или каков размер эффекта. Scikit-learn следует традиции машинного обучения, где главной поддерживаемой задачей является выбор «лучшей» модели для прогнозирования.

Как следствие, акцент в вспомогательных функциях statsmodels делается на анализе данных обучения, которые включают в себя тесты на гипотезы и меры соответствия, в то время как акцент в вспомогательной инфраструктуре в scikit-learn делается на выборе модели для внеклассной подготовки. Прогнозирование образца и, следовательно, перекрестная проверка по «тестовым данным».

Это указывает на различие: в использовании по-прежнему много общего. statsmodels также делает прогнозирование и дополнительно прогнозирование в контексте временных рядов. Но когда мы хотим провести перекрестную проверку для прогнозирования в statsmodels, в настоящее время все еще часто проще повторно использовать настройку перекрестной проверки scikit-learn вместе с моделями оценки statsmodels.


Хм, я пытаюсь использовать модель ARMA из statsmodels.tsa, но интерфейс предиката там совершенно другой. Знаете ли вы, как передать данные теста?
Ефес

1
Это другой вопрос, и вам нужно посмотреть документацию или примеры. Прогнозирование в моделях временных рядов существенно отличается из-за последовательной временной структуры, а прогнозирование - это прогнозирование значений в следующие периоды времени.
Йозеф

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

ARMA и SARIMAX допускают включение объясняющих переменных exogв оценку и прогнозирование.
Йозеф

Этот вопрос о Stackowerlow обращает внимание на разницу в интерфейсах: stackoverflow.com/questions/41045752/…
Дэвид Дейл

1

В модели OLS вы используете данные обучения для подбора и прогнозирования.

В модели LinearRegression вы используете обучающие данные для подбора и тестирования данных для прогнозирования, поэтому разные результаты в баллах R2.

Если вы будете принимать тестовые данные в модели OLS, вы должны иметь те же результаты и меньшее значение


0

Я столкнулся с похожей проблемой, когда OLS дает разные значения Rsquared и Adjusted Rsquared по сравнению с моделью Sklearn LinearRegression.

Причина этого: OLS по умолчанию не учитывает коэффициент перехвата и строит модель без него, а Склеарн учитывает его при построении модели.

Решение: Добавьте столбец 1 к набору данных и установите модель с OLS, и вы получите почти одинаковые Rsquared и Adj. Rsquared значения для обеих моделей.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.