`statsmodels` 和 `sklearn` 中的 Logit 估计器
Posted
技术标签:
【中文标题】`statsmodels` 和 `sklearn` 中的 Logit 估计器【英文标题】:Logit estimator in `statsmodels` and `sklearn` 【发布时间】:2014-09-15 11:30:58 【问题描述】:我很确定这是一项功能,而不是错误,但我想知道是否有办法使 sklearn
和 statsmodels
在他们的 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
是否提供推断(标准错误)或边际效应?
【问题讨论】:
【参考方案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 近似值。以上是关于`statsmodels` 和 `sklearn` 中的 Logit 估计器的主要内容,如果未能解决你的问题,请参考以下文章
为啥 `sklearn` 和 `statsmodels` 的 OLS 回归实现给出不同的 R^2?
Sklearn 和 StatsModels 给出了非常不同的逻辑回归答案
Python使用sklearn和statsmodels构建多元线性回归模型(Multiple Linear Regression)并解读
sklearn/statsmodels 奇异协方差矩阵下普通最小二乘的结果
为啥当 fit_intercept=False 时 Sklearn R-squared 与 statsmodels 不同?