Fikri645/fraud-detection
GitHub: Fikri645/fraud-detection
一套面向金融支付的实时信用卡欺诈检测系统,集成了零泄漏特征工程、多模型对比、成本敏感学习、毫秒级实时评分及模型可解释性监控。
Stars: 0 | Forks: 0
# 🛡️ 实时信用卡欺诈检测
[](https://github.com/Fikri645/fraud-detection/actions)
[](https://huggingface.co/spaces/fikri0o0/fraud-detection)
[](https://python.org)
**[实时演示 →](https://huggingface.co/spaces/fikri0o0/fraud-detection)**
## 为什么做这个项目
欺诈检测是应用机器学习中典型的难题,也是任何金融科技公司(如 GoPay, OVO, Kredivo, Dana)数据科学的核心业务。
它迫使你直面那些教程中常常略过的问题:
- **极端的类别不平衡**(欺诈比例约为 0.5%)—— 准确率在这里毫无意义
- **非对称成本** —— 漏掉一次欺诈和拦截一位客户带来的损失并不对等
- **对抗性漂移** —— 攻击模式不断演变,静态模型会随之失效
- **延迟** —— 决策必须在交易过程中的毫秒级时间内完成
- **可解释性** —— 监管机构要求对每一次自动拒绝给出合理的解释
本项目致力于逐一解决上述问题,而不是仅仅停留在一份有着虚高准确率分数的 notebook 上。
## 数据集 — Sparkov
模拟但逼真的信用卡交易数据([Kaggle: kartik2112/fraud-detection](https://www.kaggle.com/datasets/kartik2112/fraud-detection))。
| | |
|:---|:---|
| 交易量 | **185万**(130万训练集 · 56万测试集) |
| 欺诈率 | ~0.5%(逼真的极端不平衡状态) |
| 划分方式 | **按时间划分** —— 训练集为较早时间段,测试集为较晚时间段(杜绝数据泄漏) |
| 卡片 / 商户数量 | 983 / 693 |
| 时间跨度 | 2019年1月 – 2020年12月 |
与被过度使用的 ULB `creditcard.csv`(经过 PCA 匿名化处理的 `V1–V28`)不同,Sparkov 保留了**人类可读的数据列** —— 包括商户、类别、地理坐标、时间戳 —— 这正是进行有意义的特征工程和构建交易图谱的前提。
## 特征工程 — 分析的核心
所有基于卡片(per-card)的特征均严格按照时间顺序计算,**仅参考过去的数据**(`closed='left'` 滚动窗口,经过位移的扩展统计量)—— 目标零泄漏。
| 家族 | 特征 | 能够捕获的问题 |
|:---|:---|:---|
| 交易 | 金额、金额对数 | 大额欺诈 |
| 时间 | 小时、星期几、夜间标识、周末标识 | 夜间高发的欺诈行为 |
| 人口统计 | 持卡人年龄、城市人口 | 人口统计学先验特征 |
| **地理** | 家到商户的 haversine 距离、与上笔交易的距离 | 物理上不可能的行程(瞬移) |
| **速度** | 单卡在 1小时 / 24小时 / 7天内的滚动计数/总和/平均值 | 交易突增 |
| **行为** | 偏离度及与该卡历史均值的比率、距离上次交易的秒数、24小时内涉及的不同商户数 | 异常消费模式 |
信号检验(测试期间,欺诈与正常交易均值对比):
| 特征 | 正常交易 | 欺诈交易 | 比率 |
|:---|---:|---:|---:|
| `amt` | 67.6 | 528.4 | **7.8×** |
| `amt_ratio_to_card_mean` | 1.02 | 6.52 | **6.4×** |
| `txn_count_1h` | 0.22 | 0.67 | **3.0×** |
| `is_night` | 0.30 | 0.86 | **2.9×** |
## 核心结果
### 生产级模型(LightGBM,在较晚的时间段上进行测试)
| 指标 | 数值 | 意味着什么 |
|:---|:---|:---|
| **PR-AUC** | **0.967** | 针对不平衡欺诈数据的首要指标(平均精度) |
| ROC-AUC | 0.999 | 接近完美的排序能力 |
| **Recall @ top 1%** | **98.0%** | 审查风险最高的 1% 交易即可捕获 98% 的欺诈 |
| **Precision @ top 100** | **100%** | 风险排名前 100 的交易*全部*是欺诈 |
| 成本最优阈值 | **0.019** | 最小化预期的商业损失 —— 比默认朴素的 0.5 **节省 20% 的成本** |
成本最优阈值(0.019,远低于 0.5)反映了真实的欺诈经济学:
漏掉一次欺诈会损失整个交易金额,因此为了捕获更多欺诈行为,容忍更多的误报是值得的。在该阈值下,模型捕获了 **96.6%** 的欺诈。
### 模型对比(测试集 PR-AUC)
| 模型 | PR-AUC | ROC-AUC | 定位 |
|:---|:---|:---|:---|
| **LightGBM** (成本敏感, Optuna) | **0.967** | 0.999 | 生产环境的主力模型 |
| GraphSAGE (GNN, 有向 card+merchant 图谱) | 0.368 | 0.985 | 关联突发信号 |
| Autoencoder (无监督) | 0.135 | 0.866 | 无标签的新型欺诈防护网 |
### 不平衡问题研究 — 核心发现
一项严格的对照实验(相同的 LightGBM、相同的特征矩阵,仅改变采样策略)
重现了 2025 年业界的共识:
| 策略 | PR-AUC | 拟合时间 | 训练行数 | 结论 |
|:---|:---|:---|:---|:---|
| 无 | 0.682 | 11.7s | 110万 | 基线 —— 类别不平衡严重拖累了表现 |
| **成本敏感** (`scale_pos_weight`) | **0.980** | 13.0s | 110万 | **最佳投资回报率 (ROI)** |
| SMOTE | 0.982 | 28.8s | 121万 | 耗费 2.2倍 的时间换取 +0.002 的 PR-AUC |
| Undersample | 0.981 | 4.1s | 7万 | 速度快,但丢弃了 94% 的数据 |
### 实时评分
| 指标 | 数值 |
|:---|:---|
| 延迟 **P50** | **7.1 ms** |
| 延迟 P95 / P99 | 11.2 / 13.0 ms |
| 吞吐量 (单线程) | ~132 笔交易/秒 |
速度特征通过内存级的在线存储进行增量维护,因此单笔交易的评分延迟始终保持在个位数毫秒级 —— 完全符合真实支付系统所要求的 100ms 以下预算。以成本最优阈值重放测试数据流,在 1.8% 的拒绝率下捕获了 **85% 的欺诈**。
### 跨数据集验证 — 以及一个重要发现
我们在**真实的 ULB 数据集**(包含 284,807 笔欧洲真实信用卡交易,欺诈率 0.17%,经过 PCA 匿名化)上应用了相同的流程:
| 策略 | PR-AUC (真实 ULB 数据集) | PR-AUC (Sparkov) |
|:---|:---|:---|
| 原始 LightGBM | **0.418** | 0.682 |
| 成本敏感 | 0.025 | **0.980** |
## 系统架构
```
Raw transaction stream
│
▼
┌──────────────────┐ offline (batch) online (real-time)
│ Feature pipeline │ ──► src/features.py ──► src/online.py (in-memory state)
└──────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ Models │
│ • LightGBM (cost-sensitive + Optuna) │ ◄── production
│ • GraphSAGE (card-chain transaction graph) │ ◄── relational
│ • Autoencoder (legit-only reconstruction) │ ◄── unsupervised
└──────────────────────────────────────────────┘
│
▼
┌──────────────────┐ ┌──────────────┐ ┌───────────────┐
│ Evaluation │ │ SHAP explain │ │ PSI drift │
│ PR-AUC + cost │ │ (compliance) │ │ monitoring │
└──────────────────┘ └──────────────┘ └───────────────┘
│
▼
FastAPI /score + Gradio dashboard (HF Spaces)
```
## 项目结构
```
fraud-detection/
├── src/
│ ├── config.py # paths, feature groups, costs, hyperparams
│ ├── data.py # Sparkov download + load
│ ├── features.py # batch feature engineering (no leakage)
│ ├── online.py # incremental online feature store (real-time)
│ ├── preprocess.py # matrices + temporal split
│ ├── train.py # LightGBM + imbalance study + Optuna
│ ├── autoencoder.py # unsupervised anomaly detector (PyTorch)
│ ├── gnn.py # GraphSAGE on card-chain graph (PyG)
│ ├── evaluate.py # PR-AUC, business cost, threshold optimization
│ ├── explain.py # SHAP
│ └── drift.py # PSI concept-drift
├── scripts/ # download / features / train / autoencoder / gnn / drift
├── api/ # FastAPI real-time scoring service
├── streaming/ # streaming replay + latency benchmark
├── app/gradio_app.py # 6-tab interactive dashboard
├── tests/ # pytest (features, evaluate, drift, online)
└── .github/workflows/ # CI
```
## 本地运行
```
pip install -r requirements.txt
python scripts/download_data.py # Sparkov (~200 MB)
python scripts/run_features.py # engineered feature tables (~3 min)
python scripts/run_training.py # LightGBM + imbalance study + Optuna
python scripts/run_autoencoder.py # unsupervised baseline (GPU)
python scripts/run_gnn.py # GraphSAGE (GPU)
python scripts/run_drift.py # PSI drift report
python streaming/simulate_stream.py # latency benchmark
python app/gradio_app.py # dashboard at :7860
uvicorn api.main:app --port 8000 # real-time API
pytest tests/ -v # tests
```
## 项目亮点
- **正确处理不平衡学习** —— 关注 PR-AUC、成本敏感学习、商业成本阈值优化(而非盲目追求准确率或默认 0.5)—— 并通过批判性思维得出结论:**最佳的不平衡处理策略高度依赖于具体数据集**(已在真实的 ULB 数据上交叉验证)
- **特征工程** —— 构建携带关键信号且无数据泄漏的速度/行为/地理特征
- **建模广度** —— 将梯度提升、图神经网络和自编码器进行客观诚实的对比
- **生产级思维** —— 实时在线特征、延迟基准测试、漂移监控与可解释性
- **工程质量** —— 强类型配置、单元测试、CI、MLflow 跟踪、Docker 容器化及在线 Demo 部署
**适合岗位:** GoPay, OVO, Kredivo, Akulaku, Dana 等平台的欺诈/风控数据科学家;任何支付或信贷团队的机器学习岗位。
## 参考文献
- Deng et al. — *大规模场景下的成本敏感 vs SMOTE*;关于生产环境不平衡学习的 821 篇论文综述 (2025)
- Hamilton, Ying, Leskovec (2017). *Inductive Representation Learning on Large Graphs* (**GraphSAGE**)
- SR 11-7 / FinCEN 模型风险指南 — 对自动化决策的可解释性要求
- Sparkov Data Generator — Brandon Harris (数据集)
*由 [Muhammad Fikri Wahidin](https://github.com/Fikri645) 构建 — 机器学习工程师 / 数据科学家作品集*
标签:Apex, AV绕过, FastAPI, 凭据扫描, 图神经网络, 机器学习, 模型解释性, 欺诈检测, 请求拦截, 逆向工具, 金融科技