具有不平衡类的sklearn逻辑回归

Posted

技术标签:

【中文标题】具有不平衡类的sklearn逻辑回归【英文标题】:sklearn logistic regression with unbalanced classes 【发布时间】:2013-01-29 13:32:25 【问题描述】:

我正在用 python 中的 sklearn 逻辑回归解决分类问题。

我的问题是一般/通用问题。我有一个包含两个类/结果(正/负或 1/0)的数据集,但该集合非常不平衡。有约 5% 的阳性和约 95% 的阴性。

我知道有很多方法可以处理这样的不平衡问题,但没有找到一个很好的解释来说明如何使用 sklearn 包正确实现。

到目前为止,我所做的是通过选择具有正面结果的条目和相同数量的随机选择的负面条目来构建平衡的训练集。然后我可以将模型训练到这个集合,但我不知道如何修改模型以处理原始不平衡的总体/集合。

执行此操作的具体步骤是什么?我翻遍了 sklearn 文档和示例,但没有找到很好的解释。

【问题讨论】:

【参考方案1】:

您是否尝试过传递给您的class_weight="auto" 分类器?并非 sklearn 中的所有分类器都支持这一点,但有些支持。检查文档字符串。

您还可以通过随机丢弃负样本和/或过度采样正样本(+ 可能会添加一些轻微的高斯特征噪声)来重新平衡数据集。

【讨论】:

是的,class_weight='auto' 效果很好。不使用内置/黑盒自动权重而是重新平衡训练集(就像我最初所做的那样)有什么好处吗?无论如何,如果我采用平衡训练集的方法,如何调整拟合/训练模型以应用于不平衡的测试集? 这不是那个黑匣子:它只是在算法优化的经验目标函数中重新加权样本。对过度表示的类进行欠采样是好的,因为训练速度更快 :) 但您丢弃的数据很糟糕,特别是如果您的模型已经处于过度拟合状态(训练和测试分数之间存在显着差距)。过采样通常在数学上等同于重新加权,但由于重复操作而速度较慢。【参考方案2】:

@agentscully 你看过下面的论文吗,

[SMOTE] (https://www.jair.org/media/953/live-953-2037-jair.pdf)。 我发现同样非常有用。这是Repo 的链接。 根据您平衡目标类的方式,您可以使用

'auto':(在较新的版本 0.17 中已弃用)或“balanced”或自己指定类比 0:0.1, 1:0.9。 'balanced':此模式与类频率成反比调整权重n_samples / (n_classes * np.bincount(y)

如果需要更多见解,请告诉我。

【讨论】:

以上是关于具有不平衡类的sklearn逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章

具有分类输出的逻辑回归 sklearn

为啥 auc 与 sklearn 和 R 的逻辑回归如此不同

python:如何在sklearn中使用逻辑回归系数构建决策边界

为啥 sklearn 中逻辑回归的等效 class_weights 会产生不同的结果?

如何在sklearn逻辑回归中设置样本权重?

在 sklearn 中计算管道逻辑回归 predict_proba