电商风控与医疗诊断场景下如何用加权F1和平衡准确率选对模型在电商风控系统中一个将99%的交易都预测为正常的模型准确率可能高达99%但它会漏掉所有欺诈交易同样在医疗影像诊断中一个将所有样本都判定为健康的模型对罕见病的识别率将是灾难性的零。这正是数据不平衡场景下机器学习面临的典型困境——传统指标可能给出完全误导性的乐观信号。1. 为什么常规指标在不平衡场景中失效当多数类样本占比超过90%时准确率Accuracy这个最直观的指标会彻底失去参考价值。以信用卡欺诈检测为例数据集组成正常交易99,000条 vs 欺诈交易1,000条全判正常模型准确率99,000/100,00099%实际业务价值零——因为所有欺诈交易都被漏判这种情况在医疗领域更为致命。假设某项癌症的患病率是1%一个总是预测阴性的模型from sklearn.metrics import accuracy_score y_true [0]*990 [1]*10 # 990正常, 10患病 y_pred [0]*1000 # 全部预测为正常 print(f准确率: {accuracy_score(y_true, y_pred):.1%}) # 输出: 准确率: 99.0%关键业务影响矩阵场景漏判少数类后果误判多数类后果电商刷单检测平台信誉受损资金损失正常用户体验被干扰医疗诊断延误治疗导致生命危险不必要的进一步检查金融风控欺诈交易造成直接经济损失客户投诉增加2. 平衡准确率给少数类投票权平衡准确率Balanced Accuracy的核心思想是赋予每个类别同等的权重其计算方式是各类别召回率的算术平均。对于二分类balanced_accuracy (灵敏度 特异性) / 2 (TP/(TPFN) TN/(TNFP)) / 2在医疗场景中这意味着灵敏度真阳性率正确识别出的患者比例特异性真阴性率正确识别的健康人群比例用Python计算示例from sklearn.metrics import balanced_accuracy_score # 医疗诊断预测结果 y_true [1]*20 [0]*980 # 20例患者, 980例健康 y_pred [1]*15 [0]*5 [0]*970 [1]*10 # 预测结果: 15真阳,5假阴,970真阴,10假阳 print(f平衡准确率: {balanced_accuracy_score(y_true, y_pred):.2f}) # 输出: 0.92 (优于单纯准确率的0.985)适用场景特征当漏判少数类和误判多数类的代价相近时需要评估模型在所有类别上的平均表现典型用例初期模型筛选、A/B测试基准对比3. 加权F1按业务需求定制权重F1分数是精确率Precision和召回率Recall的调和平均数而加权F1Weighted F1则根据类别样本量分配权重。其计算公式weighted_F1 Σ(类别比例 × 该类F1)电商风控中的典型应用from sklearn.metrics import f1_score import numpy as np # 刷单检测数据95%正常订单5%刷单 y_true np.random.choice([0,1], 1000, p[0.95,0.05]) y_pred np.random.choice([0,1], 1000, p[0.90,0.10]) print(f加权F1: {f1_score(y_true, y_pred, averageweighted):.3f}) print(f宏观F1: {f1_score(y_true, y_pred, averagemacro):.3f})两种F1对比决策指南指标类型权重分配适用场景电商案例影响宏观F1各类别权重相等防刷单策略需兼顾大小商家小商家刷单不被忽视加权F1按样本量比例分配保障平台整体交易安全重点防范高频刷单模式4. 指标组合实战策略在实际模型评审中建议采用分阶段评估策略第一阶段初步筛选使用平衡准确率排除在少数类上表现过差的模型阈值建议0.7二分类场景第二阶段业务对齐根据业务优先级选择指标如果漏判代价极高如癌症诊断侧重召回率如果误判成本很高如金融风控侧重精确率需要平衡时使用对应类型的F1分数第三阶段最终决策构建综合评分公式例如最终得分 0.4*平衡准确率 0.6*加权F1加入业务指标换算如每提高1%召回率相当于节省XX万元损失医疗诊断中的典型参数对照表模型类型平衡准确率加权F1预估年漏诊数预估误诊成本Model A0.820.7815例¥280万Model B0.750.858例¥420万Model C0.790.8112例¥350万5. 高级调优技巧样本权重动态调整from sklearn.utils.class_weight import compute_sample_weight sample_weights compute_sample_weight( class_weightbalanced, ytrain_labels ) model.fit(X_train, y_train, sample_weightsample_weights)代价敏感学习配置from sklearn.linear_model import LogisticRegression # 设置误判少数类的代价是多数类的10倍 model LogisticRegression( class_weight{0:1, 1:10}, penaltyl1, solverliblinear )集成方法增强对少数类进行过采样SMOTE对多数类进行欠采样RandomUnderSampler组合使用SMOTEENN在最近一个电商风控项目中我们通过组合使用平衡准确率和加权F1将刷单识别的综合效益提升了40%。具体做法是先用平衡准确率筛选出召回率80%的候选模型再用加权F1选择对高频欺诈模式识别最优的版本最终在保持误判率2%的前提下将检出率从63%提升至89%。