Логістична регресія: Scikit Learn vs Statsmodels


31

Я намагаюся зрозуміти, чому результати з логістичної регресії цих двох бібліотек дають різні результати.

Я використовую набір даних з UCLA Idre підручник , прогнозуючи на admitоснові gre, gpaі rank. rankтрактується як категоріальна змінна, тому спочатку перетворюється на манекенну змінну зі rank_1скинутим. Також додається стовпчик перехоплення.

df = pd.read_csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')
X.head()
>  Intercept  C(rank)[T.2]  C(rank)[T.3]  C(rank)[T.4]  gre   gpa
0          1             0             1             0  380  3.61
1          1             0             1             0  660  3.67
2          1             0             0             0  800  4.00
3          1             0             0             1  640  3.19
4          1             0             0             1  520  2.93

# Output from scikit-learn
model = LogisticRegression(fit_intercept = False)
mdl = model.fit(X, y)
model.coef_
> array([[-1.35417783, -0.71628751, -1.26038726, -1.49762706,  0.00169198,
     0.13992661]]) 
# corresponding to predictors [Intercept, rank_2, rank_3, rank_4, gre, gpa]

# Output from statsmodels
logit = sm.Logit(y, X)
logit.fit().params
> Optimization terminated successfully.
     Current function value: 0.573147
     Iterations 6
Intercept      -3.989979
C(rank)[T.2]   -0.675443
C(rank)[T.3]   -1.340204
C(rank)[T.4]   -1.551464
gre             0.002264
gpa             0.804038
dtype: float64

Вихід з програми statsmodelsтакий же, як показано на веб-сайті idre, але я не впевнений, чому scikit-learn створює інший набір коефіцієнтів. Чи це мінімізує деякі різні функції втрат? Чи є документація, яка заявляє про реалізацію?

Відповіді:


28

Ваша підказка у з'ясуванні цього має полягати в тому, що оцінки параметрів, отримані в оцінці scikit-learn, однаково менші за величиною, ніж аналог статистичних моделей. Це може призвести до того, що scikit-learn застосовує певну регуляризацію параметрів. Ви можете підтвердити це, прочитавши документацію, що навчається .

Немає можливості вимкнути регуляризацію в scikit-learn, але ви можете зробити це неефективним, встановивши параметр настройки Cна велику кількість. Ось як це працює у вашому випадку:

# module imports
from patsy import dmatrices
import pandas as pd
from sklearn.linear_model import LogisticRegression
import statsmodels.discrete.discrete_model as sm

# read in the data & create matrices
df = pd.read_csv("http://www.ats.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')

# sklearn output
model = LogisticRegression(fit_intercept = False, C = 1e9)
mdl = model.fit(X, y)
model.coef_

# sm
logit = sm.Logit(y, X)
logit.fit().params

Дуже дякую за пояснення! З цим регульованим результатом я намагався дублювати результат, використовуючи glmnetпакет в R, але не міг отримати той самий коефіцієнт. glmnet має дещо іншу функцію вартості порівняно зі sklearn , але навіть якщо я ввійшов (маю alpha=0на glmnetувазі лише використання l2-штрафу) і встановив 1/(N*lambda)=C, я все одно не отримаю однакового результату?
урарикале

Моя інтуїція полягає в тому, що якщо я розділю обидва терміни функції витрат glmnetна lambdaі встановіть нову константу в шрифті вірогідності журналу, яка 1/(N*lambda)дорівнює значенню в sklearn, дві функції витрат стають однаковими, або я щось пропускаю?
урарикале

@hurrikale Задайте нове запитання і зв’яжіть його тут, і я погляну.
чакраварти

Спасибі! Я розмістив питання тут .
урарикале

Я думаю, що найкращий спосіб вимкнути регуляризацію в scikit-learn - це встановлення penalty='none'.
Nzbuu

3

Ще одна відмінність полягає в тому, що ви встановили fit_intercept = False, що фактично є іншою моделлю. Ви можете бачити, що Statsmodel включає перехоплення. Відсутність перехоплення, безумовно, змінює очікувані ваги на функції. Спробуйте наступне і подивіться, як він порівнює:

model = LogisticRegression(C=1e9)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.