vinayagrawal890/phishing-email-detection-model
GitHub: vinayagrawal890/phishing-email-detection-model
一个基于Scikit-learn的机器学习项目,通过提取邮件文本和URL特征来分类钓鱼邮件和安全邮件,提供从数据生成到模型评估及CLI预测的完整教学流程。
Stars: 0 | Forks: 0
# 📧 Phishing 邮件检测模型
这是一个使用 **Scikit-learn** 构建的机器学习项目,它根据邮件的文本内容以及 URL/结构特征,将邮件分类为 **Phishing**(钓鱼)或 **Safe**(安全)。本项目作为一个小型探索项目,旨在研究机器学习在网络安全领域的应用。
## ✨ 功能
- **合成数据集生成器** — 无需外部下载即可生成逼真的钓鱼邮件和合法邮件(包括发件人、主题、正文)
- **特征提取** 涵盖:
- TF-IDF 文本特征(主题 + 正文,1-2 grams)
- 邮件中的 URL 数量
- 基于 IP 地址的 URL (`http://192.168.x.x/...`)
- 可疑的顶级域名(`.xyz`、`.top`、`.click`、`.ru` 等)
- 仿冒品牌域名(`paypa1`、`amaz0n` 等)
- 可疑/紧急关键词计数("verify"、"urgent"、"suspended" 等)
- 发件人域名不匹配检测(在非官方域名中使用品牌名称)
- 结构信号:主题/正文长度、感叹号、大写单词数、HTTPS 使用情况
- **模型训练** — Logistic Regression(默认)、Naive Bayes 或 Random Forest
- **模型评估** — 准确率、精确率、召回率、F1、ROC-AUC 以及完整的分类报告
- **可视化报告** — 混淆矩阵热力图 + ROC 曲线,保存为 PNG 格式
- **可解释性** — 打印促使模型预测为 Phishing 或 Safe 的热门词汇/特征
- **独立的推理脚本** — 通过命令行对任意新邮件进行分类
## 📦 环境要求
```
pip install -r requirements.txt
```
或者单独安装:`pandas`、`numpy`、`scikit-learn`、`scipy`、`matplotlib`、`seaborn`、`joblib`。
## 🚀 快速开始
### 1. 生成数据集
```
python3 generate_dataset.py
```
这将创建包含 600 封带标签邮件(300 封钓鱼邮件 / 300 封安全邮件)的 `emails_dataset.csv` 文件。
### 2. 训练模型
```
python3 train_model.py
```
默认情况下,这将训练一个 Logistic Regression 模型,打印评估指标,并保存:
- `phishing_model.joblib` — 训练好的模型包
- `phishing_model_evaluation.png` — 混淆矩阵 + ROC 曲线
### 3. 对新邮件进行分类
```
python3 predict_email.py \
--sender "security@paypa1-support.com" \
--subject "Urgent: verify your account" \
--body "Click here immediately to verify your account or it will be suspended: http://paypa1-verify.com/login"
```
输出:
```
==================================================
Email Classification Result
==================================================
Prediction: 🚨 PHISHING
Phishing probability: 99.99%
==================================================
```
## ⚙️ 选项
### `train_model.py`
| 标志 | 描述 | 默认值 |
|------|-------------|---------|
| `--data` | 包含 `sender,subject,body,label` 列的 CSV 文件路径 | `emails_dataset.csv` |
| `--model` | `logistic`、`naive_bayes` 或 `random_forest` | `logistic` |
| `--test-size` | 用于测试的数据比例 | `0.25` |
| `--out-prefix` | 保存的模型/报告文件的前缀 | `phishing_model` |
```
python3 train_model.py --model random_forest --out-prefix rf_model
```
### `predict_email.py`
| 标志 | 描述 |
|------|-------------|
| `--model` | 已保存的 `.joblib` 模型包路径 |
| `--sender` | 发件人邮箱地址 |
| `--subject` | 邮件主题 |
| `--body` | 邮件正文文本 |
## 📊 结果示例
在合成数据集上使用默认的 Logistic Regression 模型(预留测试集,划分时确保测试集中的邮件措辞在训练期间从未见过):
| 指标 | 得分 |
|--------|-------|
| Accuracy | **98.3%** |
| Precision | 100% |
| Recall | 97.5% |
| F1-score | 98.7% |
| ROC-AUC | 99.9% |
**混淆矩阵:**
| | 预测为安全 | 预测为 Phishing |
|---|---|---|
| **实际安全** | 60 | 0 |
| **实际 Phishing** | 3 | 115 |
该模型在此测试集上的误报率为零(没有安全邮件被误分类为 Phishing),并且在 118 封钓鱼邮件中仅漏报了 3 封——这些通常是语气比较隐晦、偏向商务交流的钓鱼邮件,它们没有使用明显的紧急性词汇。
**促使预测为 Phishing 的主要特征:** 可疑 TLD、发件人域名不匹配、可疑关键词计数、URL 数量、仿冒品牌域名。
**促使预测为 Safe 的主要特征:** 较长的正文长度、使用 HTTPS、常见的合法措辞(例如 "shipping address," "info")。
## 🧠 工作原理
1. **生成/加载数据** — 包含发件人、主题、正文以及 `phishing`/`safe` 标签的邮件。
2. **提取特征** — 将工程化的数值特征与邮件文本的 TF-IDF 向量结合。
3. **划分训练集/测试集** — 采用基于组(底层邮件模板)的划分方式,确保测试集不受训练集中近乎重复措辞的干扰,从而得出客观的准确率估计。
4. **训练** — 在组合特征矩阵上拟合分类器(默认为 Logistic Regression)。
5. **评估** — 计算准确率、精确率、召回率、F1、ROC-AUC,并生成混淆矩阵 + ROC 曲线图。
6. **保存与复用** — 将模型、vectorizer 和 scaler 一起持久化,以便在无需重新训练的情况下对新邮件进行分类。
## 📁 项目结构
```
phishing_detector/
├── generate_dataset.py # Synthetic dataset generator
├── feature_extraction.py # Feature engineering (URLs, keywords, domains, etc.)
├── train_model.py # Training + evaluation pipeline
├── predict_email.py # Classify a new email using the saved model
├── requirements.txt
├── emails_dataset.csv # Generated dataset (created by generate_dataset.py)
├── phishing_model.joblib # Saved trained model (created by train_model.py)
└── phishing_model_evaluation.png # Confusion matrix + ROC curve (created by train_model.py)
```
## 🗂 数据集
本项目内置了**合成数据集生成器**,而不是使用真实世界的数据集,因此无需下载即可开箱即用。该生成器利用现实世界中的常见模式(紧迫感、账号停用威胁、品牌冒充、相似域名)创建钓鱼邮件,同时生成逼真的合法商务/个人邮件——包括在双方中故意设置的一些“困难”样本(使用紧急语言的合法邮件;语气冷静、偏向商务风格的钓鱼邮件),以确保分类任务不会过于简单。
对于真实项目,可以替换为真实的带标签数据集,例如:
- [Kaggle: Phishing Email Detection](https://www.kaggle.com/datasets) (搜索 "phishing email")
- [Nazario Phishing Corpus](https://monkey.org/~jose/phishing/)
- [Enron-Spam dataset](https://www2.aueb.gr/users/ion/data/enron-spam/) (用作合法/垃圾邮件基线)
只要你的 CSV 包含 `sender`、`subject`、`body` 和 `label` 列(标签为 `phishing`/`safe`),`train_model.py` 就能直接在其上运行。
## ⚠️ 局限性
- 内置数据集是合成/模板化的——现实中的钓鱼邮件种类繁多,在真实数据上的结果可能会低于此处显示的结果
- 特征工程使用的是简单的启发式方法(关键词列表、regex 模式),而不是实时的威胁情报源
- 不处理 HTML 邮件正文、嵌入图像或附件——仅进行纯文本分析
- Random Forest / Naive Bayes 在合成数据集上达到 100% 的准确率是数据集多样性有限的标志,而不是声称 Phishing 检测问题已经完全解决
- 这是一个教育工具,并非用于生产环境的邮件安全过滤器
## 🛣️ 可能的扩展
- 在真实数据集上进行训练并报告结果
- 添加交叉验证,而不是单一的 train/test 划分
- 整合 WHOIS/域名年龄查询作为特征
- 尝试深度学习方法(例如在邮件文本上微调 transformer)
- 构建一个简单的 Web UI(Flask/Streamlit)以进行交互式分类
## 📚 学习成果
本项目展示了:
- 如何为安全 ML 任务设计特定领域的特征(URL、关键词、发件人域名)
- 如何在 Scikit-learn 中将结构化特征与 TF-IDF 文本向量相结合
- 为什么简单的 train/test 划分会产生误导性的完美准确率(以及如何通过按模板分组来避免这种情况)
- 如何正确评估分类器:仅看准确率是不够的——精确率、召回率、F1 和混淆矩阵能反映更全面的情况
- 如何解释线性模型的系数,以理解它*为什么*会做出这样的预测
## 📝 License
本项目仅提供用于教育目的。
标签:Apex, Scikit-learn, 机器学习, 网络安全, 逆向工具, 钓鱼检测, 隐私保护