4. 反欺诈指标定义:拦截率、误杀率、准确率、召回率、F1-score、AUC-ROC

在反欺诈A/B测试与阈值分层中,没有统一的“好模型”标准,只有符合业务容忍度的指标组合。本章定义六大核心指标,并解释它们如何在欺诈拦截与用户体验之间形成权衡。

4.1 混淆矩阵:所有指标的起点

所有分类指标都来自混淆矩阵的四个基本计数:

实际 \ 预测 预测为欺诈(Positive) 预测为正常(Negative)
实际欺诈(Positive) TP(真阳性)
正确拦截的欺诈
FN(假阴性)
漏过的欺诈
实际正常(Negative) FP(假阳性)
误杀的正常用户
TN(真阴性)
正确放行的正常用户
记忆口诀:“预测为正看实际”——TP是预测欺诈且实际欺诈;FP是预测欺诈但实际正常(误杀)。

4.2 六大指标定义与公式

指标 公式 业务含义 理想方向
拦截率 TP / (TP + FN) 所有真实欺诈中被模型拦截的比例 ↑ 越高越好
误杀率 FP / (FP + TN) 所有正常用户中被错误拦截的比例 ↓ 越低越好
准确率 (TP + TN) / (TP + FP + FN + TN) 全部预测中预测正确的比例 ↑ 越高越好
召回率 TP / (TP + FN) 同拦截率,欺诈样本的覆盖能力 ↑ 越高越好
精确率 TP / (TP + FP) 所有拦截操作中真正是欺诈的比例 ↑ 越高越好
F1-score 2 × (P × R) / (P + R) 精确率与召回率的调和平均 ↑ 越高越好
AUC-ROC ROC曲线下面积 模型区分欺诈与正常用户的整体能力 ↑ 越接近1越好
常见误区:准确率在欺诈场景中具有欺骗性。当欺诈比例仅为1%时,全部预测为“正常”也能获得99%准确率,但模型完全没有拦截能力。因此欺诈场景优先关注召回率(拦截率)与精确率的组合。

4.3 拦截率 vs 误杀率:核心权衡

拦截率与误杀率是一对跷跷板:

  • 提高拦截率 → 降低阈值,更多交易被拦截 → 漏过欺诈减少,但正常用户被误杀增加。
  • 降低误杀率 → 提高阈值,仅拦截高置信度欺诈 → 用户体验改善,但漏过欺诈风险上升。

在A/B测试中,我们需要同时观察这两个指标,而不是只看单一指标。

拦截率 vs 误杀率:阈值权衡曲线 拦截率(召回率) 0% 100% 误杀率 0% 100% 阈值(从严格到宽松 →) 严格 宽松 拦截率 误杀率 理想平衡区 高拦截 + 低误杀

4.4 AUC-ROC:模型区分能力的全局指标

ROC曲线以假阳性率(FPR = 1 - 特异性)为横轴、真阳性率(TPR = 召回率)为纵轴,绘制不同阈值下的表现。AUC是曲线下面积:

  • AUC = 1.0:完美模型,能完全区分欺诈与正常。
  • AUC = 0.5:随机猜测,无区分能力。
  • AUC < 0.5:比随机还差,通常说明标签或特征有问题。
业务解读:AUC不依赖具体阈值,适合在A/B测试中比较不同模型的排序能力。如果模型A的AUC为0.92,模型B为0.88,则A在任意阈值下通常都能取得更好的拦截/误杀平衡。

4.5 F1-score:精确率与召回率的调和平均

当业务同时关注“拦截的准确性”和“覆盖的全面性”时,F1-score是单一综合指标:

  • F1高 → 精确率和召回率都较高,模型在拦截欺诈的同时较少误杀。
  • F1低 → 至少一个指标偏低,要么漏过太多欺诈,要么误杀太多正常用户。

在阈值分层中,不同分层可以追求不同的F1目标:高风险层追求高召回(容忍一定误杀),低风险层追求高精确率(减少打扰)。

4.6 指标选择矩阵:不同场景的优先级

业务场景 首要指标 次要指标 说明
高资金风险(转账、提现) 拦截率(召回率) 误杀率 宁可误杀,不可漏过
高用户体验(登录、浏览) 误杀率 拦截率 减少对正常用户的干扰
模型对比选型 AUC-ROC F1-score 全局排序能力 + 平衡点
阈值调优 拦截率 vs 误杀率曲线 F1-score 找到业务可接受的平衡点
监管合规报告 拦截率 + 误杀率 准确率 监管通常要求双指标披露

4.7 代码示例:计算所有指标

import numpy as np
from sklearn.metrics import confusion_matrix, roc_auc_score, f1_score

def calculate_anti_fraud_metrics(y_true, y_pred, y_prob=None):
    """
    计算反欺诈核心指标
    y_true: 真实标签(1=欺诈,0=正常)
    y_pred: 预测标签(1=拦截,0=放行)
    y_prob: 预测概率(用于AUC)
    """
    tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()

    # 拦截率(召回率)
    recall = tp / (tp + fn) if (tp + fn) > 0 else 0.0

    # 误杀率
    fpr = fp / (fp + tn) if (fp + tn) > 0 else 0.0

    # 精确率
    precision = tp / (tp + fp) if (tp + fp) > 0 else 0.0

    # 准确率
    accuracy = (tp + tn) / (tp + fp + fn + tn)

    # F1-score
    f1 = f1_score(y_true, y_pred)

    # AUC-ROC
    auc = roc_auc_score(y_true, y_prob) if y_prob is not None else None

    return {
        '拦截率(召回率)': round(recall, 4),
        '误杀率': round(fpr, 4),
        '精确率': round(precision, 4),
        '准确率': round(accuracy, 4),
        'F1-score': round(f1, 4),
        'AUC-ROC': round(auc, 4) if auc is not None else None
    }

# 示例使用
y_true = [1, 0, 1, 0, 1, 0, 0, 1]
y_pred = [1, 0, 0, 0, 1, 0, 1, 1]
y_prob = [0.9, 0.2, 0.4, 0.1, 0.8, 0.3, 0.6, 0.95]

metrics = calculate_anti_fraud_metrics(y_true, y_pred, y_prob)
for k, v in metrics.items():
    print(f"{k}: {v}")
实战建议:在A/B测试中,不要只看单一指标。建议同时监控拦截率、误杀率、F1-score三个指标,并设定业务可接受的误杀率上限(如<0.5%),在此约束下最大化拦截率。