您正在处理数据集。您可以创建分类模型并立即获得90%的准确度。你觉得“很棒”。你深入一点,发现90%的数据属于一个类。该死的!
这是一个不平衡数据集的例子,它可能导致令人沮丧的结果。
在这篇文章中,您将发现可用于在具有不平衡数据的机器学习数据集上提供出色结果的策略。
挫折!
不平衡的数据可能会让您感到很沮丧。
当你发现你的数据有不平衡的类并且你认为你得到的所有好结果都变成了谎言时,你会感到非常沮丧。
当书籍,文章和博客文章似乎没有为您提供有关处理数据不平衡的良好建议时,下一波挫折就会出现。
放松,有很多选择,我们将全面介绍它们。您可以为不平衡数据构建预测模型。
什么是不平衡数据?
不平衡数据通常是指分类问题的问题,其中类没有被平等地表示。
例如,您可能有一个包含100个实例(行)的2类(二进制)分类问题。总共80个实例标记为Class-1,其余20个实例标记为Class-2。
这是一个不平衡的数据集,Class-1与Class-2实例的比例为80:20或更简洁,为4:1。
对于两类分类问题以及多类分类问题,您可能会遇到类不平衡问题。大多数技术都可以使用。
剩下的讨论将假设一个两类分类问题,因为它更容易思考和描述。
不平衡是常见的
大多数分类数据集在每个类中没有完全相同数量的实例,但是小的差异通常无关紧要。
有些问题是阶级不平衡不仅仅是常见的,而是预期的。例如,在那些表征欺诈性交易的数据集中,这些数据集是不平衡的。绝大多数交易将在“非欺诈”类中进行,而极少数交易将在“欺诈”类中。
另一个例子是客户流失数据集,绝大多数客户都使用该服务(“No-Churn”类),少数客户取消订阅(“Churn”类)。
如果上面的示例中存在类似4:1的适度类不平衡,则可能会导致问题。
准确性悖论
该精度悖论是在介绍这个主题的确切情况的名字。
在这种情况下,您的准确度测量可以说明您具有出色的准确性(例如90%),但准确性仅反映了潜在的阶级分布。
这是非常常见的,因为分类准确性通常是我们在评估分类问题模型时使用的第一个衡量标准。
把它全部放在红色!
当我们在不平衡的数据集上训练时,我们的模型中发生了什么?
正如您可能已经猜到的那样,我们在不平衡数据上获得90%准确度的原因(在Class-1中有90%的实例)是因为我们的模型会查看数据并巧妙地决定最好的做法是始终预测“1级”并实现高精度。
使用简单的基于规则的算法时最好看到这一点。如果在最终模型中打印出规则,您将看到它很可能预测一个类,而不管它被要求预测的数据。
打击不平衡训练数据的8种策略
我们现在了解什么是类不平衡,以及它为什么提供误导性的分类准确性。
那么我们有什么选择呢?
1)你能收集更多数据吗?
您可能认为这很愚蠢,但收集更多数据几乎总是被忽视。
你能收集更多数据吗?花点时间考虑一下您是否能够收集有关问题的更多数据。
较大的数据集可能会在类上显示不同且可能更平衡的视角。
稍后当我们查看重新采样数据集时,更多次要类的示例可能会有用。
2)尝试更改性能指标
准确性不是使用不平衡数据集时使用的指标。我们已经看到它具有误导性。
在使用不平衡类时,有一些指标可以告诉您更真实的故事。
在我的帖子“ 分类准确性不够:可以使用的更多性能指标 ”中,我提供了更多关于选择不同性能指标的建议。
在那篇文章中,我看了一个不平衡的数据集,它描述了患者乳腺癌复发的特征。
从那篇文章中,我建议查看以下性能测量,这些测量可以比传统的分类准确度更深入地了解模型的准确性:
- 混淆矩阵:将预测分解为表格,显示正确的预测(对角线)和不正确的预测类型(分配了不正确的预测类别)。
- 精度:分类器精确度的度量。
- 召回:分类器完整性的度量
- F1分数(或F分数):精确度和召回率的加权平均值。
我还建议你看一下以下内容:
- Kappa(或Cohen的kappa):分类精度由数据中类的不平衡归一化。
- ROC曲线:与精确度和回忆一样,精度分为灵敏度和特异性,可以根据这些值的平衡阈值选择模型。
您可以在我们的文章“ 评估和比较分类器性能与ROC曲线 ”中比较使用ROC曲线来比较分类准确性。
还不确定吗?从kappa开始,它将让您更好地了解正在发生的事情,而不是分类准确性。
3)尝试重新采样数据集
您可以更改用于构建预测模型的数据集,以获得更平衡的数据。
此更改称为对数据集进行采样,您可以使用两种主要方法来均衡类:
- 您可以从代表性不足的类中添加实例的副本,称为过采样(或更正式的替换采样),或
- 您可以从过度表示的类中删除实例,称为欠采样。
这些方法通常很容易实现并且运行速度快。他们是一个很好的起点。
事实上,我建议你总是在所有不平衡数据集上尝试这两种方法,只是为了看看它是否能提高你的首选精确度量。
您可以在维基百科文章“ 数据分析中的过采样和欠采样 ”中学到更多内容。
一些经验法则
- 当您拥有大量数据(数十或数十万个实例或更多)时,请考虑对欠采样进行测试
- 当您没有大量数据(数万条记录或更少)时,请考虑测试过采样
- 考虑测试随机和非随机(例如分层)抽样方案。
- 考虑测试不同的重采样比率(例如,您不必在二进制分类问题中以1:1的比例为目标,尝试其他比率)
4)尝试生成合成样品
生成合成样本的一种简单方法是从少数类中的实例中随机采样属性。
您可以在数据集中凭经验对它们进行采样,或者您可以使用像Naive Bayes这样的方法,可以在反向运行时独立地对每个属性进行采样。您将拥有更多不同的数据,但可能无法保留属性之间的非线性关系。
您可以使用系统算法生成合成样本。最流行的此类算法称为SMOTE或合成少数过采样技术。
顾名思义,SMOTE是一种过采样方法。它的工作原理是从次要类创建合成样本,而不是创建副本。该算法选择两个或更多个类似的实例(使用距离测量)并且通过差异内的相邻实例的随机量一次扰动实例一个属性。
了解有关SMOTE的更多信息,请参阅2002年原创的题为“ SMOTE:Synthetic Minority Over-sampling Technique ”的论文。
SMOTE算法有许多实现,例如:
- 在Python中,看看“ UnbalancedDataset ”模块。它提供了许多SMOTE实现以及您可以尝试的各种其他重采样技术。
- 在R中,DMwR包提供了SMOTE的实现。
- 在Weka中,您可以使用SMOTE监督过滤器。
5)尝试不同的算法
与往常一样,我强烈建议您不要在每个问题上使用您喜欢的算法。您应该至少在给定问题上对各种不同类型的算法进行抽样检查。
有关点检查算法的更多信息,请参阅我的文章“为什么你应该在机器学习问题上进行现场检查算法”。
话虽这么说,决策树通常在不平衡的数据集上表现良好。查看用于创建树的类变量的拆分规则可以强制解决这两个类。
如果有疑问,请尝试一些流行的决策树算法,如C4.5,C5.0,CART和随机森林。
对于使用决策树的R代码的一些示例,请参阅我的帖子“ 带有决策树的R中的非线性分类 ”。
有关在Python和scikit-learn中使用CART的示例,请参阅我的帖子“ 使用Scikit让你的手变脏 - 立即学习 ”。
6)尝试惩罚模型
您可以使用相同的算法,但为他们提供不同的视角。
惩罚分类会对模型造成额外成本,以便在培训期间对少数群体犯下分类错误。这些处罚可能会使模型偏向于更多地关注少数民族。
通常,类惩罚或权重的处理专用于学习算法。存在惩罚版本的算法,例如惩罚的SVM和惩罚的LDA。
也可以为惩罚模型提供通用框架。例如,Weka有一个CostSensitiveClassifier,可以包装任何分类器并应用自定义惩罚矩阵进行未命中分类。
如果您被锁定在特定算法中并且无法重新取样或者您的结果不佳,则需要使用惩罚。它提供了另一种“平衡”类的方法。设置惩罚矩阵可能很复杂。您很可能必须尝试各种惩罚方案,看看什么最适合您的问题。
7)尝试不同的观点
有专门针对不平衡数据集的研究领域。他们有自己的算法,措施和术语。
从这些角度看一看并思考你的问题有时会让一些想法失去理智。
您可能想要考虑的两个是异常检测和变化检测。
异常检测是罕见事件的检测。这可能是由于其振动或由系统调用序列指示的程序的恶意活动而指示的机器故障。与正常操作相比,这些事件很少见。
思维的这种转变将次要类别视为异常类,这可能有助于您考虑分离和分类样本的新方法。
变化检测类似于异常检测,除了寻找异常之外,它正在寻找变化或差异。这可能是使用模式或银行交易所观察到的用户行为的变化。
这两种转变都会对分类问题采取更实时的立场,这可能会为您提供一些思考问题的新方法,也许还有一些尝试的技巧。
8)尝试获得创意
真正爬进你的问题并思考如何将其分解为更容易处理的小问题。
为了获得灵感,请查看Quora上非常有创意的答案,回答“ 在分类中,您如何处理不平衡的训练集?”
例如:
将较大的类分解为较少数量的其他类...
...使用一类分类器......(例如像异常值检测一样处理)
......将不平衡的训练集重新取样到不是一个平衡集,而是几个。在这些集合上运行分类集合可以产生比单独一个分类器更好的结果
这些只是您可以尝试的一些有趣且富有创意的想法。
有关更多想法,请在reddit帖子“ 我80%的训练集属于一个班级时分类 ”中查看这些评论。
选择一种方法并采取行动
您不需要是算法向导或统计学家来从不平衡数据集构建准确可靠的模型。
我们已经介绍了许多可用于建模不平衡数据集的技术。
希望您可以从架子上立即应用一两个,例如更改精度指标和重新采样数据集。两者都很快,并会立即产生影响。
你打算尝试哪种方法?
最后一句话,从小开始
请记住,我们无法知道哪种方法最适合您以及您正在处理的数据集。
从小处着手,以你学到的东西为基础。