如何处理类别不平衡问题

转自 https://zhuanlan.zhihu.com/p/32940093

三种方法:

  • 对较多的那个类别进行欠采样(under-sampling),舍弃一部分数据,使其与较少类别的数据相当
  • 对较少的类别进行过采样(over-sampling),重复使用一部分数据,使其与较多类别的数据相当
  • 阈值调整(threshold moving),将原本默认为0.5的阈值调整到 较少类别/(较少类别+较多类别)即可

当然很明显我们可以看出,第一种和第二种方法都会明显的改变数据分布,我们的训练数据假设不再是真实数据的无偏表述。在第一种方法中,我们浪费了很多数据。而第二类方法中有无中生有或者重复使用了数据,会导致过拟合的发生。

因此欠采样的逻辑中往往会结合集成学习来有效的使用数据,假设正例数据n,而反例数据m个。我们可以通过欠采样,随机无重复的生成(k=n/m)个反例子集,并将每个子集都与相同正例数据合并生成k个新的训练样本。我们在k个训练样本上分别训练一个分类器,最终将k个分类器的结果结合起来,比如求平均值。这就是一个简单的思路,也就是Easy Ensemble [5]。

但不难看出,其实这样的过程是需要花时间处理数据和编程的,对于很多知识和能力有限的人来说难度比较大。特此推荐两个简单易行且效果中上的做法:

  • 简单的调整阈值,不对数据进行任何处理。此处特指将分类阈值从0.5调整到正例比例
  • 使用现有的集成学习分类器,如随机森林或者xgboost,并调整分类阈值

提出这样建议的原因有很多。首先,简单的阈值调整从经验上看往往比过采样和欠采样有效 [6]。其次,如果你对统计学知识掌握有限,而且编程能力一般,在集成过程中更容易出错,还不如使用现有的集成学习并调整分类阈值。

 

一个简单但有效的方案

经过了上文的分析,我认为一个比较靠谱的解决方案是:

  1. 不对数据进行过采样和欠采样,但使用现有的集成学习模型,如随机森林
  2. 输出随机森林的预测概率,调整阈值得到最终结果
  3. 选择合适的评估标准

这种方法难度很低,也规避了不少容易出错的地方。我们使用了集成学习降低过拟合风险,使用阈值调整规避和采样问题,同时选择合适的评估手段以防止偏见。而且这些都是现成的模型,5-10行的python代码就可以实现。有兴趣的朋友可以在这个基础上进行更多探索,而把这个结果作为一个基准(baseline)。

当然,更多复杂的操作是可以的,比如[7]就在欠采样集成后使用了逻辑回归作为集成分类器来学习不同子训练集的权重,并通过L1正则自动舍弃掉一部分基学习器。当然,我很怀疑这种结果是否比得上简单的处理模式。最重要的是,大部分机器学习实践者还不具备调整模型结构能力,因此花过多的时间在复杂模型上容易入不敷出。

 

你可能感兴趣的:(机器学习)