JhonDoeTheUnkown/Phishing-Website-Detection-Using-Contextual-TF-IDF-BERT-Representation-on-URLs
GitHub: JhonDoeTheUnkown/Phishing-Website-Detection-Using-Contextual-TF-IDF-BERT-Representation-on-URLs
这是一个利用上下文TF-IDF和BERT嵌入进行钓鱼网站检测的端到端系统。
Stars: 0 | Forks: 0
# 🛡️ 使用基于URL的上下文TF-IDF BERT表示进行钓鱼网站检测
结合**TF-IDF**和**BERT上下文嵌入**作为特征表示的端到端钓鱼网站检测系统,在**机器学习**、**集成学习**和**Transformer微调**模型上进行了评估。
## 🚀 项目概述
本项目展示了一个全面的钓鱼URL检测系统,作为本科生论文研究的一部分。该系统利用**BERT (bert-base-uncased)** 作为上下文特征提取器的强大功能,结合**字符级TF-IDF**来创建丰富的URL表示。
- URL预处理与清洗
- 上下文特征提取(TF-IDF + BERT嵌入)
- 机器学习分类
- 集成投票方法
- Transformer微调(BERT, DistilBERT, RoBERTa)
- 错误分析与跨模型比较
## 🎯 研究目标
构建一个使用**基于URL的上下文TF-IDF BERT表示**的钓鱼网站检测模型,并比较其在多种分类方法中的有效性:
- 经典机器学习
- 集成学习
- 基于Transformer的微调
## 🧠 机器学习框架
| 组件 | 描述 |
|---|---|
| 问题类型 | 监督学习 |
| 任务 | 二分类 |
| 目标变量 | `Label` |
| 类别 1 | 钓鱼(坏) |
| 类别 0 | 合法(好) |
| 数据集大小 | 10,000 个URL(平衡) |
| 划分 | 70% 训练集 / 10% 验证集 / 20% 测试集 |
## 📊 数据集信息
| 详情 | 信息 |
|---|---|
| 来源 | Kaggle — Phishing Site URLs |
| 原始大小 | ~549,000 个URL |
| 采样大小 | 10,000 个URL(每类 5,000 个) |
| 特征 | 原始URL字符串 |
| 标签 | `bad`(钓鱼) / `good`(合法) |
数据集链接:[Phishing Site URLs — Kaggle](https://www.kaggle.com/datasets/taruntiwarihp/phishing-site-urls)
## 🔬 工作流程架构
```
flowchart TD
A[Raw Dataset 549K URLs]
--> B[Sampling 10K Balanced]
B --> C[Preprocessing & Cleaning]
C --> D[Train / Val / Test Split\n70% / 10% / 20%]
D --> E[TF-IDF Vectorization\nchar_wb n-gram 3-5\nfit on Train only]
D --> F[BERT Embeddings Extraction\nbert-base-uncased\nfrozen weights]
E --> G[Feature Concatenation\nTF-IDF 5000 + BERT 768 = 5768 features]
F --> G
G --> H[ML Models\nLR · RF · SVM · XGBoost]
G --> I[Ensemble Voting\nHard · Soft]
D --> J[Transformer Fine-tuning\nBERT · DistilBERT · RoBERTa]
H --> K[Evaluation & Comparison\nAccuracy · Precision · Recall · F1]
I --> K
J --> K
```
## 🛠️ 技术栈
### 编程与机器学习
- Python 3.12
- PyTorch
- HuggingFace Transformers
- Scikit-learn
- XGBoost
- SciPy(稀疏矩阵)
### 可视化
- Matplotlib
- Seaborn
### 环境
- Google Colab (T4 GPU)
- Joblib(模型持久化)
## 📈 探索性数据分析
EDA的主要发现:
- 采样后数据集完全平衡(50% / 50%)
- 钓鱼URL往往比合法URL更长
- 常见的钓鱼模式:IP地址、过多的连字符、可疑关键词(`login`, `secure`, `verify`, `paypal`)
- 字符级n-gram能有效捕捉这些模式
## ⚙️ 特征工程
### TF-IDF(字符级N-gram)
```
TfidfVectorizer(
analyzer='char_wb',
ngram_range=(3, 5),
max_features=5000,
sublinear_tf=True
)
```
- 仅在训练集上**fit_transform**(无数据泄漏)
- 在验证集和测试集上**transform**
### BERT上下文嵌入
```
BertModel.from_pretrained('bert-base-uncased')
# Frozen weights — 仅用作 feature extractor
# 输出: [CLS] token embedding → 768 dimensions
```
### 最终特征向量
```
TF-IDF (5,000) + BERT (768) = 5,768 features per URL
```
## 🤖 模型
### 机器学习(使用TF-IDF + BERT特征)
| 模型 | 准确率 | 精确率 | 召回率 | F1 |
|---|---|---|---|---|
| 逻辑回归 | 0.9330 | 0.9148 | 0.9550 | 0.9344 |
| 随机森林* | 0.8525 | 0.8243 | 0.8960 | 0.8586 |
| **SVM** | **0.9420** | **0.9333** | **0.9520** | **0.9426** |
| XGBoost | 0.9195 | 0.9030 | 0.9400 | 0.9211 |
*随机森林使用 `max_depth=6` 进行调优以减少过拟合(差距:1.00 → 0.03)
### 集成投票(LR + RF + SVM + XGBoost)
| 模型 | 准确率 | 精确率 | 召回率 | F1 |
|---|---|---|---|---|
| 硬投票 | 0.9295 | 0.9240 | 0.9360 | 0.9300 |
| 软投票 | 0.9375 | 0.9219 | 0.9560 | 0.9386 |
### Transformer微调
| 模型 | 准确率 | 精确率 | 召回率 | F1 | 错误率 |
|---|---|---|---|---|---|
| BERT base-uncased | 0.9430 | 0.9179 | 0.9730 | 0.9447 | 5.7% |
| DistilBERT | 0.9450 | 0.9304 | 0.9620 | 0.9459 | 5.5% |
| **RoBERTa** | **0.9580** | **0.9404** | **0.9780** | **0.9588** ⭐ | **4.2%** |
## 📌 主要发现
### 1. Transformer优于经典机器学习
所有Transformer模型持续优于经典机器学习和集成方法,证实了上下文表示在URL分析中的有效性。
### 2. RoBERTa是最佳模型
RoBERTa取得了最高的F1分数(0.9588)——与参考期刊将roBERTa-base列为顶级Transformer模型的结论一致。
### 3. SVM几乎匹配BERT微调
使用TF-IDF + BERT特征的SVM(F1: 0.9426)几乎匹配了BERT微调(F1: 0.9447),差距仅为**0.0021**——提供了一种计算成本显著更低的轻量级替代方案。
### 4. 集成方法并非总是获胜
集成软投票(F1: 0.9386)表现不如单个SVM(F1: 0.9426),原因是随机森林相对较弱的性能拖累了整体决策——这是集成方法中已知的**弱学习器问题**。
### 5. 与参考期刊的差距在预期之内
与参考期刊相比,约0.04的差距是合理的,原因如下:
- 数据集领域不同(URL vs 邮件)
- URL的较短文本长度限制了BERT的上下文优势
- 数据集规模较小(10K vs 更大的邮件数据集)
## 🔗 真实世界URL测试
使用13个真实世界URL进行测试(5个合法,5个钓鱼,3个模糊):
| 类别 | 结果 |
|---|---|
| 合法URL (5) | ✅ 全部正确分类 |
| 钓鱼URL (5) | 🚨 全部正确检测(9/9模型一致同意) |
| 模糊URL (3) | ⚠️ 2/3 正确分类 |
值得注意的观察:
- 所有具有明确模式的钓鱼URL均以**9/9模型共识**被检测到
- URL缩短服务(`bit.ly`)被标记为钓鱼——考虑到其常见滥用,这是合理的
- 对于非常短的URL,Transformer比机器学习更可靠
## 📊 与参考期刊的比较
| 模型 | 我们的结果(URL) | 期刊(邮件) | 差距 |
|---|---|---|---|
| BERT base-uncased | F1: 0.9447 | F1: 0.9922 | -0.0475 |
| DistilBERT | F1: 0.9459 | F1: 0.9911 | -0.0452 |
| RoBERTa | F1: 0.9588 | F1: 0.9951 | -0.0363 |
参考文献:*基于Transformer的机器学习用于钓鱼邮件检测*
## 🔁 实验设置
```
Dataset : 10,000 URLs (balanced)
Split : 70 / 10 / 20 (Train / Val / Test)
Epochs : 3 (Transformer fine-tuning)
Batch Size : 32
Learning Rate: 2e-5
Optimizer : AdamW + Linear Warmup Scheduler
Max Length : 128 tokens
Random Seed : 42 (reproducible)
```
## 🚀 未来改进
- [ ] 增加数据集规模以提高泛化能力
- [ ] 添加URL内容特征(HTML,页面标题)
- [ ] 尝试ALBERT、XLNet进行比较
- [ ] 使用Optuna进行超参数调整
- [ ] 通过FastAPI或Streamlit部署模型
- [ ] 使用SHAP进行可解释性AI分析特征重要性
- [ ] 实时钓鱼检测浏览器扩展