【问题标题】:Regression accuracy with neural network in low density regions神经网络在低密度区域的回归精度
【发布时间】:2019-08-17 22:26:03
【问题描述】:

我正在开发一个神经网络,它需要预测 -1 和 1 之间的值。但是,我只真正关心规模末端的值,例如 -1 和 -0.7 之间以及 0.7 和 1 之间的值。

例如,如果 0.6 被预测为 0.1,我不介意。但是,我确实想知道它是 0.8 还是 0.9。

我的数据分布大致正常,因此在我不关心准确性的范围内还有更多样本。因此,似乎训练过程可能会导致中心的准确性更高。

如何配置培训或设计我的预期结果来克服这个问题?

非常感谢。

【问题讨论】:

  • 预测需要什么精度?例如,如果 +/-0.05 点的不精确度是可以容忍的,您可以将观察结果分配给十分位数,将其转化为分类问题,并为您在损失中关心的范围分配更大的权重,或者只是在训练期间对它们进行过采样.
  • 感谢 Agost。十分位数就足够了。通过过采样,您的意思是更频繁地展示这些样本进行训练吗?如何为第一个和最后两个十分位数分配更大的权重?
  • 乐于助人,现在写一个详细的答案。

标签: tensorflow machine-learning keras neural-network


【解决方案1】:

您可以将观察结果分配给十分位数,将其转化为分类问题,并为您在损失中关心的范围分配更大的权重,或者只是在训练期间对它们进行过采样。默认情况下,我会在损失函数中对类进行加权,因为它与加权指标匹配很简单。如果您知道训练数据的分布与实际数据分布不同,那么过采样会很有用。

要在 Keras 的损失函数中为某些类分配更大的权重,您可以将 class_weight 参数传递给 Model.fit。如果标签 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 参数,您可以在其中为训练数据中的每个观察分配权重,这些观察将在计算损失函数时应用,但预期的用例是通过对样本的置信度来衡量样本的权重。标签,所以我认为它不适用于这里。)

【讨论】:

  • Agost,感谢您提供非常全面的答案。很明显,权重就是我想要的。
猜你喜欢
  • 2016-10-22
  • 2016-10-19
  • 2017-07-23
  • 2018-07-07
  • 2018-07-06
  • 2020-04-04
  • 2023-03-29
  • 2018-07-14
  • 1970-01-01
相关资源
最近更新 更多