Regression

邏輯回歸:Scikit Learn 與 Statsmodels

  • March 25, 2016

我試圖理解為什麼這兩個庫的邏輯回歸輸出會給出不同的結果。

我正在使用來自 UCLA idre tutorial的數據集,admit基於和進行預測。被視為分類變量,因此首先將其轉換為刪除的虛擬變量。還添加了截距列。gre``gpa``rank``rank``rank_1

py
from patsy import dmatrices
from sklearn.linear_model import LogisticRegression
import pandas as pd
import statsmodels.api as sm

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 會產生一組不同的係數。它是否最小化了一些不同的損失函數?是否有任何說明實施的文件?

您弄清楚這一點的線索應該是,來自 scikit-learn 估計的參數估計在幅度上一緻小於 statsmodels 對應項。這可能會讓您相信 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

更新:正如下面評論中正確指出的那樣,現在您可以通過設置關閉 scikit-learn 中的正則化penalty='none'(請參閱文檔)。

引用自:https://stats.stackexchange.com/questions/203740

comments powered by Disqus