如何计算逻辑回归系数的标准误差


18

我正在使用Python的scikit-learn来训练和测试逻辑回归。

scikit-learn返回自变量的回归系数,但不提供系数的标准误差。我需要这些标准误差来为每个系数计算Wald统计量,然后依次将这些系数进行比较。

我发现了一种关于如何计算逻辑回归系数的标准误差的描述(此处),但是很难理解。

如果您碰巧知道有关如何计算这些标准误差的简单明了的解释,并且/或者可以为我提供一个简单的解释,我将不胜感激!我并不是指特定的代码(尽管请随意发布任何可能有用的代码),而是对所涉及步骤的算法解释。


1
您是要Python代码获取标准错误,还是要如何(数学/算法上)计算SE以便自己完成?如果是前者,则此Q对于CV而言将是题外话(请参阅我们的帮助中心),但可能在Stack Overflow上是题外。如果是后者,它将在这里成为话题(但您可能不会获得任何代码建议)。请编辑您的Q来澄清这一点。如果是前者,我们可以为您迁移到SO(不过请不要交叉发布)。
gung-恢复莫妮卡

1
谢谢,龚 我故意在这里发布,因为我期望后者,但是我将进行编辑以阐明这一点。我提到过我正在使用scikit-learn在Python中工作,以防使用该软件的人可以给我一些特定的技巧。
Gyan Veda 2014年

嗨,@ GyanVeda,我现在正面临着同样的问题,请问您的最终解决方案是什么?
zyxue 2016年

Answers:


12

您的软件是否为您提供参数协方差(或方差-协方差)矩阵?如果是这样,则标准误为该矩阵对角线的平方根。你可能想咨询的教科书(或谷歌的大学讲义)如何获得为线性矩阵和广义线性模型。Vβ


1
对于广义线性模型案例,我无法在网上找到任何东西(也许我不知道正确的搜索词?)。救命?
凯文·H·林

3
这是我经过数分钟的搜寻后发现的。我的建议是首先了解如何在基本线性模型中计算参数方差。一旦知道了,对GLM的扩展就更容易了。都是一样,知道如何计算和知道如何通过软件包获取它们并不是同一回事。www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user

18

模型系数的标准误差是协方差矩阵对角线项的平方根。考虑以下:

  • 设计矩阵:

,其中, X Ĵ是的值 ĴX = [1x1,1x1,p1x2,1x2,p1xn,1xn,p]xi,jj个观测值的预测因子。i

(注意:这假设模型具有截距。)

  • 其中π代表类成员的观察预测概率V = [π^1(1π^1)000π^2(1π^2)000π^n(1π^n)]π^ii

协方差矩阵可以写成:

(XTVX)1

可以使用以下代码实现:

import numpy as np
from sklearn import linear_model

# Initiate logistic regression object
logit = linear_model.LogisticRegression()

# Fit model. Let X_train = matrix of predictors, y_train = matrix of variable.
# NOTE: Do not include a column for the intercept when fitting the model.
resLogit = logit.fit(X_train, y_train)

# Calculate matrix of predicted class probabilities.
# Check resLogit.classes_ to make sure that sklearn ordered your classes as expected
predProbs = resLogit.predict_proba(X_train)

# Design matrix -- add column of 1's at the beginning of your X_train matrix
X_design = np.hstack([np.ones((X_train.shape[0], 1)), X_train])

# Initiate matrix of 0's, fill diagonal with each predicted observation's variance
V = np.diagflat(np.product(predProbs, axis=1))

# Covariance matrix
# Note that the @-operater does matrix multiplication in Python 3.5+, so if you're running
# Python 3.5+, you can replace the covLogit-line below with the more readable:
# covLogit = np.linalg.inv(X_design.T @ V @ X_design)
covLogit = np.linalg.inv(np.dot(np.dot(X_design.T, V), X_design))
print("Covariance matrix: ", covLogit)

# Standard errors
print("Standard errors: ", np.sqrt(np.diag(covLogit)))

# Wald statistic (coefficient / s.e.) ^ 2
logitParams = np.insert(resLogit.coef_, 0, resLogit.intercept_)
print("Wald statistics: ", (logitParams / np.sqrt(np.diag(covLogit))) ** 2)

话虽如此,statsmodels如果您想访问很多“开箱即用”的诊断程序,可能会是一个更好的软件包。


2
为避免出现内存问题并考虑奇异矩阵的情况,您可以按以下方式更新代码V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
稳定鱼

6

如果您有兴趣进行推理,那么您可能希望看看statsmodels。提供标准错误和常规统计检验。这是一个逻辑回归示例


感谢您的推荐!我将研究statsmodels。太糟糕了,scikit-learn无法提供这种输出。
Gyan Veda 2014年

1
是的 机器学习型工具箱通常不是为(惯常的)假设检验提供工具的目的。如果您遇到了无法在statsmodels中正常运行但在scikit-learn中有效的数据大小约束,我很想在github上了解它们。
jseabold 2014年

@jseabold但是,如果您想在逻辑回归中获得一些特征重要性的临时概念,则不能不考虑其标准误差就直接读出效应大小(系数)。因此,即使您不进行频率测试,也只是想要一些效果大小和鲁棒性的指示,但sklearn缺少方差输出仍然是一个挑战。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.