如何处理神经网络中的类别不平衡?

数据挖掘 神经网络 分类 强化学习 阶级失衡
2022-03-10 05:46:04

假设我们有一个游戏,它的动作空间包含两个可能的动作:AB

我们有一个状态-动作对的标记数据集,但 95% 的动作是A,只有 5% 是B

如果我们训练一个神经网络,它总是会输出A,因为它会选择最可能的类别来减少它的损失。

有没有办法解决这个问题?

4个回答

这是用于分类的,我不确定是否可以将它们扩展到强化学习。

如您所见,准确性不应用作数据集的指标,因为数据集与您拥有的数据集一样不平衡。相反,您应该查看一个指标,例如曲线下面积 (AUC)。如果您有无限的数据,那么您可以重新平衡并从具有最多样本的类中删除一些数据。但是,在许多情况下,数据是稀疏的,您希望尽可能多地使用它。删除数据可能会对许多应用程序产生灾难性影响。

那么有什么好的和方便的方法来处理这个呢?

  • 为损失函数添加权重。A 类一个权重,B 类一个权重。通过增加 B 类的损失幅度,模型不应该陷入只预测一个类的次优解决方案中。

  • 使用另一个目标(损失)函数。例如,可以实现 F1 分数并将其用作目标(损失)函数。

这些方法的优点在于它允许您使用所有数据。

您已用 标记了问题reinforcement-learning,但您描述了一个标记的数据集,建议进行监督学习。我将尝试涵盖这两种情况。

有一些技术适用于监督学习和强化学习:

  • 从缓冲区中对操作进行调节的样本,以获得关于所采取操作的平衡数据集。
  • 在少数动作类上应用数据增强技术。Synthetic Minority Oversampling TEchnique (SMOTE)算法可能是一种选择。数据增强的问题是您需要在 RL 循环中进行,这会增加所需的计算时间。

请注意,要将它们应用于强化学习,您应该使用回放缓冲区,就像他们在DeepMind Atari 论文中所做的那样。

如果您处于监督学习场景中,您可以应用类权重,例如Keras 中的这个示例

正如人们上面提到的那样,您想尝试上采样/引导。换句话说,您想尝试让类具有相似的比例。一种方法是简单地随机选择不太可能的样本。

更复杂的解决方案: 1. 向不太可能的类别添加真实噪声以增加数据点的数量。2. 使用不同的分数/误差函数 - 查看平衡准确度 3. 使用 50% A 和 50% B 开始训练 - 一旦收敛,开始在数据集的较大部分逐渐训练,逐渐变为 95% A和 5% B。

对于不平衡类,我最喜欢的方法是引导。

  1. 假设您有 n 个类,示例数量为 m 、 2m 、 3m (这只是为了说明哪个是最小值)。

  2. 使用来自每个类的 m 个样本创建多个数据集。(随机)

  3. 继续训练他们每一个人。