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 评估器工作流程与数据流

下图展示了评估器在反洗钱模型评估流程中的位置与数据流转关系:

Spark MLlib 评估器工作流程 Spark MLlib 评估器工作流程(反洗钱场景) 原始交易数据 特征工程 模型训练 预测结果 评估器 Binary / Multiclass 评估指标 AUC / F1 / Recall 反馈调参 说明 评估器接收预测结果 与真实标签,输出指标

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),从不同角度监控模型效果,确保模型既能整体区分好坏,又能重点捕获高风险交易。