Regression
邏輯回歸:Scikit Learn 與 Statsmodels
我試圖理解為什麼這兩個庫的邏輯回歸輸出會給出不同的結果。
我正在使用來自 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'
(請參閱文檔)。