3. Spark MLlib 评估器:BinaryClassificationEvaluator 与 MulticlassClassificationEvaluator
在反洗钱监测模型的效果评估环节,Spark MLlib 提供了两个核心的评估器(Evaluator),分别对应二分类与多分类场景。反洗钱交易监测本质上是一个典型的二分类问题(正常交易 vs 可疑交易),但在某些细分场景(如交易类型分级、风险等级划分)中也会用到多分类评估。本章将深入剖析这两个评估器的原理、参数配置与输出指标。
3.1 BinaryClassificationEvaluator:二分类评估器
该评估器专用于二分类模型,通过比较预测概率与真实标签来计算评估指标。在反洗钱场景中,我们通常将“可疑交易”标记为正类(label=1),将“正常交易”标记为负类(label=0)。
3.1.1 核心参数与指标
| 参数名 | 说明 | 反洗钱场景默认值 |
|---|---|---|
metricName |
评估指标名称 | areaUnderROC |
rawPredictionCol |
原始预测列(通常为概率或置信度) | rawPrediction |
labelCol |
真实标签列 | label |
支持的 metricName 包括:
- areaUnderROC(AUC-ROC):衡量模型区分正负类能力的综合指标,值越接近 1.0 越好。反洗钱场景通常要求 AUC ≥ 0.85。
- areaUnderPR(AUC-PR):精确率-召回率曲线下面积,在正类样本极少(如可疑交易占比 < 1%)时比 AUC-ROC 更敏感。
反洗钱实践提示: 当数据集中可疑交易占比极低(< 0.5%)时,建议优先使用
areaUnderPR 作为主要评估指标,因为它能更真实地反映模型对少数类的捕获能力。
3.1.2 代码示例
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
val evaluator = new BinaryClassificationEvaluator()
.setMetricName("areaUnderROC")
.setRawPredictionCol("rawPrediction")
.setLabelCol("label")
val aucROC = evaluator.evaluate(predictions)
println(s"测试集 AUC-ROC = $aucROC")
// 切换到 AUC-PR
evaluator.setMetricName("areaUnderPR")
val aucPR = evaluator.evaluate(predictions)
println(s"测试集 AUC-PR = $aucPR")
3.2 MulticlassClassificationEvaluator:多分类评估器
当反洗钱模型需要将交易划分为多个风险等级(如:低风险、中风险、高风险、极高风险)时,需要使用多分类评估器。该评估器支持多种多分类指标,并允许通过 metricLabel 参数指定重点关注某个特定类别。
3.2.1 核心参数与指标
| 参数名 | 说明 | 反洗钱场景常用值 |
|---|---|---|
metricName |
评估指标名称 | f1 或 weightedPrecision |
predictionCol |
预测标签列 | prediction |
labelCol |
真实标签列 | label |
metricLabel |
指定关注某个类别(可选) | 例如 2(高风险) |
常用 metricName 取值:
- f1:加权 F1 分数(默认),综合精确率与召回率。
- weightedPrecision:加权精确率。
- weightedRecall:加权召回率。
- accuracy:准确率(在类别不平衡时需谨慎使用)。
- precisionByLabel:指定类别的精确率(需配合
metricLabel)。 - recallByLabel:指定类别的召回率(需配合
metricLabel)。
注意: 在多分类反洗钱场景中,不要仅依赖
accuracy。例如,如果 95% 的交易都是低风险,模型全部预测为低风险也能获得 95% 的准确率,但完全无法识别高风险交易。应优先使用 f1 或针对高风险类别的 recallByLabel。
3.2.2 代码示例
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
val multiEval = new MulticlassClassificationEvaluator()
.setMetricName("f1")
.setPredictionCol("prediction")
.setLabelCol("label")
val f1Score = multiEval.evaluate(predictions)
println(s"多分类加权 F1 分数 = $f1Score")
// 单独评估高风险类别(假设高风险标签为 2)的召回率
multiEval.setMetricName("recallByLabel").setMetricLabel(2)
val highRiskRecall = multiEval.evaluate(predictions)
println(s"高风险类别召回率 = $highRiskRecall")
3.3 评估器选择与反洗钱场景映射
以下表格总结了不同反洗钱场景下评估器的选择建议:
| 反洗钱场景 | 模型类型 | 推荐评估器 | 推荐指标 |
|---|---|---|---|
| 交易是否可疑(二分类) | 二分类 | BinaryClassificationEvaluator | areaUnderROC / areaUnderPR |
| 交易风险等级划分(多分类) | 多分类 | MulticlassClassificationEvaluator | f1 / weightedRecall |
| 重点关注高风险交易 | 多分类 | MulticlassClassificationEvaluator | recallByLabel(高风险标签) |
| 模型调参阶段 | 二分类 | BinaryClassificationEvaluator | areaUnderROC(稳定且单调) |
3.4 评估器工作流程与数据流
下图展示了评估器在反洗钱模型评估流程中的位置与数据流转关系:
3.5 两个评估器的核心差异对比
下表从多个维度对比两个评估器,帮助你在反洗钱项目中快速做出选择:
| 对比维度 | BinaryClassificationEvaluator | MulticlassClassificationEvaluator |
|---|---|---|
| 适用场景 | 二分类(可疑/正常) | 多分类(风险等级 0/1/2/3) |
| 输入列要求 | rawPredictionCol(概率) |
predictionCol(预测标签) |
| 核心指标 | AUC-ROC, AUC-PR | F1, Precision, Recall, Accuracy |
| 类别不平衡处理 | 支持 AUC-PR,对少数类敏感 | 支持 weighted 指标,可指定 metricLabel |
| 反洗钱推荐度 | ★★★★★(主场景) | ★★★☆☆(辅助场景) |
3.6 常见陷阱与避坑指南
- 陷阱1:二分类评估器传入了预测标签而非概率。 BinaryClassificationEvaluator 需要
rawPrediction列(包含概率值),如果传入的是硬分类标签(0/1),会导致 AUC 计算错误。解决方案:确保 pipeline 中输出概率的 transformer 正确配置。 - 陷阱2:多分类评估器在类别极度不平衡时使用 accuracy。 如前述,accuracy 会被多数类主导。应改用
weightedRecall或针对高风险类别的recallByLabel。 - 陷阱3:忽略
metricLabel参数。 在多分类反洗钱场景中,如果不设置metricLabel,默认计算的是所有类别的加权平均,可能掩盖高风险类别的低召回问题。
最佳实践: 在反洗钱模型评估中,建议同时使用 BinaryClassificationEvaluator(AUC-PR)和 MulticlassClassificationEvaluator(针对高风险类别的 recallByLabel),从不同角度监控模型效果,确保模型既能整体区分好坏,又能重点捕获高风险交易。