我正在开发一个神经网络,用于预测-1到1之间的数值。然而,我真正关注的是数值范围的两端,即-1到-0.7之间和0.7到1之间。
例如,如果0.6被预测为0.1,我并不介意。但是,我确实需要知道它是0.8还是0.9。
我的数据分布大致是正态分布,因此在我不关心精度的范围内有更多的样本。因此,训练过程似乎更可能导致中心区域的精度更高。
我该如何配置训练或设计我的预期结果来克服这个问题呢?
非常感谢。
回答:
你可以将观察值分配到十分位,将问题转化为分类问题,并在损失函数中为你关心的范围分配更大的权重,或者在训练过程中简单地对它们进行过采样。默认情况下,我会选择在损失函数中对类别进行加权,因为这很容易与加权度量匹配。如果你知道训练数据的分布与真实数据分布不同,过采样可能会有用。
要在Keras中为损失函数中的某些类别分配更大的权重,你可以向Model.fit传递class_weight
参数。如果标签0是第一十分位,标签9是最后一十分位,你可以将第一和最后两个十分位的权重加倍,如下所示:
class_weight = { 0: 2, 1: 2, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 2, 9: 2}model.fit(..., class_weight=class_weight)
要对某些类别进行过采样,你需要在批次中比类别分布所建议的更频繁地包含它们。实现这一点的最简单方法是使用numpy.random.choice
来抽样观察索引,该函数有一个可选参数,可以为每个条目指定概率。(请注意,Keras的Model.fit
还有一个sample_weight
参数,你可以为训练数据中的每个观察值分配权重,这些权重将在计算损失函数时应用,但其预期用例是根据标签的置信度来加权样本,所以我认为这里不适用。)