逻辑回归作为回归的 Python 实现(不是分类!)

Posted

技术标签:

【中文标题】逻辑回归作为回归的 Python 实现(不是分类!)【英文标题】:Python Implementation of Logistic Regression as Regression (Not Classification!) 【发布时间】:2021-03-23 21:50:31 【问题描述】:

我有一个回归问题,我想使用逻辑回归 - 而不是逻辑分类 - 因为我的目标变量 y 是介于 0 和 1 之间的连续量。但是,Python 中逻辑回归的常见实现似乎是排他性的逻辑分类。我还查看了 GLM 实现,但似乎没有一个实现了 sigmoid 链接功能。有人可以指出我将逻辑回归作为回归算法的 Python 实现方向吗?

【问题讨论】:

看到这个帖子:***.com/questions/57887904/… 这篇文章正是我的问题,答案没有帮助。 Logistic Regression 是一种回归模型——人们可能会将其用于分类,但在这里,我想将其用作回归模型。 如果目标变量不是离散类,sklearn 拒绝拟合逻辑回归。我的目标不是离散类。 逻辑回归“应该用于”分类问题的流行观点令人沮丧。从来没有给出任何理由,并且有很多系统您可能希望在其上安装 sigmoid。未来的读者请注意,这是一种没有渗透到其他领域的教条主义立场 我想使用 GLM 库,这样我就可以很好地总结参数、它们的 p 值等。 【参考方案1】:

在 statsmodels 中,具有家族二项式的 GLM 和离散模型 Logit 都允许连续目标变量,只要值限制在区间 [0, 1] 内。

同样,泊松对非负值连续数据建模非常有用。

在这些情况下,模型是通过准最大似然 QMLE 而不是 MLE 估计的,因为分布假设不正确。尽管如此,我们可以正确(一致地)估计平均函数。推理需要基于错误指定的稳健标准错误,可作为fit 选项cov_type="HC0" 使用

这是一个带有示例的笔记本 https://www.statsmodels.org/dev/examples/notebooks/generated/quasibinomial.html

QMLE 和分数 Logit 的一些背景问题 https://www.github.com/statsmodels/statsmodels/issues/2040QMLE https://github.com/statsmodels/statsmodels/issues/2712

参考

Papke, L.E.和 Wooldridge, J.M. (1996),分数响应变量的计量经济学方法与 401(k) 计划参与率的应用。 J.应用。经济学,11:619-632。 https://doi.org/10.1002/(SICI)1099-1255(199611)11:63.0.CO;2-1

更新和警告

截至 statsmodels 0.12

再调查一下,我发现离散 Probit 不支持连续区间数据。它使用计算捷径,假设因变量的值为 0 或 1。但是,在这种情况下它不会引发异常。 https://github.com/statsmodels/statsmodels/issues/7210

离散 Logit 可以正确地用于优化方法“newton”的连续数据。对数似然函数本身使用与 Probit 类似的计算快捷方式,但不使用 Logit 的导数和其他部分。

GLM-Binomial 是为区间数据设计的,没有问题。目前唯一的数值精度问题是probit链接的Hessian,它使用数值导数并且不是很精确,这意味着在GLM-Probit中可以很好地估计参数但标准误差可能会有数值噪声。

更新 statsmodels 0.12.2 的两个变化: 如果响应不是整数值,Probit 现在会引发异常,并且 GLM Binomial with Probit 链接使用改进的 Hessian 导数,现在的精度类似于离散 Probit。

【讨论】:

作为后续问题,使用.fit_regularized() 意味着我似乎无法使用.summary()。你知道在使用正则二项式 GLM 时如何获取摘要吗? summary 不适用于 GLM fit_regularized,主要是因为 L1 惩罚估计的推理很困难。对于中等规模的样本,标准误和检验统计数据不可靠。【参考方案2】:

对不起,如果我没有关注,但逻辑分类是建立在逻辑回归上的(加上一些分类规则)。我之前用过Sklearnstatsmodels。如果您需要,here 提供了一个简单的教程。简而言之,您可以使用任一

import statsmodels.api as sm
mod = sm.Logit(y, x)
result = logit_model.fit()
result.summary()

from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression
mod2 = log_reg.fit(x, y)  # assuming x and y are colums from a pandas df
print(clf.coef_, clf.intercept_)

【讨论】:

如果我理解正确,sklearn 的LogisticRegression 要求目标变量y 为0/1。我的值是连续的,介于 0 和 1 之间。 我相信与 statsmodels 相同。但是,如果我错了,请纠正我。 我可能对 statsmodel 有误。目前正在调查。我无法让family=sm.families.Logit() 工作 我认为正确的组合是sm.GLM(..., link=sm.genmod.families.links.logit) 啊,抱歉。我误读了你的问题。你想做什么?如果您没有 0-1 因变量,逻辑回归可能不是正确的选择。

以上是关于逻辑回归作为回归的 Python 实现(不是分类!)的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 逻辑回归中使用分类数据作为特征

python逻辑回归(logistic regression LR) 底层代码实现 BGD梯度下降算法 softmax多分类

如何使用 python 运行具有分类特征的 Spark 逻辑回归?

逻辑回归理解及代码实现

python实现随机森林逻辑回归和朴素贝叶斯的新闻文本分类

逻辑回归 算法推导与基于Python的实现详解