如何使用tf.keras.metrics正确计算假阳性率(False Positive Rate)
问题原因
- 你代码中的
fp/fn/tn是Keras指标类的实例对象,不是最终统计得到的数值,直接对实例对象做算术运算会触发类型不支持错误 - 要获取指标的统计结果,需要先调用实例的
.result()方法拿到对应张量,可进一步调用.numpy()转成Python可直接计算的数值类型
修正代码
贴合原有逻辑的写法
# 初始化各指标实例 fp_metric = tf.keras.metrics.FalsePositives() fn_metric = tf.keras.metrics.FalseNegatives() tn_metric = tf.keras.metrics.TrueNegatives() # 传入真实值和预测值更新指标状态 fp_metric.update_state(bigy[test], pred) fn_metric.update_state(bigy[test], pred) tn_metric.update_state(bigy[test], pred) # 获取统计数值 fp = fp_metric.result().numpy() tn = tn_metric.result().numpy() # 计算假阳性率,公式为 FPR = FP/(FP+TN) fpr = fp / (fp + tn)
更高效的写法(单混淆矩阵指标一次性计算所有统计值)
# 初始化2分类混淆矩阵指标 cm_metric = tf.keras.metrics.ConfusionMatrix(num_classes=2) cm_metric.update_state(bigy[test], pred) # 拉平混淆矩阵后按顺序取出真阴性、假阳性、假阴性、真阳性 tn, fp, fn, tp = cm_metric.result().numpy().ravel() fpr = fp / (fp + tn)
注意事项
- 若数据集存在极端分布(所有样本都是正类,导致FP+TN=0),可加入除零保护避免报错:
fpr = fp / (fp + tn) if (fp + tn) != 0 else 0.0
内容的提问来源于stack exchange,提问作者Malik Hamza
相关产品推荐
相关产品推荐

