这是一个样本分布不均匀的数据集(即大多数样本来自一个类,而其他类中的样本要少得多)。一些例子是欺诈检测或罕见疾病检测。
不平衡数据集的问题在于,模型倾向于将所有示例归类为来自多数类。一般来说,在这种情况下,少数类中的例子比多数类中的例子分类正确更重要。
对训练集进行重采样是将不平衡数据集转换为平衡数据集的一种方式,可通过以下两种方法实现:
- **欠采样:**减少多数类以使其大小与另一类相似的方法。这种策略适用于大型数据集,因为新的平衡数据集只包含来自少数类的样本和从多数类中随机选择的元素。
- **过采样:**与上述方法相反,顾名思义。在这种情况下,稀有样本的数量会增加。新样本可以通过自举、重复或特定算法生成,例如 SMOTE 或 ADASYN 。与欠采样相比,过采样的计算代价可能很高。
另一种方法是创建一个模型集合,通过它可以在不丢失或增加数据的情况下消除不平衡。在这种方法中,丰富的类被分割成块。对于每个类,训练一个模型,并且最终结果是由来自所有模型的大多数投票给出的结果。这种方法是灵活的,因为在大多数情况下,块包含与稀有类一样多的样本,但是它们中的一些可以具有 1:2 或事件 3:1 的比率。
这是集成学习中最流行和最常用的类别之一。一般来说,Boosting 是一种非常有用的技术,但对于不平衡的数据更是如此。通过从以前的错误中学习,弱模型被转换为强模型。为什么这适合不平衡的数据集?因为每次连续的迭代给少数类提供了更高的权重。升压方法的例子有 AdaBoost 、 *XGBoost、*或 GradientBoost 。
在 Quora 上提出了一个原创想法。作者解释了如何以一种不那么随机的方式进行欠采样。多数类被分成聚类,聚类的数量大约是来自少数类的样本的数量。接下来,从多数类中选择的样本就是 medoids。medoid 类似于质心,但仅限于数据集的一部分。因此,数据集是平衡的,包含最相关的样本。
所有这些技术都可以单独或组合使用。一个简单的方法是使用不平衡学习 python 包。对于不平衡数据集产生的问题,这是一个非常有用的工具,有专门为这种数据集创建的方法。
已知朴素贝叶斯概率分类器(尤其是 ComplementNB)在不平衡数据上具有更好的结果。另一种解决方案可以是使用 SVM 算法。经典的 SVM 也许不会有预期的效果。但是通过改变 C ,这个衡量每个类重要性的参数,结果可以得到改善。
机器学习模型的一个重要方面是它的评估。即使对于某些模型而言,精度是一个受欢迎的选择,但对于使用不平衡数据集创建的模型而言,这是一个很大的问题。精度衡量有多少样本被正确分类,因此,即使大多数类总是被预测到,它也将具有非常高的值。合适的评估度量是 F1 分数,因为它被定义为精确度和召回率之间的调和平均值。
处理不平衡的数据很困难,但在某些情况下,这是不可避免的,也是至关重要的。在这种情况下,需要决定的最相关的两件事情是数据和可以应用的策略。