信用卡欺诈分类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
相关产品推荐
相关产品推荐

