ighorj/aml-detector
GitHub: ighorj/aml-detector
基于 SAML-D 数据集的反洗钱交易检测 ML pipeline,通过随机森林和手工特征工程识别金融交易中的可疑洗钱行为。
Stars: 0 | Forks: 0
# AML Detector 🔍
一个用于检测金融交易中洗钱模式的机器学习 pipeline。
使用随机森林分类器(带有平衡的 class weights 以处理严重的类别不平衡)在 SAML-D 数据集(28 种真实世界的 AML 类型)上进行训练。
## 📌 概述
洗钱是指将非法所得的资金伪装成合法资金的过程。通常分为三个阶段:
- **处置** — 将非法资金引入金融系统(例如现金存款)
- **离析** — 通过复杂的交易掩盖资金轨迹(例如跨境转账、分拆交易)
- **融合** — 将资金作为合法资金重新引入
本项目构建了一个机器学习分类器,可根据行为模式标记可疑的金融交易——模拟了真实银行和金融科技公司中 AML 合规团队的工作。
## 🔎 功能介绍
- 加载完整的 SAML-D 数据集(950 万笔交易,9,873 起欺诈案例)
- 抽取 50 万笔正常交易 + 所有欺诈案例用于训练
- 构建 18 个行为特征(时间、金额、货币、收发方模式)
- 训练一个带有 `class_weight='balanced'` 的 Random Forest 以处理类别不平衡问题
- 使用 Precision、Recall 和 F1-score 在分层留出集上进行评估
- 可视化特征重要性
## 📊 结果
| 指标 | 分数 |
|---|---|
| Recall (洗钱) | **78%** |
| Precision (洗钱) | **37%** |
| F1-score (洗钱) | **0.50** |
| 检测到的欺诈案例 | 测试集中 **1,975** 个案例检测出 **1,548** 个 |
| 训练样本数 | 407,898 (7,898 起欺诈) |
| 测试样本数 | 101,975 (1,975 起欺诈) |
## 📈 主要发现
- `receiver_freq` — 从许多不同发送方接收资金的账户是典型的 *laranja*(钱骡)信号。
- `sender_freq` — 高频发送方在洗钱案例中占异常大的比例。
- `amount_vs_sender_avg` 捕捉了偏离发送方自身历史记录的行为——这是比原始金额更强的信号。
- `log_amount` 优于原始 `Amount`,因为洗钱金额跨越了多个数量级。
- `just_below_10k` 标志可捕捉**结构化**行为——即在报告阈值以下故意拆分交易。
- 跨境交易和货币不匹配显示出较弱但确实存在的相关性。
## 🧠 特征工程
| 特征 | 描述 | AML 信号 |
|---|---|---|
| `Amount`, `log_amount` | 原始和对数缩放的交易金额 | 捕获大额转账和结构化的小额交易 |
| `is_round_amount` | 金额可被 1000 整除 | 整数金额是结构化信号 |
| `just_below_10k` | 金额在 $9,000–$10,000 之间 | 经典的规避阈值模式 |
| `hour`, `is_night` | 交易小时和夜间标志 (00:00–06:00) | 非工作时间活动是风险指标 |
| `cross_border` | 发送方和接收方位于不同国家 | 跨境离析 |
| `currency_mismatch` | 支付货币与接收货币不同 | 利用货币转换掩盖资金轨迹 |
| `sender_freq`, `receiver_freq` | 每个账户的活动计数 | 钱骡和高频账户 |
| `sender_avg_amount` | 发送方的历史平均值 | 异常检测的基线 |
| `amount_vs_sender_avg` | 当前金额 ÷ 发送方的平均值 | 检测异常峰值 |
| `pay_*` | 独热编码的支付类型 | 捕捉支付方式模式 |
## 🗂️ 项目结构
```
aml-detector/
├── data/
│ ├── SAML-D.csv # Full dataset (not tracked by git, ~1GB)
│ └── SAML-sample.csv # 100k row sample (not tracked by git)
├── notebooks/
│ └── 01_exploration.ipynb # EDA and original beginner pipeline
├── src/
│ └── train.py # Improved training script
├── outputs/
│ ├── class_distribution.png
│ ├── laundering_types.png
│ ├── amount_distribution.png
│ ├── amount_vs_laundering.png
│ └── feature_importance.png
├── .gitignore
└── README.md
```
## 📦 数据集
**SAML-D — Synthetic Anti-Money Laundering Dataset**
- 28 种真实世界的 AML 类型(分拆交易、结构化、分层扇出、散射-收集等)
- 950 万笔交易,9,873 笔被标记为洗钱(流行率 0.1%)
- 标签:`Is_laundering` (0 = 正常, 1 = 可疑),`Laundering_type`
🔗 https://www.kaggle.com/datasets/berkanoztas/synthetic-transaction-monitoring-dataset-aml
## 🧰 技术栈
| 工具 | 用途 |
|---|---|
| Python 3 | 核心语言 |
| Pandas | 数据加载、操作、特征工程 |
| NumPy | 数值计算 |
| Scikit-learn | 模型训练与评估 |
| Matplotlib + Seaborn | 绘图 |
| Jupyter Lab | 交互式笔记本环境 |
## ⚙️ 如何运行
```
# 1. Clone repo
git clone https://github.com/ighorj/aml-detector.git
cd aml-detector
# 2. Install dependencies
pip install pandas numpy matplotlib seaborn scikit-learn jupyter
# 3. 从 Kaggle download dataset 并将其放置在 data/SAML-D.csv
# https://www.kaggle.com/datasets/berkanoztas/synthetic-transaction-monitoring-dataset-aml
# 4. Run 改进后的 training script
python src/train.py
# 或 explore 原始 notebook
jupyter lab notebooks/01_exploration.ipynb
```
## 🚧 已知局限性
- 没有时间窗口特征(例如 10 分钟窗口内每个发送方的转账次数)
- 没有网络/图分析(检测跨账户的 laranja 链条)
- 默认分类阈值为 0.5——可以通过调整在 precision 和 recall 之间进行权衡
- 尚未对基于树的梯度提升算法(XGBoost/LightGBM)进行基准测试
## 🔜 后续步骤
- [ ] 添加时间窗口特征(转账速度、突发检测)
- [ ] 使用 NetworkX 构建账户级别的网络图
- [ ] 与 XGBoost / LightGBM 进行对比
- [ ] 通过 precision-recall 曲线调整分类阈值
- [ ] 输出包含分数和原因的账户风险报告
## 👤 作者
由 [@ighorj](https://github.com/ighorj) 作为首个 ML 项目构建。
欢迎反馈、建议和合作。
标签:AML, Apex, Fintech, Python, RegTech, SAML-D数据集, 不平衡分类, 代码示例, 分类模型, 分类算法, 反洗钱, 合规科技, 异常检测, 数据分析, 数据科学, 无后门, 机器学习, 机器学习管道, 欺诈检测, 特征工程, 端到端流水线, 网络洗钱, 资源验证, 逆向工具, 金融科技, 金融风控, 随机森林, 风险评分