我怎么知道我的神经网络模型是否过拟合(Keras)

时间:2020-02-03 08:47:19

标签: python tensorflow keras neural-network

我正在使用Keras预测我将得到1还是0的输出。数据看起来像这样:

    funded_amnt  emp_length  avg_cur_bal  num_actv_rev_tl    loan_status
    10000       5.60088      19266                 2                  1
    13750       5.60088      2802                  6                  0
    26100       10.0000      19241                17                  1

目标是loan_status,其余功能。在开始构建神经网络模型之前,我已经对数据进行了标准化。

这是我的训练和测试数据的形状:

    print(X_train.shape,Y_train.shape) 
    # Output: (693, 4) (693,)

    print(X_test.shape,Y_test.shape) 
    # Output: (149, 4) (149,)

我遵循的建立神经网络的过程是:

     # define the keras model
     model = Sequential()
     model.add(Dense(4, input_dim=4,activation='relu'))
     model.add(Dense(4 ,activation='relu'))
     model.add(Dense(1,activation='sigmoid'))

     # compile the keras model
     model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

     # fit the keras model on the dataset
     hist = model.fit(X_train, Y_train, epochs=10, batch_size=2)

运行hist后的输出:

         Epoch 1/10
         693/693 [==============================] - 2s 2ms/step - loss: 0.6379 - acc: 0.7013
         Epoch 2/10
         693/693 [==============================] - 0s 611us/step - loss: 0.5207 - acc: 0.7951
         Epoch 3/10
         693/693 [==============================] - 0s 605us/step - loss: 0.5126 - acc: 0.7951
         Epoch 4/10
         693/693 [==============================] - 0s 621us/step - loss: 0.5109 - acc: 0.7951
         Epoch 5/10
         693/693 [==============================] - 0s 611us/step - loss: 0.5105 - acc: 0.7951
         Epoch 6/10
         693/693 [==============================] - 0s 636us/step - loss: 0.5091 - acc: 0.7951
         Epoch 7/10
         693/693 [==============================] - 0s 644us/step - loss: 0.5090 - acc: 0.7951
         Epoch 8/10
         693/693 [==============================] - 0s 659us/step - loss: 0.5086 - acc: 0.7951
         Epoch 9/10
         693/693 [==============================] - 0s 668us/step - loss: 0.5083 - acc: 0.7951
         Epoch 10/10
         693/693 [==============================] - 0s 656us/step - loss: 0.5076 - acc: 0.7951

几乎都是相同的,并且在第二个Epoch之后没有改变。我尝试更改时间数和批处理大小,但保持相同的结果。 这正常吗?还是过度拟合的迹象,我需要更改一些参数

3 个答案:

答案 0 :(得分:5)

您的测试数据旨在监视训练数据上的模型overfitting

hist = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=10, batch_size=2)

在训练过程中,您将达到训练损失继续减少但测试损失停止减少的程度。那就是您的数据开始过度拟合的地方。

enter image description here

在统计数据中,过度拟合是“过于紧密或精确地对应于特定数据集的分析结果,因此可能无法拟合其他数据或可靠地预测未来的观察结果。”

作为一个极端的例子,如果参数的数量等于或大于观察值的数量,则模型可以简单地通过完整地记住数据来完美地预测训练数据。但是,这样的模型通常在做出预测时会严重失败。

通常,使用一组“训练数据”来训练学习算法:已知输出的示例情况。目标是该算法在输入训练期间未遇到的“ 验证数据”时,在预测输出方面也将表现良好。在学习时间过长或训练实例很少的情况下,过度拟合尤其可能导致学习者适应训练数据的非常具体的随机特征,而这种随机特征与目标功能没有因果关系。在过度拟合的过程中,训练示例的性能仍会提高,而看不见数据的性能会更差

绿线表示过拟合模型,黑线表示正则化模型。绿线虽然最适合训练数据,但它过于依赖训练数据,与黑线相比,新出现的看不见的数据的错误率可能更高。

答案 1 :(得分:1)

过度拟合现在不是您的问题,它可能会出现在准确度较高(> 95%)的模型中,您应该尝试训练更多模型。如果要检查模型是否过拟合,请尝试使用验证数据进行预测。如果工作频率看起来太低而培训工作频率很高,则可能是过度拟合。

答案 2 :(得分:1)

如果您过度拟合,训练损失将继续减少,但验证准确性不会提高。您遇到的问题是您的网络没有足够的容量来容纳数据,或者您使用的功能没有足够的信息来完美地预测贷款状态。

您可以通过以下方法解决此问题:通过添加一些层,丢包,正则化等来增加网络的容量。或者,如果可能的话,可以添加更多的训练数据和更多的功能。