Keras神经网络中val-acc和预测精度之间的巨大差异

问题描述 投票:0回答:1

[我有一个用于在Keras中制作NN模型的数据集,我从该数据集中获取了2000行作为验证数据,应该在.predict函数中添加这2000行。

我为Keras NN写了一个代码,现在它可以正常工作,但是我发现有些东西对我来说很奇怪。它给我非常好的准确性,超过了83%,损失大约为12%,但是当我要使用看不见的数据(即2000行)进行预测时,它只能预测平均为65%。当我添加Dropout层时,它只会降低准确性。

然后,我添加了EarlyStopping,它为我提供了大约86%的准确性,损失约为10%,但是当我使用看不见的数据进行预测时,最终的预测准确性还是67%。

为什么,我做错了什么?我尝试使用层数,节点数,具有不同的激活功能和不同的优化器,但是它只能将结果更改1-2%。我的数据集看起来像这样:

DataFrame shape (57849, 32)
x_train shape (43386, 28)
y_train shape (43386,)
x_test shape (14463, 28)
y_test shape (14463,)
testing_features shape (1000, 28)

这是我的NN模型:

model = Sequential()

model.add(Dense(31, input_dim = x_train.shape[1], activation = 'relu')) 
model.add(Dense(50, activation = 'relu'))
model.add(Dense(50, activation = 'relu'))
model.add(Dropout(0.1))
model.add(Dense(1, activation='sigmoid'))

# compile the model, adam gradient descent (optimized)
sgd = optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss="mean_squared_error", optimizer= sgd, metrics=['accuracy'])

# call the function to fit to the data training the network)
es = EarlyStopping(monitor='val_loss', min_delta=0.0, patience=3, verbose=0, mode='auto')
model.fit(x_train, y_train, epochs = 100, shuffle = True, batch_size=128, validation_data=(x_test, y_test), verbose=2, callbacks=[es])


scores = model.evaluate(x_test, y_test)
print(model.metrics_names[0], round(scores[0]*100,2), model.metrics_names[0], round(scores[1]*100,2))

这些是结果:

    Train on 40732 samples, validate on 13578 samples
Train on 42711 samples, validate on 14238 samples
Epoch 1/100
 - 2s - loss: 0.1294 - acc: 0.8224 - val_loss: 0.1114 - val_acc: 0.8420
Epoch 2/100
 - 1s - loss: 0.1026 - acc: 0.8544 - val_loss: 0.0990 - val_acc: 0.8597
Epoch 3/100
 - 1s - loss: 0.0939 - acc: 0.8660 - val_loss: 0.0956 - val_acc: 0.8629
Epoch 4/100
 - 1s - loss: 0.0901 - acc: 0.8727 - val_loss: 0.0939 - val_acc: 0.8663
Epoch 5/100
 - 1s - loss: 0.0864 - acc: 0.8783 - val_loss: 0.0949 - val_acc: 0.8675
Epoch 6/100
 - 1s - loss: 0.0838 - acc: 0.8826 - val_loss: 0.0939 - val_acc: 0.8686
Epoch 7/100
 - 1s - loss: 0.0808 - acc: 0.8883 - val_loss: 0.0952 - val_acc: 0.8670
Epoch 8/100
 - 1s - loss: 0.0783 - acc: 0.8904 - val_loss: 0.0935 - val_acc: 0.8689
Epoch 9/100
 - 1s - loss: 0.0755 - acc: 0.8959 - val_loss: 0.0933 - val_acc: 0.8712
Epoch 10/100
 - 1s - loss: 0.0736 - acc: 0.8980 - val_loss: 0.0960 - val_acc: 0.8667
Epoch 11/100
 - 1s - loss: 0.0711 - acc: 0.9037 - val_loss: 0.0973 - val_acc: 0.8662
Epoch 12/100
 - 1s - loss: 0.0688 - acc: 0.9058 - val_loss: 0.0974 - val_acc: 0.8673
14238/14238 [==============================] - 0s 17us/step
loss 9.74 acc 86.73
python machine-learning keras neural-network
1个回答
1
投票

您发布的训练数据提供了很高的验证准确性,因此对于从中获得65%的收益我有些困惑,但是总的来说,当您的模型在训练数据上的表现要好于看不见的数据时,这意味着您关于over fitting。这是机器学习中经常出现的大问题,无法保证可以防止这种情况的发生,但是您可以尝试以下几种方法:

  • 调整网络的权重,例如使用l2正则化
  • 使用随机正则化技术,例如训练中的辍学
  • early stopping
  • 降低模型的复杂性(但您说您已经尝试过了)
© www.soinside.com 2019 - 2024. All rights reserved.