当序列具有不平衡类时如何训练 LSTM

机器算法验证 神经网络 不平衡类 lstm
2022-03-21 20:44:05

我在每个时间步都标记序列,但是数据集中的一些标签只在两个更常见的标签之间非常短暂地出现。因此,NN 偏向于这些常见的标签。我不能只向它展示更多稀有标签的示例,因为状态在序列中非常重要,因此将序列分解会对其预测能力产生负面影响。

以下是数据和标签的一个非常简单的示例:

数据:

1 0 0 0 0 2 0 3 0 0 0 0 0 0 0 0 0 0 4 0 3 0 0 0 0 0 0 2 0 1 0 0 0 0 2 0 0 3 0 0

标签:

1 1 1 1 1 2 2 3 3 3 3 3 3 3 3 3 3 3 4 4 3 3 3 3 3 3 3 2 2 1 1 1 1 1 2 2 2 3 3 3

基本上一个指标出现在序列中,然后这是序列的标签,直到出现新指标(因此状态的重要性)

1个回答

与成本函数成反比的贡献

处理不平衡数据的另一种方法是加权每个标签对成本函数的贡献,与标签的频率成反比在您上面的示例中,我计算了以下类的频率:

1: 10
2:  7
3: 20
4:  2

因此,当真实标签为 时,您可以逐个样本将成本乘以 ,对于标签,乘以用于标签用于标签所以你会看到标签的数量是标签的 5 倍,但它们每个对你的整体成本函数的贡献都一样多。换句话说,您可以预期每个标签对您的成本函数的平均影响大致相同。110117212031241415th

在实践中,我会在整个训练集中使用标签的频率,并设置分子,使乘数之和为 1。例如,在上面的示例中,我将使用分数加起来约为 1。不需要以这种方式扩展,但如果你不这样做,你实际上是在修改你的学习率。1.26101.2671.26201.262

使用这种方法(如重采样)的一个危险是增加了过度拟合稀有标签的机会。如果您使用这种方法,您可能希望以某种方式规范您的模型。

实际上,我相信大多数深度学习库都提供此功能。例如,在python库keras中,该keras.models.Model.fit()方法有一个sample_weight参数:

sample_weight:训练样本的可选 Numpy 权重数组,用于加权损失函数(仅在训练期间)。您可以传递与输入样本长度相同的平面 (1D) Numpy 数组(权重和样本之间的 1:1 映射),或者在时间数据的情况下,您可以传递具有 shape 的 2D 数组 (samples, sequence_length),以应用每个样本的每个时间步长都有不同的权重。在这种情况下,您应该确保sample_weight_mode="temporal"compile().

最后,我会鼓励你确保你有一个你信任的良好性能指标。使用这样的方法可能会导致您的模型比实际期望的更频繁地估计您的稀有标签。正如蒂姆在评论中所说:

如果某事更常见,那么它被更普遍地预测是合理的。