如何解决数据中的imbalancee问题

引言:

在这周里我遇到了imbalance label的问题,在此之前我并没有遇到这个问题。
以之前的分类问题来看,由于大部分人正常的状态之后一些,例如人大部分时候都是在坐着,只是偶尔的时候才会选择进行站着之类的动作。在这种情况之下,我们得知学习出好的分类器是很难的,而且得到的结论也是具有很大迷惑性的。

根据之前的场景来说,导致我们的分类器总是将其预测为坐着,但是由于站着的例子很少,导致我们依然会有99%的正确率,在这种情况我们如何解决?

所以我们迫切想要进行解决的问题是:如何在数据是imbalance的情况下,得到一个准确的分类器。

传统的分类评估标准

对于一般的数据我们一般使用的准确率进行判断。但是我们往往会忘记这种情况下是需要数据是平衡的,而且正负例子数目要接近,且在二分类的情况下是以0.5作为阈值进行划分的。

如何应对这种局面呢?最简单粗暴的方式无疑是==进行绘制ROC曲线,并求其面积。==

如何解决imbalance问题:

经过谷歌的搜索,我发现了一下的方式:

  • 对数据进行采用的过程中通过相似性同时生成并插样“少数类别数据”,叫做SMOTE算法
  • 对数据先进行聚类,再将大的簇进行随机欠采样或者小的簇进行数据生成
  • 把监督学习变为无监督学习,舍弃掉标签把问题转化为一个无监督问题,如异常检测
  • 先对多数类别进行随机的欠采样,并结合boosting算法进行集成学习

但在一般的工业内处理的方式为:

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

第一种方法,个人觉得试用范围在于数据样本充足,丢弃掉一部分同样也有足够的数据量。第二种方法适用于例子非常少的情况下。第一种和第二种方法都会明显的改变数据分布,我们的训练数据假设不再是真实数据的无偏表述。在第一种方法中,我们浪费了很多数据。而第二类方法中有无中生有或者重复使用了数据,会导致过拟合的发生。

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

最终选择的方法

以上的方法并不是非常适合我们进行学习:

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

总结

最终我使用的方法是:

  1. 尽量减少统计的方法,使用现在现成的集成学习模型:随机森林

  2. 输出随机森林的预测概率,调整阈值得到最终结果

  3. 在选择合适的评价标准,例如ROC