如何处理具有许多特征的二进制分类中的倾斜类?

机器算法验证 物流 二进制数据 偏度 不平衡类 scikit-学习
2022-03-20 21:43:26

我正在移动广告定位领域进行数据分析。我有大约18 个功能,对于这些功能的组合,结果是 True 或 False (1/0),具体取决于印象是否被点击。这里的问题是输出类是高度倾斜的。点击率约为0.4%(即值是 1 只有 4 出 1000 次)。我有一个200 万行的数据集,我使用 90% 作为训练集和 10% 作为测试集。我在python中使用了sckit-learn包中的逻辑回归. 现在在训练我的模型后,我将测试集的所有值都设为 0。请告诉我问题可能是什么,我应该怎么做才能解决它?

PS:我已经尝试增加我的数据集大小并减少特征数量(甚至只有一个特征)。如果我看到测试集中每个类(0/1)的概率,我得到大约 0.002 - 0.005 的 1。

谢谢

3个回答

前 18 个功能根本不是很多,您应该看看是否可以获得更多数据。谷歌在其广告定位中使用了大量荒谬的功能,并采用不同的在线/游戏理论方法来选择向受众展示的广告

其次,像这样倾斜的类标签是一个常见问题。要查看的搜索词包括不平衡或不平衡的分类和“偏斜不敏感”。您可以并且应该尝试多种方法:

  • 分层交叉验证以确保您最终在测试中获得足够多的阳性结果。
  • 正如其他人提到的那样,抽样不足/过度抽样或随机森林的装袋大致平衡。还有生成新的少数类样本和采样代表性多数类样本的方法。我在这里看到了一个 python 库。
  • 类加权或成本敏感学习可以很好地工作,并且有许多方法的版本可以做到这一点(尽管在 scikit learn 中没有)。
  • 提升(梯度或自适应)可以很好地工作。
  • 将数据视为正面和未标记的转导或一类方法可以很好地工作,尽管它们假设正面是更大类别的可能正面的成员。
  • Hellinger 距离决策树在处理不平衡数据方面获得了一些优势。

这些方法中的大多数从本质上反映了你更关心的是让积极的事情正确,而不是让消极的事情出错。在 scikit.learn 中,您可以在没有一些自定义代码的情况下尝试这些库的数量有限,但是如果您在谷歌周围搜索,还有很多其他库,尽管它们将使用多种语言。

我将尝试添加一些直觉,说明您为什么会得到这样的结果。考虑到所有此类分类任务,最好的结果是正确预测 100% 的结果,对吧?在您的情况下,对于 0.4% 与 99.6% 的类平衡,如果您预测每一行都为 0,那么您会自动获得 99.6% 的正确率。这是一个非常非常好的结果!

至于如何解决这些问题 - 据我所知,没有算法可以处理非常倾斜的类。因此,正如 DSea 所描述的,有两种方法可以接近它,一种是过采样,另一种是欠采样。

在过采样的情况下,您可以多次添加较小的类。如果您一开始就使用 1:250 的类比率,您可能希望选择较小的类 50 次,因此您最终会得到 50:250 或 1:5 的比率,这应该已经适用于大多数分类算法. 当然,您必须记住,正面类别的每个样本现在“重要”了 50 倍。

在采样不足的情况下,您将瞄准相似的比率,但只需从较大的班级中为每个较小的班级挑选 5 个随机样本即可实现这一目标。这里的缺点是您只查看整个数据集的一小部分。

所以有很多方法可以处理你拥有的数据,但一切都比一开始​​看起来要复杂一些:)

问题是班级平衡的偏差。您可以尝试的最简单的方法是减少训练集的多数类的大小。只是从多数类中随机抽样(不替换)N 个实例,其中 N 是少数类中的实例数。这称为“欠采样”。