1 回答

TA貢獻1780條經驗 獲得超5個贊
您的代碼存在一些問題。
首先,您在此處顯示的兩個模型并不相同:盡管您適合 scikit-learn LogisticRegression
(fit_intercept=True
這是默認設置),但您不會使用 statsmodels 模型;來自 statsmodels文檔:
默認情況下不包含攔截,應由用戶添加???code>statsmodels.tools.add_constant。
這似乎是一個常見的混淆點 - 例如scikit-learn 和 statsmodels - 哪個 R 平方是正確的?(也有自己的答案)。
另一個問題是,盡管您處于二元分類設置中,但您要求multi_class='multinomial'
在您的 中LogisticRegression
,但事實并非如此。
第三個問題是,正如相關的交叉驗證線程邏輯回歸:Scikit Learn vs Statsmodels中所解釋的那樣:
沒有辦法在 scikit-learn 中關閉正則化,但是您可以通過將調整參數 C 設置為較大的數字來使其無效。
這使得這兩個模型在原則上再次不可比,但您已經通過設置在此處成功解決了這個問題C=1e8
。事實上,從那時起(2016 年),scikit-learn 確實添加了一種關閉正則化的方法penalty='none'
,根據文檔,通過設置 since :
如果為“無”(liblinear 求解器不支持),則不應用正則化。
現在應該將其視為關閉正則化的規范方法。
因此,將這些更改合并到您的代碼中,我們有:
np.random.seed(42) # for reproducibility
#### Statsmodels
# first artificially add intercept to x, as advised in the docs:
x_ = sm.add_constant(x)
res_sm = sm.Logit(y, x_).fit(method="ncg", maxiter=max_iter) # x_ here
print(res_sm.params)
這給出了結果:
Optimization terminated successfully.
Current function value: 0.403297
Iterations: 5
Function evaluations: 6
Gradient evaluations: 10
Hessian evaluations: 5
[-1.65822763 3.65065752]
數組的第一個元素是截距,第二個元素是 的系數x。而對于 scikit 學習,我們有:
#### Scikit-Learn
res_sk = LogisticRegression(solver='newton-cg', max_iter=max_iter, fit_intercept=True, penalty='none')
res_sk.fit( x.reshape(n, 1), y )
print(res_sk.intercept_, res_sk.coef_)
結果是:
[-1.65822806] [[3.65065707]]
在機器的數字精度范圍內,這些結果實際上是相同的。
對不同的值重復該過程np.random.seed()不會改變上面顯示的結果的本質。
添加回答
舉報