siddheshpatil3637-git/safebank-fraud-detection
GitHub: siddheshpatil3637-git/safebank-fraud-detection
一个端到端的银行交易欺诈检测机器学习平台,融合有监督分类与无监督异常检测,通过 Streamlit 仪表板实现实时风险监控与分析。
Stars: 0 | Forks: 0
# 🛡️ SafeBank 交易异常检测平台
一个端到端的银行安全平台,能够检测异常的交易行为,
并通过有监督机器学习和无监督异常检测来预测潜在的欺诈行为,
结果通过交互式的 Streamlit 仪表板进行展示。
## 1. 项目概述
| | |
|---|---|
| **行业** | 银行 / 金融服务 |
| **问题类型** | 二分类欺诈分类 + 无监督异常检测 |
| **数据** | 由 `generate_synthetic_data.py` 生成的合成银行交易数据集(120,000 笔交易 / 3,000 名客户)—— 随时可替换为具有相同 schema 的真实数据集 |
| **欺诈率** | ~1.4%(符合真实情况的不平衡比例) |
| **输出** | 每笔交易的风险评分 (0–100) + 风险等级(低/中/高/严重),并在实时仪表板中展示 |
该平台融合了两种互补的检测策略:
1. **有监督分类器** (Logistic Regression, Decision Tree, Random Forest, XGBoost) —— 从已标记的历史数据中学习*已知*的欺诈模式。
2. **无监督异常检测器** (Isolation Forest, Local Outlier Factor, One-Class SVM) —— 标记与任何已标记模式都不匹配的*新型*交易行为,完全不需要欺诈标签。
这两种信号被融合为一个单一的**风险评分** (`src/risk_scoring.py`),用于驱动仪表板的警报、客户风险画像以及实时模拟。
## 2. 文件夹结构
```
SafeBank-Fraud-Detection/
├── data/
│ ├── raw/
│ │ └── banking_transactions.csv # synthetic source data
│ └── processed/
│ ├── transactions_clean.csv # after preprocessing
│ ├── transactions_features.csv # after feature engineering
│ ├── transactions_with_anomaly_scores.csv
│ ├── transactions_scored.csv # final: fraud prob + risk score
│ └── customer_risk_profiles.csv # customer-level aggregates
├── src/
│ ├── utils.py # shared paths & helpers
│ ├── data_preprocessing.py # Requirement 1
│ ├── feature_engineering.py # Requirement 1 (feature engineering)
│ ├── eda.py # Requirement 2
│ ├── train_supervised_models.py # Requirement 3 (supervised) + 4 (evaluation)
│ ├── train_anomaly_models.py # Requirement 3 (anomaly detection)
│ ├── model_evaluation.py # Requirement 4 (consolidated report)
│ └── risk_scoring.py # Requirement 6 (risk scoring engine)
├── dashboard/
│ └── app.py # Requirement 5 + 6 (Streamlit dashboard)
├── models/ # saved .joblib models & encoders
├── reports/
│ ├── figures/ # all EDA / evaluation PNGs
│ └── metrics/ # CSV/JSON/Markdown evaluation reports
├── docs/
│ ├── ARCHITECTURE.md
│ └── DEPLOYMENT.md
├── generate_synthetic_data.py # synthetic dataset generator
├── run_pipeline.py # one-command full pipeline runner
├── requirements.txt
└── README.md
```
## 3. 快速开始
```
# 1. Clone / unzip the project, then create a virtual environment
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 2. Install dependencies
pip install -r requirements.txt
# 3. Run the full pipeline (generates data if missing, then preprocesses,
# engineers features, runs EDA, trains all 7 models, scores risk)
python run_pipeline.py
# 4. Launch the interactive dashboard
streamlit run dashboard/app.py
```
仪表板将在 `http://localhost:8501` 打开。
### 单独运行步骤
```
python generate_synthetic_data.py --n_customers 3000 --n_transactions 120000
python src/data_preprocessing.py
python src/feature_engineering.py
python src/eda.py
python src/train_supervised_models.py
python src/train_anomaly_models.py
python src/model_evaluation.py
python src/risk_scoring.py
streamlit run dashboard/app.py
```
### 使用您自己的数据集
将 `data/raw/banking_transactions.csv` 替换为一个包含(至少)
以下列的 CSV 文件,然后运行 `python run_pipeline.py`(它会检测并重用
现有的原始文件):
```
Transaction_ID, Customer_ID, Transaction_Amount, Transaction_Type,
Transaction_Date, Merchant_Category, Location, Device_Type,
Account_Balance, Transaction_Status, Fraud_Label (optional)
```
如果缺少 `Fraud_Label`,请跳过 `train_supervised_models.py` 并依赖
异常检测模型以及 `risk_scoring.py` 中基于规则的回退机制
(关于推荐的适配方案,请参阅 `docs/ARCHITECTURE.md`)。
## 4. 数据预处理 (`src/data_preprocessing.py`)
- **缺失值** —— 数值列使用按交易类型计算的中位数进行填充;类别列使用众数进行填充。
- **重复项** —— 通过 `Transaction_ID` 和整行匹配进行删除。
- **异常值** —— 对 `Transaction_Amount` 和 `Account_Balance` 进行基于 IQR 的缩尾处理 (3× IQR),并保留 `Is_ _Outlier` 标志作为特征,而不是删除该行(异常值通常是欺诈的*信号*,而非噪音)。
- **编码** —— 对所有类别字段进行 Label encoding(拟合后的编码器保存至 `models/label_encoders.joblib`)。
- **缩放** —— 对数值字段应用 `StandardScaler`(保存至 `models/scaler.joblib`)。
## 5. 特征工程 (`src/feature_engineering.py`)
添加驱动模型大部分预测能力的基于行为的特征:
| 特征 | 描述 |
|---|---|
| `Amount_Deviation_Ratio` | 交易金额 ÷ 客户历史平均值 |
| `Amount_Zscore_vs_Customer` | 该笔交易偏离客户常规的标准差倍数 |
| `Amount_to_Balance_Ratio` | 交易金额 ÷ 当前账户余额 |
| `Minutes_Since_Last_Txn` / `Is_Rapid_Repeat_Txn` | 速度 —— 快速的重复交易是典型的欺诈信号 |
| `Is_Night_Txn`, `Is_Weekend`, `Txn_Hour` | 基于时间的风险特征 |
| `Is_High_Risk_Location`, `Customer_Location_Diversity` | 地理风险 |
| `Is_Cash_Category` | 用于洗钱的提现 / 资金转账 / 珠宝等类别 |
## 6. EDA (`src/eda.py`)
生成 10 张图表并存入 `reports/figures/`,涵盖金额分布、
欺诈与合法交易的对比、客户行为、交易频率、
地理模式、小时/周/日时间趋势以及相关性热力图。
## 7. 建模
### 有监督模型 (`src/train_supervised_models.py`)
Logistic Regression, Decision Tree, Random Forest, XGBoost —— 所有模型均在训练时
进行了类别平衡处理 (`class_weight="balanced"` / `scale_pos_weight`),以应对
约 1.4% 的欺诈 prevalence。混淆矩阵、ROC 曲线和特征重要性
图表被保存到 `reports/figures/`。
### 异常检测 (`src/train_anomaly_models.py`)
Isolation Forest(完整数据集),Local Outlier Factor 和 One-Class SVM
(为便于处理而采用的 4 万分层抽样)。PCA 散点图可视化了
每个模型检测到的异常。
### 为什么同时使用两者?
有监督模型在处理*已知*欺诈类型方面表现强劲,但对新型的
攻击模式视而不见。异常检测器无需标签,能够捕捉数据偏移/新兴
模式,代价是会产生更多的误报。将两者融合(见下文)可以防范
任一模型的盲区 —— 这是生产级欺诈
系统中的标准做法。
## 8. 评估 (`src/model_evaluation.py`)
**准确率被有意淡化** —— 在 1.4% 的欺诈率下,一个
每次都预测为“合法”的模型能达到约 98.6% 的准确率,但
抓不到任何欺诈。报告和仪表板转而将重点放在 **Precision, Recall, F1 和
ROC-AUC** 上。完整指标请见:`reports/metrics/model_evaluation_report.md`。
## 9. 风险评分 (`src/risk_scoring.py`)
```
Risk Score = 0.6 × scaled(fraud_probability) + 0.4 × scaled(anomaly_score)
```
| 风险评分 | 等级 |
|---|---|
| 0–34 | 低 |
| 35–59 | 中 |
| 60–79 | 高 |
| 80–100 | 严重 |
客户级别的风险画像汇总了每个客户的交易级别评分。
## 10. 仪表板 (`dashboard/app.py`)
包含四个页面,可通过侧边栏进行导航:
1. **📊 交易监控** —— KPI(总交易量、可疑交易数、高风险客户数、欺诈占比),每日交易量/欺诈趋势,风险等级分布,类型/类别交易量。
2. **🔍 异常可视化** —— 风险评分分布,欺诈概率与异常分数散点图,金额与风险散点图,小时×星期的风险热力图,地理风险条形图。
3. **⚠️ 风险分析** —— 高风险交易警报表(可下载 CSV),客户风险画像浏览器,单笔交易的欺诈概率仪表盘。
4. **⚡ 实时模拟** —— 通过实时加载的模型,配合进度条和即时警报,逐一传输采样的交易流,模拟生产环境中的监控数据流。
侧边栏中的所有过滤器(日期范围、风险等级、地点、商户类别)均在所有页面上全局生效。
## 11. 部署方式
详情请参阅 `docs/DEPLOYMENT.md`。摘要如下:
- **Streamlit Community Cloud**(最快路径):将此代码库推送到 GitHub,在 share.streamlit.io 进行连接,将应用入口设置为 `dashboard/app.py`。免费额度已足够用于演示/作品集部署。
- **Docker + 任意云 VM / ECS / Cloud Run**:`docs/DEPLOYMENT.md` 中提供了 `Dockerfile` 模式,用于在您自己的域名和身份验证层之后进行容器化部署。
- **Flask API 替代方案**:对于需要无头评分 API(而不是仪表板)来替代或配合 Streamlit 的团队,可以将 `src/risk_scoring.py` 的评分逻辑封装在 Flask 的 `/score` endpoint 中 —— `docs/DEPLOYMENT.md` 中包含了一个入门级的代码片段。
对于真实的银行业务场景,交易数据和模型工件必须置于
身份验证、静态/传输加密以及审计日志的保护之下 —— 本项目
文件夹只是一个功能性原型,而非符合合规性要求的系统(参见未来
改进)。
## 12. 未来改进
- **实时流数据摄取** (Kafka / AWS Kinesis),取代批量 CSV 评分,使得风险评分在交易发布的瞬间即可更新。
- **基于图的特征** —— 对账户间的资金流进行建模(例如使用 NetworkX 或图数据库),以捕获单笔交易特征无法发现的 结构化/分层欺诈团伙。
- **模型监控与漂移检测** —— 随时间推移追踪特征和预测漂移,并触发自动重新训练。
- **SHAP 可解释性** —— 附加单笔交易的 SHAP 值,让欺诈分析师了解交易*为什么*被标记,而不仅仅是看分数。
- **反馈循环** —— 让分析师将警报标记为真/假阳性,并将其反馈到定期的模型重新训练中。
- **仪表板上的身份验证与 RBAC**,以及用于生产级银行部署的加密和 PII 掩码。
- **A/B 测试框架**,用于在推广更改之前比较风险评分的混合权重。
## 13. 技术栈
Python · Pandas · NumPy · Scikit-learn · XGBoost · Matplotlib · Seaborn · Plotly · Streamlit · Joblib
标签:Apex, Kubernetes, Streamlit, XGBoost, 反欺诈检测, 异常检测, 机器学习, 访问控制, 逆向工具, 金融科技