不平衡的训练集与较小的平衡训练集?

数据挖掘 机器学习 深度学习
2021-10-02 06:33:33

假设我正在使用最大似然方法,并且我的输出单元计算一个 softmax 函数。我的训练集分布如下,分为 6 个类:

class_samples[0]=23, class_samples[1]=5, class_samples[2]=44, 
class_samples[3]=14, class_samples[4]=19, class_samples[5]=31

我该怎么办?

  1. 使用上面给出的训练集和归一化权重平衡(例如使用sklearn.utils.class_weight.compute_class_weight)。

  2. 还是我应该简单地使用一个类中的最小样本数(即 5 个)来提取样本的平衡分布?

为什么我应该选择一个而不是另一个?直觉上,我认为使用尽可能多的训练示例是更好的选择。但是,我尝试进行一些计算,但我未能证明使用所有具有标准化权重平衡的示例会更好。

我当然试图做一些繁重的研究,但由于某种原因我找不到答案。如果您知道一篇好文章,我会接受参考作为答案,就像我会接受“自制”答案一样!

2个回答

没有足够的数据样本用于机器学习。最有可能的是,在如此少的样本上训练的任何模型都无法泛化。

您应该收集更多数据。

为什么我应该选择一个而不是另一个?

你应该从你的数据集中准备一个通用的验证集,并在你的数据集上尝试每一种方法。

以下是我知道的处理不平衡数据集的方法。-

  1. 使用加权交叉熵损失(如您所述)

    • 你可以为你的损失分配权重,这样它对小类的惩罚会更大,对大类的惩罚更少。许多框架都有一个非常简单的方法来做到这一点。
    • 在 Scikit-learn 中,您可以查看 class_weight 参数。例如 -随机森林
    • 以下是如何在 Pytorch 中使用它
    • 是在 Keras 中使用它的方法
  2. 使用焦点损失

    • 最初提出用于对象检测,但我们也可以将其用于任何其他用例。在此处阅读有关它的更多信息
    • 以下是如何在 Pytorch 中使用它进行多类分类
    • 是在 Keras 中使用它的方法
  3. 过采样和欠采样

    • 这有很多技术,请查看imblearn一个专门用于处理不平衡数据集的库。
  4. 为小班创建单独的模型

    • 如果您有一些实例数量很少的类,您可以考虑为这些小类创建一个单独的分类器(例如,称为 small_classifier)。您可以将这些小类归为一个类(例如称为 small_class),以便您的主分类器将 small_class 与数据集中的所有其他大类进行分类。如果您的主分类器遇到 small_class 的任何实例,它将把它传递给 small_classifier,它将预测 small_class 实例的实际类。这种技术可以提高准确性,现在主分类器不需要处理非常小的类,而 insted small_classifier 将只关注这些小类。