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 等)。选它做主路的理由有三:
- 标签语义干净——交易级二元标签
Is_Laundering,正好对应我们binaryEval的 suspicious vs normal,几乎零转换成本。 - 规模大、许可宽松——可公开下载用于研究,规模足够切出 N≈300 的均衡子集还绰绰有余。
- 与项目领域模型可映射——行里的 From/To-Bank+Account、Amount、Timestamp、Payment Format 能对齐到
src/aml/types.ts的AmlCase/AmlTransaction(这是 Day 133 的活)。
备路:Elliptic(2019-08)。 比特币交易图,节点级 illicit/licit 标签。它的价值是「图结构 + 真实链上数据」,但短板明显:
- 年代久(2019),分布可能漂移,洗钱手法在 6 年里已演化;
- 标签语义是节点分类,不是交易级二元,与我们
binaryEval的对齐成本更高; - 特征是匿名化的图嵌入(166 维),不易映射到人类可读的
AmlCase,也不利于 SAR 叙述的证据引用。
所以 Elliptic 降为备路/补充,主线仍走 AMLworld。
选型的四个维度(写进选型记录)。
- 标签语义:交易级二元(AMLworld,✓ 直接对齐)vs 节点分类(Elliptic,需转换)。
- 规模:AMLworld HI-Small 行数足够做 N≈300 的均衡子集,且有 LI/HI × Small/Medium/Large 多档可选。
- 许可:公开、可研究用途,须记录来源 URL + 下载日期以备审计(AML 是强监管域,数据来源可审计本身就是要求)。
- 与
AmlCase可映射性:列结构能不能落到领域模型——这是能否复用既有评测代码(binaryEval、混淆矩阵、SAR、审计轨迹)的关键。
关键权衡:合成 vs 真实。 有人会问「合成数据能算外部 ground-truth 吗?」能,且这正是它的优势组合:
- 洗钱真实数据极难公开(隐私 + 监管壁垒),AMLworld 用专家定义的模式合成 + 硬标签,既给了可验证的真值,又规避了隐私问题;
- 关键区别于 Day 131 的循环:AMLworld 的生成器不是我们写的,也不是我们的预测器——标签和我们的系统完全解耦,外部效度成立。
所以「合成」不等于「无效」;无效的判据是「合成器是否与预测器同源」,AMLworld 满足解耦,因此合法。
2. 推导 / 手算 / 代码走读
今天没有本仓新代码要走读(schema/loader 是 Day 133-134 才建),但需对照两端的契约。
目标端契约(src/aml/types.ts,真实既有代码):我们要映射进去的核心字段是 AmlTransaction(accountId、counterpartyAccountId?、counterpartyName?、direction、channel、amountCents、dayOffset、memo?)与 AmlCase.label(TypologyId | '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 Account | accountId | 主体账户 |
To Account | counterpartyAccountId | 对手账户 |
Timestamp | dayOffset(相对窗口最早一天) | 派生 |
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. 今日实战
- 从 Kaggle 下载 IBM AMLworld 的 HI-Small 交易 CSV(
HI-Small_Trans.csv),记录来源 URL + 下载日期。 - 用
wc -l HI-Small_Trans.csv统计总行数(含/不含表头要标注清楚)。 - 统计
Is_Laundering=1的正例数与占比(典型 <0.1%,极度不平衡)——可用awk -F, 'NR>1 && $NF==1{c++} END{print c}'之类一行命令,或落进临时脚本。 - 把 CSV 落到数据目录(git-ignore,不入仓),并在
docs/aipa/或数据 README 里记下:来源 URL、下载日期、总行数、正例率。 - 不要把大文件提交进仓库——只提交统计结果与来源记录。
4. 今日实测 / 产出
- 状态:待数据(下载公开集)。
- 产出(待数据后):数据集落盘 + 正负样本计数(总行数 + 正例率 %)。
- 代码现状(诚实标注):
src/aml/groundTruthEval.ts的注释已显式说明 dataset download 是 network-gated;其 math 部分(binaryEval/binaryEvalWithCI)已 pure + tested(在 423 测试套件内绿)。 - 铁律:本日产出的真实行数 / 正例率需下载后填入,不预先编造。
src/aml/amlworldSchema.ts与src/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做运行时列校验)。