python - 我如何知道我的神经网络模型是否过拟合(Keras)

标签 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 数和 Batch 大小,但始终得到相同的结果。 这是正常的吗?还是过度拟合的迹象,我需要更改一些参数

最佳答案

您的测试数据用于监控模型的 overfitting关于训练数据:

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

在训练期间,您将达到一个点,即训练损失继续减少,但您的测试损失停止减少。您的数据开始过拟合的那一点。

enter image description here

在统计学中,过度拟合是“产生的分析与特定数据集过于接近或完全对应,因此可能无法拟合其他数据或可靠地预测 future 的观察结果”。

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

通常使用一组“训练数据”训练学习算法:期望输出已知的示例情况。目标是当输入训练期间未遇到的“验证数据”时,该算法在预测输出方面也能表现良好。在学习执行时间过长或训练示例很少的情况下,过度拟合尤其可能导致学习器适应训练数据的非常特定的随机特征,这些特征与目标函数没有因果关系。在这个过度拟合的过程中,在训练样本上的表现仍然会提高,而在未见数据上的表现会变差

绿线代表过拟合模型,黑线代表正则化模型。虽然绿线最能跟随训练数据,但它过于依赖该数据,与黑线相比,它可能对新的未见数据有更高的错误率。

关于python - 我如何知道我的神经网络模型是否过拟合(Keras),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60035755/

相关文章:

python - function_f()(variable_v) 的含义和工作方式( () 中后跟变量的函数)

python - 使用 ImageDataGenerator 和 flow_from_directory 时,Keras 中的数据增强是否应用于验证集

tensorflow - 无法使用tensorflow 2.0.0 beta1保存模型

python - GPT-2 从检查点继续训练

python - Matplotlib 未知属性 "headwidth"和 "head_width"

python - 训练时的位精度如何影响 DNN 的准确性 - 支持量化类型推理的库

python - 是否可以在每个像素有多个标签的情况下进行像素级分类?

python - 我应该只使用 "exactly same"输入形状进行迁移学习吗?

python - 通过多个可能的分隔符分割字符串

python - 与 SciPy kmeans 相比,使用 sklearn KMeans 是否有优势?