LokeshSecOps/fraud-detection-eda
GitHub: LokeshSecOps/fraud-detection-eda
基于 Python 的信用卡交易欺诈检测分析项目,通过特征工程和可解释规则标记异常交易。
Stars: 0 | Forks: 0
# 信用卡交易欺诈检测
对合成信用卡交易数据集进行探索性数据分析和异常标记。本项目旨在展示实用的数据分析、特征工程和可解释的欺诈检测——这正是信用与欺诈风险(CFR)团队所从事的工作。
## 它的功能
1. **生成真实的合成数据集** —— 包含 200 名用户、8 个商户类别、跨越一年的 10,000 笔交易。其中嵌入了欺诈模式:高额异常值、异常时段交易(凌晨 1-4 点)以及高频连发交易。
2. 从原始数据中**工程化分析特征**:
- 每个用户的基准(其历史消费的均值和标准差)
- 金额 Z-score —— 一笔交易偏离该用户自身平均值的程度
- 异常时段标记 —— 凌晨 1 点至 4 点之间的交易
- 交易速度 —— 同一用户在同一 1 小时窗口内的交易次数
3. **使用可解释的规则标记异常** —— 每个规则都是明确且可审计的,这符合真实风险团队构建合理系统的做法:
- `flag_high_amount`:Z-score > 3.0
- `flag_odd_hour`:凌晨 1 点至 4 点之间的交易
- `flag_velocity`:同一用户在同一小时内超过 4 笔交易
4. 通过 4 个图表**可视化模式**(见 `fraud_analysis.png`):
- 金额分布:欺诈与正常交易对比
- 标记结果明细(真阳性 / 假阳性 / 漏报 / 正常)
- 每小时交易量(突出显示异常时段窗口)
- Z-score 散点图:已标记与正常交易对比
5. **将标记的交易导出**为 CSV 文件(`flagged_transactions.csv`),包含所有特征列以供下游审查。
## 结果(基于合成数据)
| 指标 | 数值 |
|---|---|
| 总交易数 | 10,000 |
| 已知欺诈(真实数据) | 500 (5%) |
| 标记为可疑 | ~2,088 (20.9%) |
| 真阳性 | 278 |
| 精确率 | 13.3% |
| 召回率 | 55.6% |
精确率与召回率的权衡是有意为之:这是一个**初步筛查层**,而不是最终决策。在真实的 pipeline 中,被标记的交易会进入第二阶段模型或人工审查队列——在这个阶段,高召回率比低假阳性更重要。
## 技术栈
- Python 3.12
- Pandas —— 数据处理、特征工程、groupby 聚合
- NumPy —— 统计计算(Z-scores、分布)
- Matplotlib —— 所有可视化
## 如何运行
```
git clone https://github.com/LokeshSecOps/fraud-detection-eda
cd fraud-detection-eda
pip install pandas numpy matplotlib
python fraud_detection.py
```
输出:
- `fraud_analysis.png` —— 4 面板可视化图表
- `flagged_transactions.csv` —— 包含特征列的所有被标记记录
## 设计决策
**为什么选择基于规则而不是 ML?**
可解释性在金融风险中至关重要。逻辑回归或梯度提升模型可能会得出稍好一些的数据,但风险分析师需要向监管机构解释*为什么*某笔交易会被标记。像“Z-score > 3.0”和“凌晨 3 点交易”这样的规则是不言而喻的。这也反映了真实 CFR 团队通常的起步方式:首先使用透明的启发式方法,然后再将 ML 模型作为补充。
**为什么使用每个用户的 Z-score 而不是全局 Z-score?**
对于经常出差的人来说,500 美元的交易很正常,但对于通常只消费 40 美元的人来说就令人警惕了。与全局阈值相比,用户级别的基准可以显著减少假阳性。
**为什么使用合成数据?**
真实的卡交易数据涉及敏感的 PII(个人身份信息),无法公开分发。合成数据生成器可以产生统计上真实的模式(真实的商户类别组合、自然的消费分布、嵌入的欺诈特征),而不会带来任何隐私问题。
1. **生成真实的合成数据集** —— 包含 200 名用户、8 个商户类别、跨越一年的 10,000 笔交易。其中嵌入了欺诈模式:高额异常值、异常时段交易(凌晨 1-4 点)以及高频连发交易。
2. 从原始数据中**工程化分析特征**:
- 每个用户的基准(其历史消费的均值和标准差)
- 金额 Z-score —— 一笔交易偏离该用户自身平均值的程度
- 异常时段标记 —— 凌晨 1 点至 4 点之间的交易
- 交易速度 —— 同一用户在同一 1 小时窗口内的交易次数
3. **使用可解释的规则标记异常** —— 每个规则都是明确且可审计的,这符合真实风险团队构建合理系统的做法:
- `flag_high_amount`:Z-score > 3.0
- `flag_odd_hour`:凌晨 1 点至 4 点之间的交易
- `flag_velocity`:同一用户在同一小时内超过 4 笔交易
4. 通过 4 个图表**可视化模式**(见 `fraud_analysis.png`):
- 金额分布:欺诈与正常交易对比
- 标记结果明细(真阳性 / 假阳性 / 漏报 / 正常)
- 每小时交易量(突出显示异常时段窗口)
- Z-score 散点图:已标记与正常交易对比
5. **将标记的交易导出**为 CSV 文件(`flagged_transactions.csv`),包含所有特征列以供下游审查。
## 结果(基于合成数据)
| 指标 | 数值 |
|---|---|
| 总交易数 | 10,000 |
| 已知欺诈(真实数据) | 500 (5%) |
| 标记为可疑 | ~2,088 (20.9%) |
| 真阳性 | 278 |
| 精确率 | 13.3% |
| 召回率 | 55.6% |
精确率与召回率的权衡是有意为之:这是一个**初步筛查层**,而不是最终决策。在真实的 pipeline 中,被标记的交易会进入第二阶段模型或人工审查队列——在这个阶段,高召回率比低假阳性更重要。
## 技术栈
- Python 3.12
- Pandas —— 数据处理、特征工程、groupby 聚合
- NumPy —— 统计计算(Z-scores、分布)
- Matplotlib —— 所有可视化
## 如何运行
```
git clone https://github.com/LokeshSecOps/fraud-detection-eda
cd fraud-detection-eda
pip install pandas numpy matplotlib
python fraud_detection.py
```
输出:
- `fraud_analysis.png` —— 4 面板可视化图表
- `flagged_transactions.csv` —— 包含特征列的所有被标记记录
## 设计决策
**为什么选择基于规则而不是 ML?**
可解释性在金融风险中至关重要。逻辑回归或梯度提升模型可能会得出稍好一些的数据,但风险分析师需要向监管机构解释*为什么*某笔交易会被标记。像“Z-score > 3.0”和“凌晨 3 点交易”这样的规则是不言而喻的。这也反映了真实 CFR 团队通常的起步方式:首先使用透明的启发式方法,然后再将 ML 模型作为补充。
**为什么使用每个用户的 Z-score 而不是全局 Z-score?**
对于经常出差的人来说,500 美元的交易很正常,但对于通常只消费 40 美元的人来说就令人警惕了。与全局阈值相比,用户级别的基准可以显著减少假阳性。
**为什么使用合成数据?**
真实的卡交易数据涉及敏感的 PII(个人身份信息),无法公开分发。合成数据生成器可以产生统计上真实的模式(真实的商户类别组合、自然的消费分布、嵌入的欺诈特征),而不会带来任何隐私问题。标签:Apex, 代码示例, 异常检测, 数据分析, 机器学习, 特征工程, 逆向工具, 金融风控