Regression

sklearn邏輯回歸收斂到一個簡單案例的意外係數

  • July 1, 2021

案例如下:

假設

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.5in LogisticRegression

讓我通過使這一點完全明確來總結。

如果您打算估計某些協變量對二元結果的影響,並且您堅持使用 python Do Not Use Sklearn。使用 Statsmodels

但是,如果您堅持使用 sklearn,請記住您需要penalty='none'在模型實例化步驟中進行設置。否則,您的估計將偏向於空值(按設計)。

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

comments powered by Disqus