1 回答

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