返回 AICAP-180
B14 · Day 132外部 ground-truth AML eval

AML 公开标注集选型

昨天(Day 131)我们诊断出循环自评的病根:预测器和标签同源、无外部效度,于是给规则基线盖了「作弊基线」钢印。要真正治病,前提是接入一批带真标签、且不是我们自己造的外部数据。

阶段: B14 · 外部 ground-truth AML eval(Day 131-140) 标签: #amlworld #external-dataset #class-imbalance #dataset-selection

今日导引(由浅入深)

昨天(Day 131)我们诊断出循环自评的病根:预测器和标签同源、无外部效度,于是给规则基线盖了「作弊基线」钢印。要真正治病,前提是接入一批带真标签、且不是我们自己造的外部数据。

今天就是 B14 治疗的第一步——做数据集选型(dataset selection):在公开 AML 标注集里选主路 + 备路,把理由说清楚,并把它落盘 + 算正负样本比例。这是从「自评」走向「他评」的物理起点。

放到 B1→B18 能力曲线上看:B13 给了我们度量工具,B14 现在要给这些工具喂「外部真值」。今天不写算法,写的是工程判断力——在多个公开数据集间做带理由的取舍,这本身是 AI Solutions Architect 的核心能力(选型 + build-vs-buy)。最小可判定产出:选定 IBM AMLworld 为主路、下载 HI-Small CSV、统计总行数与 Is_Laundering=1 正例率(典型 <0.1%,极度不平衡)——这个不平衡数字直接决定 Day 134 为什么必须做分层抽样。

1. 机理精读

为什么必须换外部数据。 杀死循环 baseline 的唯一办法,是让标签和预测器解耦:标签来自一个我们没参与生成的公开标注集,预测来自一个独立的 LLM。Day 131 已论证规则自评是同义反复;今天补上另一半——只有标签外部化,Day 135 的 LLM judge 输出和真标签的一致率才有效度可言。换言之,外部标签是后面五天(judge 校准、混淆矩阵、bootstrap CI、leaderboard)所有数字的地基。

主路:IBM AMLworld(Kaggle, 2024-04)。 它是合成但带硬标签的交易级数据集:每行有 Is_Laundering ∈ {0,1},并覆盖 8 种洗钱模式(structuring / scatter-gather / fan-in / fan-out / cycle / bipartite / stack / random 等)。选它做主路的理由有三:

  1. 标签语义干净——交易级二元标签 Is_Laundering,正好对应我们 binaryEval 的 suspicious vs normal,几乎零转换成本。
  2. 规模大、许可宽松——可公开下载用于研究,规模足够切出 N≈300 的均衡子集还绰绰有余。
  3. 与项目领域模型可映射——行里的 From/To-Bank+Account、Amount、Timestamp、Payment Format 能对齐到 src/aml/types.tsAmlCase/AmlTransaction(这是 Day 133 的活)。

备路:Elliptic(2019-08)。 比特币交易图,节点级 illicit/licit 标签。它的价值是「图结构 + 真实链上数据」,但短板明显:

  • 年代久(2019),分布可能漂移,洗钱手法在 6 年里已演化;
  • 标签语义是节点分类,不是交易级二元,与我们 binaryEval 的对齐成本更高;
  • 特征是匿名化的图嵌入(166 维),不易映射到人类可读的 AmlCase,也不利于 SAR 叙述的证据引用。

所以 Elliptic 降为备路/补充,主线仍走 AMLworld。

选型的四个维度(写进选型记录)。

  1. 标签语义:交易级二元(AMLworld,✓ 直接对齐)vs 节点分类(Elliptic,需转换)。
  2. 规模:AMLworld HI-Small 行数足够做 N≈300 的均衡子集,且有 LI/HI × Small/Medium/Large 多档可选。
  3. 许可:公开、可研究用途,须记录来源 URL + 下载日期以备审计(AML 是强监管域,数据来源可审计本身就是要求)。
  4. AmlCase 可映射性:列结构能不能落到领域模型——这是能否复用既有评测代码(binaryEval、混淆矩阵、SAR、审计轨迹)的关键。

关键权衡:合成 vs 真实。 有人会问「合成数据能算外部 ground-truth 吗?」能,且这正是它的优势组合:

  • 洗钱真实数据极难公开(隐私 + 监管壁垒),AMLworld 用专家定义的模式合成 + 硬标签,既给了可验证的真值,又规避了隐私问题;
  • 关键区别于 Day 131 的循环:AMLworld 的生成器不是我们写的,也不是我们的预测器——标签和我们的系统完全解耦,外部效度成立。

所以「合成」不等于「无效」;无效的判据是「合成器是否与预测器同源」,AMLworld 满足解耦,因此合法。

2. 推导 / 手算 / 代码走读

今天没有本仓新代码要走读(schema/loader 是 Day 133-134 才建),但需对照两端的契约。

目标端契约(src/aml/types.ts,真实既有代码):我们要映射进去的核心字段是 AmlTransactionaccountIdcounterpartyAccountId?counterpartyName?directionchannelamountCentsdayOffsetmemo?)与 AmlCase.labelTypologyId | 'normal')。

注意 types.ts 顶部注释的纪律:金额一律整数分amountCents: number,禁止 float 货币运算,与 dsdb-lab ledger 同一纪律)。AMLworld 的 Amount 列是浮点,解析时要 Math.round(amount * 100)

源端结构(AMLworld 行,预读 dataset card)Timestamp / From Bank+Account / To Bank+Account / Amount / Receiving Currency/Payment Currency / Payment Format / Is_Laundering。映射草图(正式落 Day 133):

AMLworld 列AmlTransaction 字段备注
Is_Laundering ∈ {0,1}二元真标签(1=suspicious,0=normal)核心 ground truth
Amount(浮点)amountCents(×100 取整)禁止 float
From AccountaccountId主体账户
To AccountcounterpartyAccountId对手账户
TimestampdayOffset(相对窗口最早一天)派生
Payment Format(Cash/Wire/ACH/Cheque…)channel枚举映射

不平衡的手算直觉:若 HI-Small 有 ~500 万行、正例率 0.1%,则正例 ~5000 条、负例 ~499.5 万条。直接随机抽 300 条裁判,期望约 300 × 0.001 = 0.3 条正例——召回率分母(TP+FN)几乎为 0,数字毫无意义。这就是 Day 134 必须做分层平衡抽样(≈150 正 / 150 负)的算术理由。今天量出真实正例率,就是为了给 Day 134 的抽样预算定锚。

AMLworld 子集档位对照(选 HI-Small 的理由):数据集提供两个维度的档位——

档位前缀含义适用
LI(Lower Illicit)洗钱比例更低,更贴近真实极端不平衡终态压力测试
HI(Higher Illicit)洗钱比例略高,正例更密打通管线、初版评测
Small / Medium / Large行数规模递增按算力/成本选

HI-Small:正例相对密一些(抽 150 正例更省事)、规模小(流式 + 抽样跑得快、token 成本低),适合先把 Day 133-137 整条管线打通。等管线稳定,可换 LI-Small 做更接近真实基率的压力测试——但那是后话,今天先锚定 HI-Small。

与备路的决策记录(写进选型文档):一句话决策——「主路 AMLworld HI-Small(交易级二元、易映射、合成解耦),备路 Elliptic(图结构、节点级、年代久),不选私有/爬取数据(许可不可审计)」。这条记录本身就是 AISA 作品集里 build-vs-buy / 选型论证的一个微型样本。

3. 今日实战

  1. 从 Kaggle 下载 IBM AMLworld 的 HI-Small 交易 CSV(HI-Small_Trans.csv),记录来源 URL + 下载日期。
  2. wc -l HI-Small_Trans.csv 统计总行数(含/不含表头要标注清楚)。
  3. 统计 Is_Laundering=1 的正例数与占比(典型 <0.1%,极度不平衡)——可用 awk -F, 'NR>1 && $NF==1{c++} END{print c}' 之类一行命令,或落进临时脚本。
  4. 把 CSV 落到数据目录(git-ignore,不入仓),并在 docs/aipa/ 或数据 README 里记下:来源 URL、下载日期、总行数、正例率。
  5. 不要把大文件提交进仓库——只提交统计结果与来源记录。

4. 今日实测 / 产出

  • 状态待数据(下载公开集)
  • 产出(待数据后):数据集落盘 + 正负样本计数(总行数 + 正例率 %)。
  • 代码现状(诚实标注)src/aml/groundTruthEval.ts 的注释已显式说明 dataset download 是 network-gated;其 math 部分(binaryEval / binaryEvalWithCI)已 pure + tested(在 423 测试套件内绿)。
  • 铁律:本日产出的真实行数 / 正例率需下载后填入,不预先编造src/aml/amlworldSchema.tssrc/aml/amlworldLoader.ts 当前尚未创建(Day 133-134 才建),如实标注「待建」。

5. 常见误区 / 陷阱

  • 把大 CSV 提交进 git——会撑爆仓库、踩许可红线;只提交统计与来源记录,原始数据本地化 + ignore。
  • 忽略极端不平衡直接抽样:随机抽 300 条几乎抽不到正例,recall 失真——这是 Day 134 的伏笔,今天就要意识到并量化。
  • 用无明确许可的爬取数据冒充公开集:外部效度的前提之一是可审计的来源,许可不清即不可用。
  • 以为合成 = 无效:AMLworld 合成但标签硬、生成器与我们的系统解耦,外部效度成立;别和 Day 131 的循环自评混为一谈——判据是「同源否」,不是「合成否」。

6. 学习资源(每条带 YYYY-MM)

  • IBM AMLworld dataset card, Kaggle (2024-04)——主路数据集,列定义 + Is_Laundering 标签 + 8 模式说明。
  • Altman et al.《Realistic Synthetic Financial Transactions for Anti-Money Laundering Models》(NeurIPS Datasets, arXiv:2306.16424, 2023-06)——AMLworld 生成方法论原始论文。
  • Weber et al.《Anti-Money Laundering in Bitcoin: Experimenting with Graph Convolutional Networks for Financial Forensics》(Elliptic, arXiv:1908.02591, 2019-08)——备路数据集来源。
  • Anthropic《Demystifying evals》(2026-01)——外部标签独立来源要求。
  • 本仓代码:src/aml/types.ts(映射目标契约)、src/aml/groundTruthEval.ts(network-gated 注释 + pure math)。

SOTA检查 (2026-06 更新)

  • 当前主流:AMLworld (2024-04) 仍是公开 AML 标注集的主流选择,无更新替代品。
  • 是否仍 SOTA:是。交易级二元标签 + 多模式覆盖 + 宽松许可的组合在公开数据里仍属最佳。
  • 补充候选:Elliptic2 (2024) 可作补充(更大规模的图数据集、节点对级标签),但规模/许可需复核后再用;不作主线。
  • 过时黑名单:避免用已停更的私有反洗钱样本、或无明确许可的爬取数据;避免把 2019 Elliptic 当唯一主线(分布可能漂移)。
  • 下次复查点:Day 133 schema 对齐前,确认下载到的 HI-Small 列结构与 dataset card (2024-04) 一致(自 2024-04 列结构未变);执行当周复核 Kaggle 上 AMLworld 许可条款无变更。

衔接

  • 昨天:Day 131 — 循环自评为何无效(盖「作弊基线」钢印,引出对外部标签的需求)。
  • 今天:选 IBM AMLworld 为主路、Elliptic 为备路,下载 HI-Small 并量化极端不平衡的正例率。
  • 明天:Day 133 — schema 对齐(把 AMLworld 行映射到 AmlCase,写 amlworldSchema.ts 做运行时列校验)。