【问题标题】:Complete separation of logistic regression data逻辑回归数据的完全分离
【发布时间】:2019-06-07 05:47:21
【问题描述】:

我一直在 SAS 中运行一些大型逻辑回归模型,需要 4 个多小时才能收敛。但是最近我获得了对 Hadoop 集群的访问权限,并且可以使用 Python 更快地拟合相同的模型(大约需要 10-15 分钟)。

有问题的是,我的数据中有一些完整/准完整的数据点分离,导致无法收敛;尽管如此,我在 SAS 中使用 FIRTH 命令来生成可靠的参数估计,但是在 sklearn 或 statsmodels 中似乎没有 Python 的等效选项(我主要使用后者)。

有没有其他方法可以在 Python 中解决这个问题?

【问题讨论】:

  • 请说明您的数据是什么以及您想要什么。代码转换或代码等价物很难回答。
  • 除非您有先验信息表明您的问题域最好由逻辑回归模型表示,否则您可能会考虑另一种公式,即每个类都由高斯 blob p(x|c_k) 表示每个类 k = 0、1 等。然后通过贝叶斯规则,后验类概率只是 p(c_k|x)。当协方差相等时,相等 p(c_k|x) 的表面是平面,因为它们在逻辑回归中。更一般地,当协方差不相等时,相等 p(c_k|x) 的曲面是圆锥截面。如果只需要分类模型,值得考虑。
  • 高斯斑点在密度上重叠的程度(即可用数据彼此之间的距离不太远,相对于每个斑点的直径),将有一个类的平滑梯度到另一个,所以即使数据点是分开的,你也不会有数值问题。除非,正如我所说,点的类别是广泛分开的。在这种情况下,您可以为每个类协方差的每个维度添加一个常量,以使它们重叠;这相当于一个正则化项。

标签: python machine-learning statistics logistic-regression statsmodels


【解决方案1】:

AFAIK,Python 中没有可用的 Firth 惩罚。 Statsmodels 有一个未解决的问题,但目前没有人在处理它。

作为替代方案,可以使用不同类型的惩罚,例如在 sklearn 或 statsmodels 中可用。

另一个选项是更改观察到的响应变量。 Firth 可以通过扩充数据集来实现。但是,我不知道 Python 中有任何方法或原型。

https://github.com/statsmodels/statsmodels/issues/3561

Statsmodels 一直在进行惩罚方面的工作,但目前的重点是特征/变量选择(弹性网络,SCAD)和广义加法模型 GAM 的二次惩罚,尤其是样条。

Firth 使用与数据相关的惩罚,它不适合通用惩罚框架,其中惩罚结构是与数据无关的“先验”。

【讨论】:

    【解决方案2】:

    条件似然是解决完美分离的另一种方法。这是一个基本上可以使用的 Statsmodels PR:

    https://github.com/statsmodels/statsmodels/pull/5304

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2021-09-28
      • 2019-03-02
      • 2016-09-13
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多