深度学习模型主要围绕实际值的平均值进行预测?

时间:2021-03-31 10:43:03

标签: python machine-learning keras deep-learning metrics

我有一个 1DCNN 模型,它似乎只能预测接近我的测试数据集中实际值的平均值。这是一个基于实际和预测的分布完全不同这一事实的糟糕模型吗?

Actual vs Predicted density plot

我的问题是:

  1. 这张图表可以说明我的预测的什么内容?模型简单地预测均值是否正常?如果它不能对数据集了解太多,会发生这种情况吗?
  2. 看起来 MAE 不是一个好的指标吗?它是否具有误导性,我应该使用不同的吗?

我试图通过降低 MAE 来改进模型,但随着它的降低,它只会向实际数据的平均值移动,并远离实际分布的分布。你可以看到我的预测的 SD 大约是 9,而实际数据的 SD 大约是 22。用户想要实际单位的结果,这就是我提供 MAE 的原因。另外,我还有其他基线可以与 MAE 进行比较。我觉得这是一个非常具有误导性的指标。

我有大约 30 个天气和土壤特征,都是连续的和按比例缩放的。数千个天气地点的 6 年每日天气数据。在每个地点,我每年都有一个目标值。 1DCNN 架构如下所示。我将我的数据与训练的前 5 年分开,最后一年是测试。数据跨越美国 3 个州,每个州大约有 9 个物理区。我尝试为每个州建立一个模型(只有 3 个模型),但每个州的表现都很差。如果我将其构建到地区级别,我可以获得可以接受的结果。我不期望有很好的结果,但我真的只是想弄清楚为什么它会围绕平均值。

我的模型如下所示:

model = Sequential()
model.add(Conv1D(filters=13, kernel_size=3, activation='relu', input_shape=input_shape))
model.add(Conv1D(filters=13, kernel_size=3, activation='relu'))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='linear'))
opt = Adam(lr=.0001)
model.compile(loss='mean_squared_error', optimizer=opt)

我正在不同大小的数据集上训练模型,以捕捉全年随着添加更多天气数据的结果,每个模型的预测如何相似。

multiple models showing same situation

1 个答案:

答案 0 :(得分:0)

在问题中,您说您使用的是 MAE(平均绝对误差),但在代码中,您将损失用作 mean_squared_error。 有什么理由吗? 一些调试思路。

  1. 检查您的训练和验证拆分依赖的分布。
  2. 将值放入类中并尝试构建分类器,看看您是否仍然面临同样的问题,这可以帮助您查明分布的哪个部分没有被正确捕获。
  3. 如果您使用的是结构化数据集,请尝试基于树的算法,例如 XGBoost 或随机森林,以查看算法是否可能存在问题。