Регрессия Logisti c со статистическими моделями и scikit-learn: большая разница в прогнозах - PullRequest
3 голосов
/ 03 августа 2020

Я использовал библиотеки Python statsmodels и scikit-learn для логистической регрессии и прогнозирования c. Результаты предсказания вероятности класса существенно различаются. Я знаю, что решение рассчитывается численно, однако я ожидал, что результаты будут отличаться незначительно. Я ожидал, что оба используют функцию logisti c по умолчанию - это правильно или мне нужно установить какие-либо параметры?

Это мой код statsmodels:

import numpy as np
from sklearn.linear_model import LogisticRegression
x = np.array([1,2,3,4,5]).reshape((-1, 1))
y = np.array([0,0,1,1,1])
model = LogisticRegression()
model.fit(x, y)
model.predict_proba(np.array([2.5, 7]).reshape(-1,1))
Out:  array([[0.47910045, 0.52089955],
       [0.00820326, 0.99179674]])

Т.е. прогнозы для класса 1 - 0,521 и 0,992.

Если вместо этого я использую scikit-learn, я получаю 0,730 и 0,942:

import statsmodels.api as sm
x = [1, 2, 3, 4, 5]
y = [0,0,1,1,1]
model = sm.Logit(y, x)
results = model.fit()
results.summary()
results.predict([2.5, 7])
Out: array([0.73000205, 0.94185834])

(в качестве примечания : если я использую R вместо Python, прогнозы будут 0.480 и 1.000, т.е. они снова будут совершенно разными.)

Я подозреваю, что эти различия не числовые, но есть аналитическая математическая причина, например, различные используемые функции. Может кто поможет?

Спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Я нашел решение. На то было две причины:

(1) scikit-learn по умолчанию использует регуляризацию, которую нужно отключить. Это делается путем изменения строки 5 в коде scikit-learn на:

model = LogisticRegression(penalty='none')

(2) Та, которую упомянул Яти Радж - спасибо за подсказку! Statsmodels не соответствует перехвату автоматически. Это можно изменить, добавив строку

x = sm.add_constant(x)

в код statsmodels.

...