Saiful-alam105/spam-detection
GitHub: Saiful-alam105/spam-detection
基于 NLP 与机器学习技术构建的端到端 SMS 垃圾信息分类系统,涵盖从数据预处理到模型部署的完整 pipeline 并对比了多种算法的性能。
Stars: 1 | Forks: 0
# 基于 AI、NLP 和 ML 的垃圾信息检测项目
## 项目概述
本项目使用自然语言处理 (NLP)、机器学习和深度学习技术实现了一个端到端的 SMS 垃圾信息检测系统。
其目标是将 SMS 消息分为两类:
* Ham(正常消息)
* Spam(垃圾推广或欺诈消息)
该项目涵盖了完整的机器学习 pipeline,包括:
* 探索性数据分析 (EDA)
* 文本预处理
* 特征工程
* 模型训练
* 模型评估
* 可视化
* 预测 Pipeline
* 基于 RNN 的深度学习
# 数据集
数据集:SMS Spam Collection Dataset
该数据集包含的 SMS 消息标签分为:
| Label | Description |
| ----- | -------------- |
| ham | Normal message |
| spam | Spam message |
预处理后:
| Label | Encoded Value |
| ----- | ------------- |
| ham | 0 |
| spam | 1 |
# 项目结构
```
spam-detection/
│
├── dataset/
│ ├── spam.csv
│ ├── spam_processed.csv
│ └── model_comparison.csv
│
├── models/
│ ├── tfidf_vectorizer.pkl
│ ├── naive_bayes.pkl
│ ├── logistic_regression.pkl
│ ├── random_forest.pkl
│ ├── rnn_tokenizer.pkl
│ └── rnn_model.keras
│
├── notebooks/
│ ├── eda.ipynb
│ ├── nlp.ipynb
│ ├── feature_engineering.ipynb
│ ├── classical_ml.ipynb
│ ├── visualization.ipynb
│ ├── final_demo.ipynb
│ └── deep_learning.ipynb
│
├── src/
│ ├── eda_preprocessing.py
│ ├── nlp_preprocessing.py
│ ├── feature_engineering.py
│ ├── evaluation.py
│ └── prediction.py
│
├── requirements.txt
├── README.md
└── .gitignore
```
# 探索性数据分析 (EDA)
执行了以下预处理任务:
* 数据集检查
* 形状分析
* 缺失值检测
* 重复记录检测
* 去除重复项
* 列清理与重命名
* 标签编码
具体操作:
* 移除了不必要的列
* 移除了重复的消息
* 重命名了列:
* label
* message
* 转换:
* ham → 0
* spam → 1
# NLP 预处理
应用了以下 NLP 预处理技术:
## 1. 转换为小写
将所有文本转换为小写字母。
示例:
```
HELLO WORLD
```
↓
```
hello world
```
## 2. 移除标点符号
示例:
```
Hello!!!
```
↓
```
Hello
```
## 3. 移除特殊字符和数字
示例:
```
Win $1000 now
```
↓
```
Win now
```
## 4. Tokenization
示例:
```
hello world
```
↓
```
['hello', 'world']
```
## 5. 移除停用词
示例:
```
['this', 'is', 'a', 'message']
```
↓
```
['message']
```
## 6. Stemming
示例:
```
running
runs
runner
```
↓
```
run
run
runner
```
# 特征工程
使用 TF-IDF (Term Frequency–Inverse Document Frequency) 将文本转换为数值向量。
为什么选择 TF-IDF?
* 捕获单词的重要性
* 降低常见词的影响
* 在文本分类中表现极其出色
配置:
```
TfidfVectorizer(max_features=5000)
```
输出:
```
Text
↓
TF-IDF
↓
Numerical Feature Matrix
```
# 训练集 / 验证集 / 测试集划分
数据集被划分为:
| Dataset | Percentage |
| -------------- | ---------- |
| Training Set | 70% |
| Validation Set | 15% |
| Test Set | 15% |
使用分层抽样 (Stratified sampling) 来保持类别分布。
# 机器学习模型
对三个机器学习模型进行了训练和评估。
## 1. Multinomial Naive Bayes
优势:
* 速度快
* 对文本分类非常有效
* 强大的基线模型
## 2. Logistic Regression
优势:
* 简单
* 可解释性强
* 强大的线性分类器
## 3. 随机森林
优势:
* 能够处理复杂的模式
* 减少过拟合
* 预测性能高
# 深度学习模型
## 循环神经网络 (RNN)
架构:
```
Embedding Layer
↓
SimpleRNN
↓
Dense Layer
↓
Output Layer
```
使用的技术:
* Tokenization
* 序列编码
* 填充
* 类别权重平衡
由于数据集存在不平衡问题,因此在训练期间使用了类别权重。
# 模型评估指标
使用了以下指标:
## 准确率
衡量整体的预测正确性。
## 精确率
衡量预测为垃圾消息中有多少实际上是垃圾消息。
## 召回率
衡量有多少实际的垃圾消息被检测到。
## F1 分数
精确率和召回率的调和平均数。
该指标被用作主要的比较指标。
# 结果
| Model | Accuracy | Precision | Recall | F1 Score |
| ------------------- | -------: | --------: | -----: | -------: |
| Naive Bayes | 96.65% | 100.00% | 73.47% | 84.71% |
| Logistic Regression | 95.10% | 98.39% | 62.24% | 76.25% |
| Random Forest | 97.16% | 98.72% | 78.57% | 87.50% |
| RNN | 96.01% | 83.84% | 84.69% | 84.26% |
# 最佳性能模型
随机森林取得了最高的总体性能。
性能:
* 准确率:97.16%
* 精确率:98.72%
* 召回率:78.57%
* F1 分数:87.50%
因此,随机森林被选为最终模型。
# 预测 Pipeline
预测流程:
```
Raw SMS Message
↓
Text Preprocessing
↓
TF-IDF Vectorization
↓
Random Forest Model
↓
Spam / Ham Prediction
```
示例:
输入:
```
URGENT! You have won a free lottery prize.
```
输出:
```
{
"prediction": "Spam",
"confidence": 0.74
}
```
# 可视化
创建了以下可视化图表:
* 准确率对比
* 精确率对比
* 召回率对比
* F1 分数对比
* 混淆矩阵
这些可视化图表有助于比较模型性能,并识别出性能最佳的模型。
# 未来改进
可能的改进方向包括:
* BERT 微调
* 超参数优化
* 交叉验证
* 使用 FastAPI 进行模型部署
* Web 应用程序集成
* 实时 SMS 分类 API
# 使用的技术
* Python
* Pandas
* NumPy
* NLTK
* Scikit-learn
* TensorFlow
* Matplotlib
* Seaborn
* Pickle
标签:Apex, RNN, 人工智能, 垃圾信息检测, 文本分类, 机器学习, 深度学习, 用户模式Hook绕过, 逆向工具