tensorflow - 神经网络在低密度区域的回归精度
问题描述
我正在开发一个神经网络,它需要预测 -1 和 1 之间的值。但是,我只关心尺度末端的值,比如 -1 和 -0.7 之间以及 0.7 和 1 之间。
例如,如果 0.6 被预测为 0.1,我不介意。但是,我确实想知道它是 0.8 还是 0.9。
我的数据分布大致正常,因此在我不关心准确性的范围内还有更多样本。因此,培训过程似乎可能会导致中心的准确性更高。
我如何配置培训或设计我的预期结果来克服这个问题?
非常感谢。
解决方案
您可以将观察结果分配给十分位数,将其转换为分类问题,并为您在损失中关心的范围分配更大的权重,或者只是在训练期间对它们进行过采样。默认情况下,我会在损失函数中对类进行加权,因为它可以直接匹配加权指标。如果您知道训练数据的分布与实际数据分布不同,则过采样会很有用。
要使用 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
具有可选参数来指定每个条目的概率的观察索引进行采样。(请注意,KerasModel.fit
还有一个sample_weight
参数,您可以在其中为训练数据中的每个观察分配权重,这些观察将在计算损失函数时应用,但预期的用例是通过标签中的置信度对样本进行加权,所以我没有不认为它适用于此。)
推荐阅读
- javascript - 填写表单字段后如何使弹出窗口出现?
- webdriver-io - Appium - Android - 错误:生成 appium ENOENT
- autodesk-viewer - 何时加载自定义全景扩展
- python - 如何打印从今天起接下来的 3 个日期?
- c# - 无法使用正则表达式模式进行多次匹配。模式视为单个匹配
- sql - 根据 A 列的值,仅允许 B 列中的某些值
- matlab-figure - 如何使用 Matlab 绘制涉及三个参数的三个方程 (x=x(u,v,w), y=y(u,v,w), z=z(u,v,w)) 的图形?
- asp.net-mvc - 直接提交到特定控制器操作项的引导对话框
- java - 是否可以从数据库中删除实体,然后在 JpaRepository 中返回这个值?
- reactjs - Is there a way to emulate the run frequency of constructor code using the React Hooks API?