神经网络在低密度区域的回归精度

我正在开发一个神经网络,用于预测-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参数,你可以为训练数据中的每个观察值分配权重,这些权重将在计算损失函数时应用,但其预期用例是根据标签的置信度来加权样本,所以我认为这里不适用。)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注