获得神经网络交叉验证性能的正确方法

时间:2020-03-19 18:18:05

标签: python machine-learning keras neural-network cross-validation

我遇到过很多帖子(herehere),其中提到使用神经网络(NN)执行k倍交叉验证(CV)与使用机器学习算法进行CV( SVM,随机森林等)。基本思想是将数据库划分为k个相等的拆分,在k-1个拆分上训练模型,并在第k个拆分上测试性能,并迭代所有拆分。

但是,考虑分类问题,我需要获得CV混淆矩阵。

很显然,在训练神经网络时,我们需要观察验证损失,并确保网络不会过度拟合。因此,尽管在machinelearningmastery中进行了编码,但不建议在每个CV步骤中针对固定数量的纪元训练模型,而又不遵守验证损失。

如果我们确实使用第k个拆分作为验证数据(如以下代码段所示),则验证损失最小的时期将被保存为最佳模型。

for train, test in kfold.split(X, Y):

    model = build_model()
    opt = Adam(lr=0.00005)
    model.compile(loss = "categorical_crossentropy", optimizer = opt, metrics=['accuracy'])

    filepath='saved_models/best_model.h5'
    checkpointer = ModelCheckpoint(filepath=filepath, verbose=1, save_best_only=True)

    model.fit([X[train], Y[train], 
          validation_data=([X[test]],Y[test]), epochs=50, batch_size=40, callbacks=[checkpointer])

现在,

  1. 为了填充混淆矩阵,使用保存的最佳模型对相同的验证数据进行如下评估有多合理?

    best_model = load_model('saved_models/best_model.h5')
    scores = best_model.evaluate([X[test], Y[test], verbose=0)
    accuracy = scores[1]*100  # classification accuracy of kth split
    
  2. 我们应该分别按照this SO答案中的说明进行培训,验证和测试。但这违反了k倍CV的定义,因为我们不训练k-1拆分。

  3. 还是我们应该训练固定数量的纪元而不考虑验证,并像machinelearningmastery一样在测试集上测试性能?

0 个答案:

没有答案