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数据集, 不平衡分类, 代码示例, 分类模型, 分类算法, 反洗钱, 合规科技, 异常检测, 数据分析, 数据科学, 无后门, 机器学习, 机器学习管道, 欺诈检测, 特征工程, 端到端流水线, 网络洗钱, 资源验证, 逆向工具, 金融科技, 金融风控, 随机森林, 风险评分