如何改进低精度 Keras 模型设计?

数据挖掘 机器学习 喀拉斯 张量流 机器学习模型
2022-02-17 05:55:06

我正在尝试训练一个系统来查看一些数据点并预测冲浪休息时的冲浪者数量。我已经标记了过去 2 个月的模式,并且我有 1500 多个训练示例,白天每 15 分钟进行一次观察(不包括夜间)

我的数据如下所示(*kooks = surfers):

特征 我正在使用Keras,这是代码:

*我在处理之前从输入矩阵中删除月份特征。我也做了preprocessing.MinMaxScaler()练习。

model = Sequential()
model.add(Dense(64, input_dim=6, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='relu'))

model.compile(optimizer='adam',loss='mse', metrics=['accuracy'])

early_stopping_monitor = EarlyStopping(patience=10)
history = model.fit(X, y, validation_split=0.33, epochs=200, batch_size=15, verbose=0, callbacks=[early_stopping_monitor])

我得到的结果非常糟糕:

Test score: 0.015
Test accuracy: 0.12

模型损失 模型精度

我尝试了多个优化器和多个激活函数,但还没有找到令人满意的模型。

我有几个怀疑:

  1. 数据并不是真正可预测的,因为有时许多特征都相同(参见第 0 行和第 1 行),系统变得混乱,但预期的输出完全不同。
  2. 模型的设计不太适合(我真的不知道如何设计隐藏层维度)
  3. 每一层(包括输出层)的损失函数、优化器和/或激活函数都不太适合。

我做错了什么还是这只是野兽的本性?有什么想法/建议吗?

1个回答

查看训练时期,在我看来,您设置的耐心参数太短了。对于仅在 1500 次观察上训练的模型,请考虑完全取消提前停止。提前停止对于特别重的模型很有用,但在这里你不应该需要它。

我认为每个 mini-batch 的大小非常小。这会使梯度下降非常嘈杂,请考虑增加它的大小,或者也使用全批训练。

此外,我认为您实施了一个太大的网络。您的输入非常小,因此您不需要在大小为 64 的层上扩展其信号。有太多节点试图“学习”不多的东西,恕我直言。一个好的架构可能是:

model = Sequential()
model.add(Dense(6, input_dim=6, activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(1, activation=None))

这将使您的模型更快地训练,并确保每个节点都在学习数据的相关特征。

我也会改变输出层。由于您想预测结果,因此您需要一个没有激活的输出节点(即线性激活)。这对于具有无限输出的回归任务是强制性的。

您可以尝试的其他事情是:

  • 更改 dropout 级别(但对于这么小的网络,可能根本不需要它),
  • 尝试正则化技术,例如 Batchnorm、L1 - L2 正则化、不同的权重初始化......
  • 尝试其他激活函数。

此外,对于中小型数据集,其他 ML 算法(例如随机森林或 SVM)有可能在性能上击败神经网络。