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, 不平衡数据处理, 二元分类, 反欺诈, 数据科学, 无后门, 时间序列验证, 机器学习, 欺诈检测, 特征工程, 端到端流水线, 资源验证, 超参数调优, 逆向工具, 金融风控, 集成学习