You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

信用卡欺诈分类Keras模型EarlyStopping忽略自定义f1指标求助

解决Keras自定义F1指标监控问题

我之前也碰到过类似的情况,核心问题就是自定义指标没有被Keras正确识别和注册,导致EarlyStopping没法监控它。下面给你梳理一步步的解决方法:

1. 定义Keras兼容的F1指标函数

Keras的自定义指标必须接收y_true和y_pred两个张量参数,而且全程要用Keras后端(比如TensorFlow)的操作,不能直接用sklearn的f1_score——不然会和计算图冲突。针对你的二分类信用卡欺诈场景,给你一个可用的F1实现:

from keras import backend as K

def f1_metric(y_true, y_pred):
    # 把概率值转为二分类类别(用0.5作为阈值)
    y_pred = K.round(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 / (predicted_positives + K.epsilon())
    # 计算召回率
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    # 计算F1分数,加epsilon避免除以0
    f1_val = 2 * (precision * recall) / (precision + recall + K.epsilon())
    return f1_val

2. 编译模型时加入自定义指标

在模型编译阶段,把这个F1指标加入metrics列表,这样Keras每个epoch都会自动计算并输出它:

model.compile(optimizer='adam',
              loss='binary_crossentropy',  # 二分类场景适配的损失函数
              metrics=['accuracy', f1_metric])

这样训练时,你就能看到类似f1_metric: 0.xxx和val_f1_metric: 0.xxx的输出了,和acc、loss的格式一致。

3. 配置EarlyStopping监控自定义指标

现在你可以把EarlyStopping的monitor参数设置为'val_f1_metric'(注意前缀val_不能少,对应验证集的指标),同时设置mode='max'——因为F1分数越高越好:

from keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(monitor='val_f1_metric',
                               patience=3,
                               mode='max',
                               verbose=1)

最后把这个回调函数传入model.fit()的callbacks参数即可:

model.fit(X_train, y_train,
          validation_data=(X_val, y_val),
          epochs=10,
          callbacks=[early_stopping])

额外提醒

针对你的不平衡数据集,除了用F1指标监控,还可以尝试给模型加class_weight参数(给欺诈样本更高的权重),或者用过采样/欠采样平衡数据,能进一步提升模型的召回率表现。

内容的提问来源于stack exchange,提问作者user3591356

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:26:51