Keras:在训练期间和末期使用不同的验证AUROC

时间:2018-07-11 18:06:35

标签: python tensorflow keras

根据计算时间的不同,我会得到不同的AUROC。我的代码是

 def auc_roc(y_true, y_pred):
     # any tensorflow metric
     value, update_op = tf.metrics.auc(y_true, y_pred)
     return update_op

 model.compile(loss='binary_crossentropy', optimizer=optim, metrics=['accuracy', auc_roc])

 my_callbacks = [roc_callback(training_data=(x_train, y_train),validation_data=(x_test,y_test))]

 model.fit(x_train, y_train, validation_data=(x_test, y_test), callbacks=my_callbacks)

其中roc_callback是Keras回调,它使用来自sklearn的roc_auc_score在每个时期结束时计算AUROC。我使用定义为here的代码。

训练模型时,我得到以下统计数据:

  Train on 38470 samples, validate on 9618 samples
  Epoch 1/15
  38470/38470 [==============================] - auc_roc: 0.5116 - val_loss: 0.6899 - val_acc: 0.6274 - val_auc_roc: 0.5440

  roc-auc_val: 0.5973                                                                                                    

  Epoch 2/15
  38470/38470 [==============================] - auc_roc: 0.5777 - val_loss: 0.6284 - val_acc: 0.6870 - val_auc_roc: 0.6027

  roc-auc_val: 0.6391 

  .
  .
  .
  .
  .
  .
  .


  Epoch 12/15
  38470/38470 [==============================] - auc_roc: 0.8754 - val_loss: 0.9569 - val_acc: 0.7747 - val_auc_roc: 0.8779

  roc-auc_val: 0.6369

那么在训练过程中每个时期的AUROC如何计算?为什么它与历末计算的结果不同?

2 个答案:

答案 0 :(得分:1)

进度栏右侧显示的auc_roc值是您提供给model.compile()的度量。每次通过对 training 数据一次评估您定义的auc_roc函数来计算该分数。随着模型继续训练,该值将更新为模型性能的运行平均值。同样,通过对 validation 数据评估val_auc_roc函数来计算auc_roc

另一方面,

roc-auc_val完全由您使用的回调roc-auc_val定义。仔细研究链接到的代码。它是使用sklearn函数而不是tensorflow函数确定模型的AUC分数。所打印的auc_rocroc-auc_val值之间出现的任何差异都可以通过所使用的两个AUC函数之间的差异来解释。

答案 1 :(得分:1)

在培训期间,指标是“每批”计算的。 并且,它们会以当前批次指标和先前结果之间某种“均值”的方式对每个新批次进行更新。

现在,您的回调仅在最后进行“整个数据”的计算。两种方法之间会有正常的差异。

通常情况下,下一个纪元以比上一个纪元显示的值更好的度量标准开始,因为旧的度量标准在平均值中包括当时未训练的许多批次。

您可以通过调用model.evaluate(x_test,y_test)进行更精确的比较。不确定是否通过调用此“期间”训练来产生冲突,但是您可以分别训练每个时期,并在每个时期之间进行调用。


有些奇怪:

您的y_pred中没有任何roc_callback。您在里面叫model.predict()吗?