处理二进制分类中的类不平衡

时间:2014-10-06 17:14:25

标签: python r machine-learning classification

以下是我的问题的简要说明:

  1. 我正在进行监督学习任务,以训练二进制分类器。
  2. 我有一个大型不平衡分布的数据集:每个正面有8个负面实例。
  3. 我使用 f-measure ,即特异性和灵敏度之间的调和平均值来评估分类器的性能。
  4. 我绘制了几个分类器的ROC图,并且都表现出很好的AUC,这意味着分类很好。但是,当我测试分类器并计算f-measure时,我得到一个非常低的值。我知道这个问题是由数据集的类偏度引起的,到现在为止,我发现了两个处理它的选项:

    1. 通过为数据集的实例分配权重来采用对成本敏感的方法(请参阅此post
    2. 阈值分类器返回的预测概率,以减少误报和漏报的数量。
    3. 我选择了第一个选项,这解决了我的问题(f-measure令人满意)。但是,现在,我的问题是:哪种方法更可取?有什么区别?

      P.S:我正在使用Python和scikit-learn库。

1 个答案:

答案 0 :(得分:29)

加权(成本敏感)和阈值处理都是成本敏感型学习的有效形式。简而言之,您可以将两者想象如下:

称重

基本上有人断言,对稀有类别进行错误分类的“成本”比对公共类进行错误分类更糟糕。在SVM,ANN和Random Forest等算法中,在算法级别应用。这里的限制包括算法是否可以处理权重。此外,这方面的许多应用试图解决进行更严重的错误分类的想法(例如,将患有胰腺癌的人分类为无癌症)。在这种情况下,您知道为什么要确保即使在不平衡的设置中也要对特定类进行分类。理想情况下,您希望像任何其他模型参数一样优化成本参数。

阈值

如果算法返回概率(或其他一些分数),则可以在构建模型后应用阈值。基本上,您将分类阈值从50-50更改为适当的权衡级别。这通常可以通过生成评估度量的曲线(例如,F-度量)来优化。这里的限制是你正在做出绝对的权衡。截止值的任何修改都将降低预测其他类别的准确性。如果您的大多数普通班级的概率非常高(例如大多数超过0.85),那么您更有可能使用此方法取得成功。它也与算法无关(假设算法返回概率)。

取样

采样是应用于不平衡数据集的另一种常见选项,可为类分布带来一些平衡。基本上有两种基本方法。

<强> 副取样

提取较小的多数实例集并保留少数。这将导致较小的数据集,其中类之间的分布更接近;但是,您丢弃了可能有价值的数据。如果您有大量数据,这也可能是有益的。

<强> 过采样

通过复制它们来增加少数群体实例的数量。这将导致更大的数据集保留所有原始数据,但可能会引入偏差。但是,当您增加大小时,您可能也会开始影响计算性能。

高级方法

还有一些更复杂的方法可以帮助解决潜在的偏见。其中包括此SMOTE中有关不平衡数据集和CSL的SMOTEBoostEasyEnsembleprior question等方法。

模型构建

关于使用不平衡数据构建模型的另一个注意事项是,您应该牢记您的模型指标。例如,F-measures等指标未考虑真实的负利率。因此,通常建议在不平衡的设置中使用Cohen’s kappa metric等指标。