shrutihagarwal/ANN-on-Fraud-Detection-DataSet
GitHub: shrutihagarwal/ANN-on-Fraud-Detection-DataSet
基于前馈神经网络的信用卡交易欺诈二分类系统,重点解决原始交易数据的特征工程与类别不平衡问题。
Stars: 0 | Forks: 0
# 💳 使用 ANN 进行信用卡交易欺诈检测
一个二分类系统,使用前馈神经网络检测欺诈性信用卡交易,重点关注**从原始交易和行为数据进行特征工程**——在严重的类别不平衡情况下,将时间戳、人口统计数据和商户信息转化为可学习的信号。
## 📋 目录
- [问题描述](#problem-statement)
- [数据集](#dataset)
- [特征工程](#feature-engineering)
- [网络架构](#network-architecture)
- [Pipeline](#pipeline)
- [项目结构](#project-structure)
- [使用技术](#technologies-used)
- [运行方式](#how-to-run)
- [结果与评估](#results--evaluation)
- [关键经验](#key-learnings)
- [未来工作](#future-work)
## 问题描述
信用卡欺诈检测是一个典型的**不平衡分类问题**:欺诈交易在所有交易中只占极小的一部分,但漏掉一笔欺诈交易代价高昂。本项目在一个大型模拟交易数据集上构建了基于 ANN 的分类器(包含独立的训练/测试文件:`fraudTrain.csv`、`fraudTest.csv`),其中数据转换 pipeline 是核心的工程挑战——必须将时间戳和商户名称等原始字段转换为可供模型直接使用的数值特征。
## 数据集
每条交易记录最初包含以下字段:交易时间、信用卡号、商户、类别、金额、持卡人姓名、性别、地址、城市/州/邮编、地理坐标、城市人口、职业、出生日期、交易 ID 以及欺诈标签 (`is_fraud`)。
原始数据集在多个字段(姓名、精确坐标、交易 ID)上具有高基数(high cardinality),如果直接使用会导致模型过拟合或无法学到有用的信息——处理这个问题是核心的预处理任务。
## 特征工程
`wrangle()` 函数执行关键的转换步骤:
```
def wrangle(path):
df = pd.read_csv(path)
df['trans_date_trans_time'] = pd.to_datetime(df['trans_date_trans_time'], dayfirst=True)
df['trans_day'] = df['trans_date_trans_time'].dt.weekday
df['trans_hour'] = df['trans_date_trans_time'].dt.hour
df['trans_month'] = df['trans_date_trans_time'].dt.month
df['category'] = pd.Categorical(df.category).codes
df['gender'] = pd.Categorical(df.gender).codes
df['state'] = pd.Categorical(df.state).codes
df['dob'] = pd.to_datetime(df['dob'], dayfirst=True)
df['age'] = df['trans_date_trans_time'].dt.year - df['dob'].dt.year
high_cardinality = ['cc_num','lat','trans_num','unix_time','long','zip',
'city_pop','job','merchant','first','last','street',
'city','merch_lat','merch_long']
df.drop(columns=high_cardinality + ['trans_date_trans_time','dob'], inplace=True)
return df
```
这会将原始交易日志转换为 9 个可供模型直接使用的特征:**星期几、小时、月份、类别编码、性别编码、州编码、年龄、金额以及 is_fraud(目标变量)**——剔除了无法泛化的高基数标识符(卡号、精确 GPS 坐标、姓名、交易 ID)。
## 网络架构
```
Input (9 features) → Dense(20, ReLU) → Dense(15, ReLU) → Dense(1, Sigmoid)
```
| 层级 | 单元数 | 激活函数 |
|-------|-------|------------|
| Input | 9 | — |
| Hidden 1 | 20 | ReLU |
| Hidden 2 | 15 | ReLU |
| Output | 1 | Sigmoid(二分类欺诈概率) |
**训练过程**:Adam optimizer,binary cross-entropy 损失函数,10 个 epochs,batch size 为 512。
## Pipeline
```
fraudTrain.csv → wrangle() → engineered features
↓
Check class imbalance: fraud count / total count
↓
Train ANN (10 epochs, batch_size=512)
↓
fraudTest.csv → wrangle() → same feature pipeline applied to held-out data
↓
Predict → threshold at 0.5 → binary fraud label
↓
Evaluate: accuracy, confusion matrix, classification_report
```
使用独立的、预先切分好的测试文件(而不是随机的训练/测试集切分)可以避免相关交易之间的数据泄露,并且更好地模拟真实的部署场景,因为在真实部署中,模型必须能够泛化到完全未知的未来交易上。
## 项目结构
```
ANN-on-Fraud-Detection-DataSet/
├── Fraud Detection ANN.py # wrangle() + model training + evaluation
└── README.md
```
## 使用技术
| 库 | 用途 |
|---------|-------|
| `pandas` | 特征工程、时间日期解析、类别编码 |
| `TensorFlow` / `Keras` | 构建和训练 ANN |
| `scikit-learn` | 评估指标(准确率、分类报告) |
| `seaborn`, `matplotlib` | 相关性热力图、混淆矩阵可视化 |
## 运行方式
```
pip install pandas tensorflow scikit-learn seaborn matplotlib
```
本项目使用了 **Credit Card Transactions Fraud Detection 数据集**(通常在 Kaggle 上以 `fraudTrain.csv` / `fraudTest.csv` 形式分发)。将这两个文件放在工作目录中,然后:
```
python "Fraud Detection ANN.py"
```
## 结果与评估
模型报告包含:
- **类别不平衡比例**(欺诈交易占总交易的比例)在训练前打印出来,以明确任务的难度
- 通过 `model.evaluate()` 获取的**测试准确率**
- **混淆矩阵**(seaborn 热力图)——对于不平衡问题至关重要,因为单纯看原始准确率具有误导性
- **分类报告**(每个类别的 precision、recall、F1)——特别是少数类(欺诈)的 recall,在该领域中比整体准确率更为重要
## 关键经验
1. **特征工程主导了模型选择**——在这个问题中,一个简单的 2 层 ANN 搭配精心设计的特征(时间组件、编码后的类别变量、推导出的年龄)远比架构的深度重要得多。
2. **高基数字段是一个陷阱**:卡号、精确经纬度和姓名会让模型记住训练数据,而无法学习到可泛化的欺诈模式——因此它们被正确地排除了。
3. **在类别不平衡的情况下,准确率是一个具有误导性的指标**:由于欺诈是极小的少数类,一个对所有交易都预测为“非欺诈”的模型依然会显示出很高的准确率,这就是为什么我们要明确报告混淆矩阵和每个类别的 recall/precision。
4. **使用按时间切分的训练/测试文件**(而不是随机切分)更贴近真实的欺诈检测部署场景。
## 未来工作
- 通过 **class weighting**、**SMOTE 过采样**或 **focal loss** 直接处理类别不平衡问题,而不是仅仅依赖网络自身去无辅助地学习少数类。
- 与基于树的基线模型(XGBoost, LightGBM)进行对比,这些模型是表格数据欺诈检测的标准强基线模型,在这类结构化数据上的表现通常优于普通的 ANN。
- 设计额外的行为特征,例如持卡人位置与商户位置之间的距离,或在滚动时间窗口内的交易频率。
## 参考
- 数据集:Credit Card Transactions Fraud Detection Dataset (Kaggle, 模拟持卡人交易数据)。
- Chollet, F. — *Deep Learning with Python* (Keras Sequential API 参考)。
*探索在真实世界表格数据集上进行二分类和多分类的一系列 ANN 项目的一部分。*
标签:Apex, 数据分类, 机器学习, 欺诈检测, 特征工程, 神经网络, 逆向工具, 金融科技