为什么我的测试数据准确率高于我的训练数据?

数据挖掘 喀拉斯 lstm 准确性
2021-10-03 23:09:55

我使用了四年的数据,在前 3 年进行训练,在第四次进行测试。使用带有 Keras 的 LSTM。我的测试数据集(与训练完全没有重叠)始终比我的训练数据表现更好。我该如何解释这个?这似乎很不寻常。这是模型输出的结尾。您可以看到我在给定 epoch 的训练准确率徘徊在 80% 左右,但测试输出跃升至 86% 左右:

Epoch 8/10
9092/9092 [==============================] - 9s 964us/step - loss: 0.9870 - acc: 0.8185
Epoch 9/10
9092/9092 [==============================] - 9s 1ms/step - loss: 0.9670 - acc: 0.7996
Epoch 10/10
9092/9092 [==============================] - 9s 937us/step - loss: 0.9799 - acc: 0.7895
Test Set Accuracy: 85.96%

predicted     0    1
actual              
0          2639  238
1           211  111

编辑:这是我创建和编译模型的代码:

embedding_vector_length = 32
days = 30

model = Sequential()
model.add(Embedding(2080, embedding_vector_length, input_length=days)
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_x, train_y, epochs=3, batch_size=64,class_weight={0:1.,1:1}) 
scores = model.evaluate(test_x, test_y, verbose=0)
print("Test Set Accuracy: %.2f%%" % (scores[1]*100))
4个回答

你的测试集很不走运。

使用交叉验证

还要确保为测试和训练数据处理正确/随机拆分。这样它就没有偏见

我假设您使用的是结构化数据(数字、分类、名义、序数......): - 这可能是由于类别不平衡。- 如果你使用 Scikit-Learn,你可以添加 class_weight = "balanced",它会自动对类进行加权,与它们的频率成反比。- 测试这应该确认它是否是一个类不平衡问题。

PS:Francois Chollet(Keras 的创建者)指出,传统算法在结构化数据方面优于深度学习。就我个人而言,对于结构化数据,我从来无法将 XGBoost 的性能与深度学习相提并论。

在此处输入图像描述

在此处输入图像描述

似乎您的模型偏向于一个班级,并且在第四年(测试数据)您会获得更多有偏见的班级样本。由于训练数据不足,您也可以观察到此类问题。

Probable solution: Add more samples in training data.

注意:您也可以在将所有 4 年的数据洗牌并拆分为训练数据和测试数据后尝试模型训练。

您必须使用一些正则化技术来避免训练数据的过度拟合。(例如:辍学正则化)如果您可以发布您的代码片段,这将很容易分析。