假设我们有一个游戏,它的动作空间包含两个可能的动作:A
和B
。
我们有一个状态-动作对的标记数据集,但 95% 的动作是A
,只有 5% 是B
如果我们训练一个神经网络,它总是会输出A
,因为它会选择最可能的类别来减少它的损失。
有没有办法解决这个问题?
假设我们有一个游戏,它的动作空间包含两个可能的动作:A
和B
。
我们有一个状态-动作对的标记数据集,但 95% 的动作是A
,只有 5% 是B
如果我们训练一个神经网络,它总是会输出A
,因为它会选择最可能的类别来减少它的损失。
有没有办法解决这个问题?
这是用于分类的,我不确定是否可以将它们扩展到强化学习。
如您所见,准确性不应用作数据集的指标,因为数据集与您拥有的数据集一样不平衡。相反,您应该查看一个指标,例如曲线下面积 (AUC)。如果您有无限的数据,那么您可以重新平衡并从具有最多样本的类中删除一些数据。但是,在许多情况下,数据是稀疏的,您希望尽可能多地使用它。删除数据可能会对许多应用程序产生灾难性影响。
那么有什么好的和方便的方法来处理这个呢?
为损失函数添加权重。A 类一个权重,B 类一个权重。通过增加 B 类的损失幅度,模型不应该陷入只预测一个类的次优解决方案中。
使用另一个目标(损失)函数。例如,可以实现 F1 分数并将其用作目标(损失)函数。
这些方法的优点在于它允许您使用所有数据。
您已用 标记了问题reinforcement-learning
,但您描述了一个标记的数据集,建议进行监督学习。我将尝试涵盖这两种情况。
有一些技术适用于监督学习和强化学习:
请注意,要将它们应用于强化学习,您应该使用回放缓冲区,就像他们在DeepMind Atari 论文中所做的那样。
如果您处于监督学习场景中,您可以应用类权重,例如Keras 中的这个示例。
正如人们上面提到的那样,您想尝试上采样/引导。换句话说,您想尝试让类具有相似的比例。一种方法是简单地随机选择不太可能的样本。
更复杂的解决方案: 1. 向不太可能的类别添加真实噪声以增加数据点的数量。2. 使用不同的分数/误差函数 - 查看平衡准确度 3. 使用 50% A 和 50% B 开始训练 - 一旦收敛,开始在数据集的较大部分逐渐训练,逐渐变为 95% A和 5% B。
对于不平衡类,我最喜欢的方法是引导。
假设您有 n 个类,示例数量为 m 、 2m 、 3m (这只是为了说明哪个是最小值)。
使用来自每个类的 m 个样本创建多个数据集。(随机)
继续训练他们每一个人。