EarlyStopping忽略了我定义的自定义指标。 Keras模型

时间:2018-04-24 13:58:19

标签: python-3.x machine-learning keras

我正在尝试使用nn Keras模型对信用卡欺诈进行分类。 由于数据集不平衡,我需要使用f1_score来改善召回。

显然,不接受f1s的定义。 如何在每个时代监控我的新指标?如果使用val_loss而不是已定义的那些,则提前停止工作正常 非常感谢您帮助解决我的问题。

我收到这个mesagge:

对139554个样本进行培训,对59810个样本进行验证 大纪元1/10

7s - 损失:0.3585 - acc:0.9887 - val_loss:0.0560 - val_acc:0.9989 /home/libardo/anaconda3/lib/python3.6/site-packages/keras/callbacks.py:526:RuntimeWarning:提前停止以公制f1为条件,这是不可用的。可用的指标包括:val_loss,val_acc,loss,acc (self.monitor,','。join(list(logs.keys()))),RuntimeWarning Here

备注:我无法在此处粘贴代码。我为此道歉。

1 个答案:

答案 0 :(得分:1)

我意识到这是很久以前发布的,但是我在寻找相同答案时发现了这个问题,并最终自己解决了。 简而言之,您需要记住在定义模型时既要定义EarlyStopping回调的指标,又要作为指标

好的,因此您已经定义了您的自定义损失函数或指标,如下所示(取自https://github.com/keras-team/keras/issues/10018,取自https://stackoverflow.com/a/45305384/5210098

#https://stackoverflow.com/a/45305384/5210098
def f1_metric(y_true, y_pred):

    def recall(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
        recall = (true_positives + K.epsilon()) / (possible_positives + K.epsilon())
        return recall

    def precision(y_true, y_pred):
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
        precision = (true_positives + K.epsilon()) / (predicted_positives + K.epsilon())
        return precision

    precision = precision(y_true, y_pred)
    recall = recall(y_true, y_pred)
    return 2*((precision*recall)/(precision+recall+K.epsilon()))

现在,要将其与EarlyStopping回调一起使用,您可以将其提供为类似EarlyStopping(monitor='f1_metric')的字符串,或者使用EarlyStopping(monitor='val_f1_metric')来监视验证。

但这还不够!如果在此停留,您将得到错误提示。使用model.compile(metrics=[f1_metric])编译模型时,还需要提供实际函数作为参数。注意缺少引号-您正在引用函数本身。

如果通过使用metrics关键字包含函数来编译模型,并且还包含EarlyStopping回调,那么它应该可以正常工作。