繁体   English   中英

当训练具有高精度但 model.evaluate() 精度低时,如何改进 model?

[英]How do I improve the model when training has high accuracy but model.evaluate() gives low accuracy?

我正在从事一个处理传感器数据的项目。 我从 3 个地方收集了传感器数据,并将数据存储为 csv 文件。 大约有4000个样本。 数据具有我用作特征的 X、Y、Z 和作为我的目标变量的 class。 目标是在数据集上建立分类 model。 目标变量/标签是 [1,2,3]。 由于是时间序列数据,我选择使用双向 LSTM。

数据分布:

在此处输入图像描述

model = keras.Sequential()
model.add(
    keras.layers.Bidirectional(
    keras.layers.LSTM(
    units = 128,
    input_shape = [X_train.shape[1], X_train.shape[2]]
    )
)
)
model.add(keras.layers.Dropout(rate = 0.2))
model.add(keras.layers.Dense(units = 128, activation = 'relu'))
model.add(keras.layers.Dense(y_train.shape[1], activation = 'softmax'))
model.compile(
loss = 'categorical_crossentropy',
optimizer = 'adam',
metrics = ['acc']
)

在我训练我的 model

history3 = model.fit(
    X_train, y_train,
    epochs=35,
    batch_size=100,
    validation_split = 0.1,
    shuffle=False
)

这是我上一个时代给出的准确度和验证准确度:

Epoch 35/35
4002/4002 [==============================] - 3s 858us/step - loss: 0.0216 - acc: 0.9948 - val_loss: 0.3026 - val_acc: 0.9056

当我使用model.evaluate(X_test, y_test)它返回两个值的列表: [5.144028138408701, 0.43551796674728394]

所以问题是这两个值是什么? 我的猜测是第一个值是 MSE,第二个是准确度。 如果我是对的,为什么我使用.evaluate时的准确性如此之低? 我应该如何改进 model?

PS 更多信息

print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)

(4447, 24, 3) (4447, 3) (473, 24, 3) (473, 3)

数据是有序数据,所以我在拆分期间使用shuffle = True

df_train, df_test = train_test_split(df, test_size = 0.1, shuffle = True)

您对 model.evaluate 返回的内容的猜测是正确的,第一个是损失,第二个是准确度。 似乎您的 model 过度拟合,即使 val_accuracy 显示其他内容。 我建议检查您的数据集中有多少这两个类别的标签。 我的意思是,也许你有一个 class 的 90%,而另一个只有 10%。 如果是这种情况,你可以用 sklearn 做一件简单的事情(我猜你使用了来自 sklearn.model_selection 的 train_test_split)。也就是说,你应该将参数 stratify=y 添加到 train_test_split function 中。 这可以帮助处理不平衡的数据集。 另外,您是否尝试过使用其他优化算法? 你降低了 learning_rate 吗?

我怀疑你有一个高度不平衡的数据集。 例如,如果您有一个包含 10,000 个样本的 class 0 样本和 1000 个样本 class 1 的数据集。假设您将其拆分为训练集和验证集。 两组仍然会有这种不平衡。 现在,如果您训练您的网络,它将倾向于选择 class 0 并且验证数据结果看起来不错。 如果网络总是预测 class 0 它将有 90% 的准确率。 现在,如果您有一个平衡的测试集,例如当您运行 model 时,有 500 个样本用于 class 0 和 500 个样本用于 class 1,您将在测试集上评估高错误率。 我没有使用它,但我知道 model.fit 有一个名为 class_weight 的参数。这是一个字典,允许您根据 ZA2F2ED4F8EBC2CBB4C21A29DC40AB61Z 调整对损失 function 的影响。 在上面的示例中,您希望 Class 1 样本的重量是 class 0 样本的 10 倍。 然后,您创建一个 class_weight 字典作为

class_weight={0:.55, 1:5.5}

然后在 model.fit 中使用它。 您可以做的其他事情是使用可调节的学习率并以最低的验证损失保存 model 并将其用于评估。 使用 Keras 回调很容易做到这一点。 可以设置回调ModelCheckpoint来监控validation loss,保存loss最低的model。 文档在这里。 可以设置 ReduceLROnPlateau 回调来监控验证损失,并在 N 个连续 epoch 后损失未能减少时将学习减少一个因子。 文档在这里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM