irishask/ML_Fraud_detection
GitHub: irishask/ML_Fraud_detection
基于 LightGBM 的端到端金融欺诈检测流水线,包含行为特征工程、时间验证和 Optuna 调优,在 IEEE-CIS 数据集上达到 ROC AUC 0.9272。
Stars: 0 | Forks: 0
# IEEE-CIS 欺诈检测流水线
基于 [Kaggle IEEE-CIS / Vesta Corporation 数据集](https://www.kaggle.com/competitions/ieee-fraud-detection) 的端到端 ML 欺诈检测流水线。
LightGBM + XGBoost,包含行为特征工程、Optuna 超参数调优,以及严格防止泄漏的基于时间的验证。
## 结果
| 版本 | 模型 | ROC AUC | PR AUC | Δ ROC | Δ PR |
|---------|-------|--------:|-------:|------:|-----:|
| v0 | LightGBM — 原始特征,默认参数 | 0.9196 | 0.5804 | — | — |
| v1 | LightGBM + 聚合 + 速度特征 | 0.9235 | 0.5813 | +0.0039 | +0.0009 |
| **v2** | **LightGBM + 行为特征 + Optuna** | **0.9272** | **0.6039** | **+0.0076** | **+0.0235** |
| v2 | XGBoost + Optuna | 0.9226 | 0.5641 | +0.0030 | −0.0163 |
| v2 | 集成 (LightGBM + XGBoost) | 0.9264 | 0.5907 | +0.0068 | +0.0103 |
**最佳模型:v2 LightGBM** — 在 ROC AUC 和 PR AUC 上均为最强。
## 数据集
- **来源:** [Kaggle IEEE-CIS 欺诈检测](https://www.kaggle.com/competitions/ieee-fraud-detection) — 由 Vesta Corporation 提供
- **大小:** 约 59 万笔交易,约 431 个原始特征
- **欺诈率:** 3.5%(严重不平衡)
- **文件:** `train_transaction.csv` + `train_identity.csv` 基于 `TransactionID` 合并
## 项目结构
```
ML_Fraud_detection/
│
├── data/
│ ├── raw/ # Original Kaggle CSVs — never modified
│ ├── processed/ # Merged + memory-reduced parquet files
│ ├── train.parquet
│ └── test.parquet
│
├── src/ # Shared modules across all versions
│ ├── config.py # Paths, constants, seeds
│ ├── data_loader.py # Load, merge, save raw and processed data
│ ├── feature_init_utils.py # Initial features from EDA (time, device)
│ ├── pipeline_preprocess.py # Load splits, preprocess, run Optuna
│ ├── pipeline_evaluate.py # Train LightGBM / XGBoost, save models
│ ├── preproc_lgbm_xgboost.py # Label encoding + NaN fill
│ ├── preproc_agg.py # Aggregation features
│ ├── preproc_behavioral.py # Behavioral fingerprint features
│ ├── preproc_product.py # Product/service profile features
│ ├── train_lightgbm.py # LightGBM training module
│ ├── train_xgboost.py # XGBoost training module
│ ├── train_ensemble.py # Weighted average ensemble
│ ├── tune_optuna.py # Optuna tuning: LightGBM, XGBoost
│ └── evaluate_ml.py # Metrics, ROC/PR plots, feature importance
│
├── v0/ # Baseline
│ ├── baseline_v0.ipynb # ROC 0.9196 | PR 0.5804
│ ├── preproc_v0.py
│ ├── split_v0.py
│ └── train_v0.py
│
├── v1/ # Sprint 1 — aggregations & velocity
│ └── v1_aggr_ensemble_with_optuna.ipynb # ROC 0.9235 | PR 0.5813
│
├── v2/ # Sprint 2 — behavioral features + ensemble
│ ├── 01_eda_v2.ipynb
│ ├── 02_feature_engineering.ipynb
│ ├── 03_preprocess_train_clean_optuna3.ipynb
│ └── 04_predict_evaluate.ipynb # ROC 0.9272 | PR 0.6039
│
└── outputs/
├── enriched/ # Engineered features (parquet)
├── models/ # Saved models (pkl)
├── preproc/ # Preprocessed splits (parquet)
├── best_params_lgbm.json # Optuna best params — LightGBM
└── best_params_xgb.json # Optuna best params — XGBoost
```
## 流水线概述
流水线按顺序运行 4 个 notebook:
**`01_eda_v2.ipynb`** — 探索性数据分析:分布、欺诈模式、缺失值、特征相关性。
**`02_feature_engineering.ipynb`** — 构建包含所有工程特征的 `train_enriched.parquet`。在 train/val 分割之前对完整训练集运行,以避免泄漏。
**`03_preprocess_train_clean_optuna3.ipynb`** — 基于时间的 train/val 分割(按 `TransactionDT` 80/20 分割)、标签编码、LightGBM 和 XGBoost 的 Optuna 超参数调优。
**`04_predict_evaluate.ipynb`** — 训练最终模型,计算集成,评估所有模型,绘制 ROC/PR 曲线和特征重要性。
## 特征工程
特征分三个版本层构建:
**v1 — 聚合与速度**
- 每个用户的累积交易统计:`TransactionAmt` 的均值、标准差、最小值、最大值、计数
- 多周期速度:过去 3 天 / 7 天 / 30 天时间窗口内的交易计数
- 与上一笔交易的差值:金额变化、距上一笔交易的时间
- 电子邮件域名不稳定性:每张卡电子邮件域名变化的熵
- 设备不稳定性:每张卡设备变化的熵
**v2 — 行为指纹**
- 每个用户的典型交易小时(基于百分位)
- 与个人金额中位数的偏差(`amt_vs_personal_median`、`amt_z_score`)
- 相对于用户历史的金额比率(`tx_amt_ratio`)
- 行为熵:`uid_time_entropy` — 交易时间的不可预测性
**无泄漏保证:** 所有聚合均使用 `expanding().shift(1)` 或 `closed='left'` 滚动窗口 — 当前行始终被排除。train/val 分割严格基于时间。
## 超参数调优
Optuna TPE(Tree-structured Parzen Estimator),采用 **MED 质量配置**(约 50 次试验,50% 数据采样):
| 模型 | 试验次数 | 样本 | 大致时间 (CPU) |
|-------|-------:|-------:|-------------------:|
| LightGBM | 50 | 50% of train | ~2–3h |
| XGBoost | 50 | 50% of train | ~2–3h |
## 验证策略
- **基于时间的分割:** 80% train / 20% val,按 `TransactionDT` 分割 — 无随机打乱
- **为何基于时间:** 欺诈模式随时间演变;随机分割会将未来信息泄漏到训练中,导致指标虚高且不可靠
- **指标:** 每个版本都跟踪 ROC AUC 和 PR AUC — 鉴于 3.5% 的类别不平衡,PR AUC 是主要指标
## 与 Kaggle 排行榜对比
| 水平 | ROC AUC |
|-------|--------:|
| 第 1 名 (Chris Deotte) — GPU,数千个特征,3 模型集成 | 0.9459 |
| 前 1% (银牌) — 多模型融合 | ~0.936 |
| 前 5% | ~0.930–0.934 |
| **本项目 — v2 LightGBM (仅 CPU)** | **0.9272** |
| v0 基准 | 0.9196 |
与顶尖解决方案的差距由三个因素解释:特征工程规模(顶尖解决方案设计数百个特征,而此处仅有 23 个)、所有模型在最终特征上完全调优的多模型集成,以及 GPU 加速使得更深入的 Optuna 搜索成为可能。
## 技术栈
| 工具 | 角色 |
|------|------|
| Python 3.10+ | 核心语言 |
| LightGBM | 主要模型 |
| XGBoost | 集成模型 |
| Optuna | 超参数调优 (TPE) |
| pandas / numpy | 特征工程 |
| scikit-learn | 预处理,指标 |
| matplotlib | ROC/PR 曲线,特征重要性 |
| Jupyter / Cursor IDE | 开发环境 |
## 如何运行
```
# 安装依赖
pip install lightgbm xgboost optuna pandas numpy scikit-learn matplotlib
# 将 Kaggle 数据文件放置在 data/raw/
# train_transaction.csv, train_identity.csv, test_transaction.csv, test_identity.csv
# 按顺序运行 notebooks
jupyter notebook v2/01_eda_v2.ipynb
jupyter notebook v2/02_feature_engineering.ipynb
jupyter notebook v2/03_preprocess_train_clean_optuna3.ipynb
jupyter notebook v2/04_predict_evaluate.ipynb
```
## 未来改进
- **使用更新后的特征重新调优 XGBoost** — XGBoost PR AUC (0.5641) 低于基准;针对 PR AUC 而非 ROC AUC 重新运行 Optuna 可能会解决此问题
- **目标编码** — 用留一法目标编码替换标签编码,用于高基数分类特征(`card1`、`addr1`、`P_emaildomain`)
- **UID 构建** — 遵循 Chris Deotte 的方法,从 `card1 + addr1 + D1` 构建稳定的用户身份;按 UID 聚合所有特征以获取更丰富的行为信号
- **带 GPU 的 CatBoost** — CatBoost 的有序提升非常适合此数据集,但需要 GPU 才能进行大规模的实际 Optuna 调优
- **堆叠集成** — 用元学习器(基于折外预测的逻辑回归)替换加权平均,以构建更强、相关性更低的集成
*作为 HIT (Holon Institute of Technology) 机器学习课程的期末项目构建。*
标签:Apex, IEEE-CIS, Kaggle, LightGBM, Optuna, Python, ROC AUC, Vesta, XGBoost, 不平衡数据处理, 二元分类, 反欺诈, 数据科学, 无后门, 时间序列验证, 机器学习, 欺诈检测, 特征工程, 端到端流水线, 资源验证, 超参数调优, 逆向工具, 金融风控, 集成学习