如何处理数据不平衡问题
前言
在您正在处理数据集时您可以创建分类模型并立即获得90%的准确度。你觉得“非常不错”。但是当你深入一点时,发现90%的数据属于一个类。
这是一个不平衡数据集的例子,它可能导致令人沮丧的结果。
当你发现你的数据有不平衡的类并且你认为你得到的所有好的结果都变成了错误的时候,你会感到非常沮丧。
当你发现大部分书籍,文章和博客文章似乎并没有为您提供有关处理数据不平衡的良好建议时,下一波挫折就会出现。
放松,这里有很多选择去解决数据不平衡问题,我们将全面介绍它们。您可以为不平衡数据构建预测模型。
什么是数据不均衡
数据不均衡通常是指在分类问题中,有某一类或者某几类数据与其他类别在数据量上不一致。
比如,你有一个100行的二分类数据集,其中属于类别1的数据占有80个,而属于类别2的数据只有20个。
这是一个不平衡的数据集,类别1与类别2的数据比例为80:20或更简洁,为4:1。
对于两类分类问题以及多类分类问题,您都可能会遇到类别数据不平衡的问题。
接下来的讨论将假设一个两类分类问题,因为它更容易思考和描述。
数据不平衡很常见
大多数分类数据集中每个类别的数据都没有完全相同数量的实例,但是小的差异通常无关紧要。
有些问题的数据不平衡问题是在我们预期内的。例如,在那些表征欺诈性交易的数据集中,这些数据集是不平衡的。绝大多数交易将在“非欺诈”类中进行,而极少数交易将在“欺诈”类中。另一个例子是客户流失数据集,绝大多数客户都使用该服务(“No-Churn”类),少数客户取消订阅(“Churn”类)。
如果上面的示例中存在类似4:1的类别数据不平衡,则可能会导致训练出现问题。
准确性悖论
准确性悖论是本文简介中确切情况的名称。
在这种情况下,您的准确度测量可以说明您具有出色的准确性(例如90%),但准确性仅反映了潜在的阶级分布。
这是非常常见的情况,因为分类准确性通常是我们在评估分类问题模型时使用的第一个衡量指标。
当我们在不平衡的数据集上训练时,我们的模型中发生了什么?
正如您可能已经猜到的那样,我们在不平衡数据上获得90%准确度的原因(在类别1中有90%的实例)是因为我们的模型会拟合数据并巧妙地决定最好的做法是始终预测“1级”并实现高精度。
使用简单的基于规则的算法时最好观察到这一点。如果在最终模型中输出规则,您将看到它很可能预测一个类别,而忽略其它被要求预测的数据。
解决不平衡训练数据的8种策略
我们现在了解了什么是数据类别不平衡,以及它为什么会提供误导性的分类准确性。
那么我们有什么操作可以避免这类问题带来的烦恼呢?
尝试收集更多数据
您可能认为这很愚蠢,但收集更多数据几乎总是被大家忽视。
你能收集更多数据吗?花点时间考虑一下您是否能够收集有关问题的更多数据。
较大的数据集很大可能会使不平衡数据被平衡。
尝试更改结果验证指标
在使用不平衡数据集时准确性不是最佳的指标。我们已经看到它具有误导性。
在使用不平衡类时,有一些指标可以告诉您更真实的训练情况。在帖子“分类准确性不够:可以使用的更多性能指标”中,文章中提供了更多关于选择不同性能指标的建议。
在那篇文章中,我接触了一个不平衡的数据集,它描述了患者乳腺癌复发的特征。
在那篇文章中,我建议查看以下性能测量,这些测量可以比使用传统的分类准确度更深入地了解模型的准确性:
- 混淆矩阵:将预测分解为表格,显示正确的预测(对角线)和不正确的预测类型(分配了不正确的预测类别)。
- 精确度:分类器精确度的度量。
- 召回率:分类器覆盖度的度量
- F1分数(或F分数):精确度和召回率的加权平均值。
我还建议你看一下以下内容:
- Kappa:度量两个被观测对象的一致程度。
- ROC曲线:与精确度和召回率一样,精度分为灵敏度和特异性,可以根据这些值的平衡阈值选择模型。
您可以在文章“评估和比较分类器性能与ROC曲线”中比较使用ROC曲线来比较分类准确性。
还不确定应该使用哪个指标吗?可以从kappa开始,它将让您更好地了解模型正在发生的事情,而不是分类准确性。
尝试重新采样数据集
您可以尝试改变用于构建预测模型的数据集,以获得更平衡的数据。
此更改变为对数据集进行采样,您可以使用两种主要方法来均衡类别:
- 您可以从代表性不足的类中添加实例的副本,称为过采样(或更正式的替换采样)
- 您可以从过度表示的类中删除实例,称为欠采样。
这些方法通常很容易实现并且不会占用太多时间。他们是一个很好的起点。
事实上,我建议你在所有不平衡的数据集上去尝试这两种方法,看看它是否能提高你的首选精确度量。
您可以在维基百科文章“数据分析中的过采样和欠采样”中了解到更多内容。
一些经验法则
- 当您拥有大量数据(数十或数百万个实例或更多)时,请考虑尝试欠采样
- 当您没有大量数据(数万条记录或更少)时,请考虑尝试过采样
- 考虑使用随机和非随机(例如分层)的采样方案。
- 考虑尝试不同的过采样比率(例如,您不必在二进制分类问题中以1:1的比例为目标,尝试其他比率)
尝试生成合成样本
生成合成样本的一种简单方法是从少数类中的实例中随机采样属性。
您可以在数据集中凭经验对它们进行采样,或者您可以使用像Naive Bayes这样的方法,可以在反向运行时独立地对每个属性进行采样。您将拥有更多不同的数据,但可能无法保留属性之间的非线性关系。
您可以使用系统算法生成合成样本。最流行的此类算法称为SMOTE或合成少数过采样技术。
顾名思义,SMOTE是一种过采样方法。它的工作原理是从次要类创建合成样本,而不是创建副本。该算法选择两个或更多个类似的实例(使用距离测量)并且通过差异内的相邻实例的随机量一次干扰实例的一个属性。
了解有关SMOTE的更多信息,请参阅2002年原创的题为“ SMOTE:Synthetic Minority Over-sampling Technique ”的论文。
SMOTE算法有许多实现,例如:
- 在Python中,使用“UnbalancedDataset”模块。它提供了许多SMOTE实现以及您可以尝试的各种其他重采样技术。
- 在R中,DMwR package提供了SMOTE的实现。
- 在Weka中,您可以使用SMOTE supervised filter。
尝试不同的算法
我强烈建议您不要在每个问题上都使用您喜欢的算法。您应该至少在给定问题上对各种不同类型的算法进行抽样检查。
有关抽查算法的更多信息,请参阅我的文章“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
话虽这么说,但决策树通常在不平衡的数据集上能够有良好的表现。查看用于创建树的类变量的拆分规则可以强制分开这两个类。
如果有疑问,请尝试一些流行的决策树算法,如C4.5,C5.0,CART和随机森林。
对于使用决策树的R代码的一些示例,请参阅帖子“Non-Linear Classification in R with Decision Trees”。
有关在Python和scikit-learn中使用CART的示例,请参阅帖子“Get Your Hands Dirty With Scikit-Learn Now ”。
尝试惩罚模型
您可以使用相同的算法,但为他们提供不同的惩罚视角。
惩罚分类会对模型造成额外成本,以便在训练期间对少数样本分类错误进行惩罚。这些处罚可能会使模型偏向于更多地关注少数样本。
通常,类惩罚或权重的处理专用于学习算法。存在惩罚版本的算法,例如penalized-SVM和penalized-LDA。
也可以为惩罚模型提供通用框架。例如,Weka有一个CostSensitiveClassifier,可以包装任何分类器并应用自定义惩罚矩阵进行未命中分类。
如果您被限制在特定算法中并且无法重新取样或者您的结果不佳,则需要使用惩罚。它提供了另一种“平衡”类的方法。设置惩罚矩阵可能很复杂。您很可能必须尝试各种惩罚方案,看看什么最适合您的问题。
尝试不同的观点
有专门针对不平衡数据集的研究领域。他们有自己的算法,度量和术语。
从这些角度看一看并思考你的问题有时会让您产生一些新的想法。
您可能想要考虑的两个是异常检测和变化检测。
异常检测是罕见事件的检测。这可能是由于其振动或由系统调用序列指示的程序的恶意活动而指示的机器故障。与正常操作相比,这些事件很少见。
思维的这种转变将次要类别视为异常类,这可能有助于您考虑分离和分类样本的新方法。
变化检测类似于异常检测,除了寻找异常之外,它正在寻找变化或差异。这可能是使用模式或银行交易所观察到的用户行为的变化。
这两种转变都会对分类问题采取更实时的立场,这可能会为您提供一些思考问题的新方法,也许还有一些尝试的技巧。
尝试获取创意
真正深入了解你的问题并思考如何将其分解为更容易处理的小问题。
为了获得灵感,请查看Quora上非常有创意的答案,回答“ 在分类中,您如何处理不平衡的训练集?”
例如:
将较大的类分解为较少数量的其他类...
...使用一类分类器......(例如像异常值检测一样处理)
......将不平衡的训练集重新取样到不是一个平衡集,而是几个。在这些集合上运行分类集合可以产生比单独一个分类器更好的结果
这些只是您可以尝试的一些有趣且富有创意的想法。
有关更多想法,请在reddit帖子“Classification when 80% of my training set is of one class”中查看这些评论。
选择一种方法并采取行动
您不需要是算法大师或统计学家来从不平衡数据集构建准确可靠的模型。
我们已经介绍了许多可用于建模不平衡数据集的技术。
希望您可以从上述方法中立即应用一两个,例如更改精度指标和重新采样数据集。两者都很快,并会立即产生影响。
你打算尝试哪种方法?
最后一句话,从小开始
请记住,我们无法知道哪种方法最适合您以及您正在处理的数据集。
您可以使用一些专家启发式方法来选择这种方法,但最后,我能给您的最佳建议是“成为科学家”并根据经验测试每种方法,并选择能够为您提供最佳结果的方法。
从小处着手,以你学到的东西为基础。
想要更多?进一步阅读…
如果您想更深入地了解一些关于处理课堂不平衡的学术文献,请查看下面的一些链接。
Books
Papers
- Data Mining for Imbalanced Datasets: An Overview
- Learning from Imbalanced Data
- Addressing the Curse of Imbalanced Training Sets: One-Sided Selection(PDF)
- A Study of the Behavior of Several Methods for Balancing Machine Learning Training Data
更多内容请看:https://www.sunjackson.com