【问题标题】:Logit estimator in `statsmodels` and `sklearn``statsmodels` 和 `sklearn` 中的 Logit 估计器
【发布时间】:2014-09-15 11:30:58
【问题描述】:

我很确定这是一项功能,而不是错误,但我想知道是否有办法使 sklearnstatsmodels 在他们的 logit 估计值中匹配。一个很简单的例子:

import numpy as np
import statsmodels.formula.api as sm
from sklearn.linear_model import LogisticRegression

np.random.seed(123)

n = 100
y = np.random.random_integers(0, 1, n)
x = np.random.random((n, 2))
# Constant term
x[:, 0] = 1.

statsmodels 的估计:

sm_lgt = sm.Logit(y, x).fit()
    Optimization terminated successfully.
             Current function value: 0.675320
             Iterations 4
print sm_lgt.params
    [ 0.38442   -1.1429183]

还有sklearn的估计:

sk_lgt = LogisticRegression(fit_intercept=False).fit(x, y)
print sk_lgt.coef_
    [[ 0.16546794 -0.72637982]]

我认为这与sklearn 中的实现有关,它使用了某种正则化。有没有像statsmodels 那样估计准系统logit 的选项(它的速度要快得多,并且可以更好地扩展)。另外,sklearn 是否提供推断(标准错误)或边际效应?

【问题讨论】:

    标签: python statistics scikit-learn statsmodels logistic-regression


    【解决方案1】:

    是否可以像 statsmodels 那样估计准系统 logit

    您可以将C(逆正则化强度)参数设置为任意高的常数,只要它是有限的:

    >>> sk_lgt = LogisticRegression(fit_intercept=False, C=1e9).fit(x, y)
    >>> print(sk_lgt.coef_)
    [[ 0.38440594 -1.14287175]]
    

    关闭正则化是不可能的,因为底层求解器 Liblinear 不支持。

    另外,sklearn 是否提供推断(标准错误)或边际效应?

    没有。有一个添加这个的提议,但它还没有在主代码库中。

    【讨论】:

      【解决方案2】:

      作为补充说明,当我的矩阵共线时,我正在努力解决结果的差异。显然,这意味着应该进行一些额外的预处理才能获得可靠的结果,但我仍然希望找出为什么我使用 sklearn 得到了结果但 statsmodels 出错了。

      简短的回答:在 statsmodels 中调用 fit 时设置 solver='bfgs' 与 sklearn 模型的结果几乎相同,即使在共线变量的情况下也是如此(一旦注意到 sm 的默认值是不截距这一事实, sklearn 的默认值适合截距)

      示例(改编自 OLS 上的 similar question):

      import numpy as np
      import statsmodels.api as sm
      from sklearn.linear_model import LogisticRegression
      
      np.random.seed = 237
      num_samples=1000
      X=np.random.random((num_samples, 2))
      X[:, 1] = 2*X[:, 0]
      X_sm = sm.add_constant(X)
      
      beta = [1, -2, .5]
      error = np.random.random(num_samples)
      y = np.round(1/(1+np.exp( -(np.dot(X_sm, beta)) + error   )))  # y = 1/(1+exp(-beta*x))
      
      lr = LogisticRegression(C=1e9).fit(X, y)
      
      print "sklearn:"
      print lr.intercept_
      print lr.coef_
      
      print "statsmodels:"
      print sm.Logit(y, X_sm).fit(method='bfgs').params  # method='nm' or default method errors out
      

      (PS 如果有人对这两个求解器背后的数学和结果的可靠性有 cmet,我很想听听!我觉得有趣的是 sklearn 甚至没有为此发出警告......)

      【讨论】:

      • 基于公认的答案 scikit-learn 使用正则化,它也适用于奇异或未定问题。 statsmodels 中的 Logit 和类似方法使用不受惩罚的估计,这不适用于奇异设计矩阵。如果优化收敛,那么它只是一个(任意)解,但 Hessian 将不可逆。默认 Newton 方法在优化期间使用 Hessian 并且会中断。 bfgs 可能会起作用,因为它使用了可能是正定的 Hessian 近似值。
      猜你喜欢
      • 2019-01-08
      • 2023-04-09
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2020-09-06
      • 2016-06-18
      相关资源
      最近更新 更多