我正在尝试使用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
备注:我无法在此处粘贴代码。我为此道歉。
答案 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回调,那么它应该可以正常工作。