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分析特征重要性 - [ ] 实时钓鱼检测浏览器扩展