sklearn邏輯回歸收斂到一個簡單案例的意外係數
案例如下:
假設
import numpy as np X = np.array([1, 1, 1]) y = np.array([1, 0, 1])
然後我執行一個沒有截距的邏輯回歸來檢查擬合係數:
from sklearn.linear_model import LogisticRegression def fit_predict(X, y, fit_intercept=True): model = LogisticRegression(fit_intercept=fit_intercept) model.fit(X.reshape(-1, 1), y) print(f'model coefficients: {model.coef_}') fit_predict(X, y, fit_intercept=False) # output: [[0.2865409]]
我對這個輸出感到很困惑。根據我的代數(直接解決優化約束),係數應該是 $ logit(2/3) \approx 0.6931471805599452 $ .
這是因為我的數學錯了,還是因為我不知道發生了其他事情?
代數如下,從以下等式開始:
$$ \sum_i y_i \cdot x_i - sigmoid(x_i) \cdot x_i = 0 $$
如果我們插入這些值,那麼$$ 2 = 3\cdot sigmoid(1) $$.
我的結論是 $ \beta = logit(2/3) $ .
提前致謝。
我將對這個問題添加我自己的答案,以闡明為什麼默認添加懲罰。我也在為後代發帖,因為你不是第一個被這個抓住的人,你也不會是最後一個。
早在 2019 年,Zachary Lipton 就發現 sklearn 也默認使用懲罰,這在推特和其他地方引發了一場非常激烈的爭論。該討論的長短在於 sklearn 首先將自己視為一個機器學習庫,這在他們眼中意味著他們更喜歡其他東西而不是公正性和效果估計。他們的哲學(在我看來)最引人注目的例子是當 Andreas Mueller直截了當地問為什麼有人想要一個不偏不倚的邏輯回歸實現時。推理根本不在他們的雷達上。
因此,
LogisticRegression
不是法律上的邏輯回歸。默認情況下,它是一種懲罰變體(默認懲罰甚至沒有任何意義)。還有一個尖銳的地方。如果您了解懲罰邏輯回歸(la ridge 回歸或 LASSO),您會驚訝地發現 sklearn 將懲罰參數參數化為正則化強度的倒數。因此設置 $ \lambda=2 $ 在 LASSO 或 Ridge 將對應於C=0.5
inLogisticRegression
。讓我通過使這一點完全明確來總結。
如果您打算估計某些協變量對二元結果的影響,並且您堅持使用 python Do Not Use Sklearn。使用 Statsmodels。
但是,如果您堅持使用 sklearn,請記住您需要
penalty='none'
在模型實例化步驟中進行設置。否則,您的估計將偏向於空值(按設計)。