【机器学习案列】基于朴素贝叶斯的垃圾短信分类
>? 博主简介:>曾任某智慧城市类企业算法总监,CSDN / 稀土掘金 等平台人工智能领域优质创作者。
>目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。
>
# 一、引言
  在现代社会中,垃圾短信已经成为一个普遍的问题。为了有效地过滤这些垃圾短信,我们可以使用机器学习技术。朴素贝叶斯分类器是一种简单而有效的分类算法,特别适合处理文本分类问题,如垃圾邮件检测。本文将介绍如何使用Python和朴素贝叶斯分类器来检测垃圾短信。
# 二、 准备工作
在开始之前,你需要确保安装了以下Python库:
- `pandas`:用于数据处理。
- `scikit-learn`:包含朴素贝叶斯分类器。
- `nltk`:用于文本处理。
你可以使用以下命令安装这些库:
```bash
pip install pandas scikit-learn nltk
```
# 三、 数据准备
为了训练朴素贝叶斯分类器,我们需要一个包含短信内容和标签(垃圾或正常)的数据集。这里我们假设你有一个CSV文件,名为`SMSSpamCollection`,包含两列:`message`(短信内容)和`label`(标签,0表示正常短信,1表示垃圾短信)。
在训练模型之前,我们需要对数据进行预处理,包括分词、去除停用词等。
## 3.1 导入需要的库
```python
import pandas as pd
import nltk
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
```
## 3.2 下载nltk数据包
```python
# 下载nltk数据包(只需运行一次)
nltk.download('punkt')
nltk.download('stopwords')
```
## 3.3 读取数据
```python
# 读取数据
df = pd.read_csv('SMSSpamCollection', sep = '\t', names=['label', 'message'])
# 查看数据的前几行
print(df.head())
```
!(data/attachment/forum/202501/14/151640xcmcvccxp3vpqokc.png)
## 3.4 修改训练标签
```python
df['label'] = df.label.map({'ham':0, 'spam':1})
```
## 3.5 清洗数据
```python
# 分词函数
def preprocess_text(text):
words = nltk.word_tokenize(text.lower())# 将文本转换为小写并分词
words = # 去除标点符号
words = # 去除停用词
return ' '.join(words)
# 对短信内容进行预处理
df['processed_message'] = df['message'].apply(preprocess_text)
```
!(data/attachment/forum/202501/14/151707s0ohryhhx4hhh2wh.png)
## 3.6 特征转化并生成数据集
```python
# 特征和标签
X = df['processed_message']
y = df['label']
# 将文本转换为特征向量
vectorizer = CountVectorizer()
X_transformed = vectorizer.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_transformed, y, test_size=0.2, random_state=42)
```
!(data/attachment/forum/202501/14/151754laaj7f9jj96okfjf.png)
# 四、训练模型
使用朴素贝叶斯分类器进行训练。
```python
# 创建并训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)
```
!(data/attachment/forum/202501/14/151744zek1l3jl23hhs251.png)
# 五、模型评估
使用测试集评估模型性能。
```python
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 打印分类报告
print(classification_report(y_test, y_pred, target_names=['Ham', 'Spam']))
```
!(data/attachment/forum/202501/14/151810swnvwnavw6jzc0aw.png)
# 六、完整代码
以下是完整的代码示例:
```python
import pandas as pd
import nltk
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
# 下载nltk数据包(只需运行一次)
nltk.download('punkt')
nltk.download('stopwords')
# 读取数据
df = pd.read_csv('SMSSpamCollection', sep = '\t', names=['label', 'message'])
df['label'] = df.label.map({'ham':0, 'spam':1})
# 分词函数
def preprocess_text(text):
words = nltk.word_tokenize(text.lower())# 将文本转换为小写并分词
words = # 去除标点符号
words = # 去除停用词
return ' '.join(words)
# 对短信内容进行预处理
df['processed_message'] = df['message'].apply(preprocess_text)
# 特征和标签
X = df['processed_message']
y = df['label']
# 将文本转换为特征向量
vectorizer = CountVectorizer()
X_transformed = vectorizer.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_transformed, y, test_size=0.2, random_state=42)
# 创建并训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 打印分类报告
print(classification_report(y_test, y_pred, target_names=['Ham', 'Spam']))
```
# 总结
**朴素贝叶斯优点**
- 可以处理特征数量巨大的情况
- 不易过拟合
- 训练时间短
**朴素贝叶斯缺点**
- 朴素贝叶斯假设所有特征都是独立的,某些情况下可能会出现问题
- 需要足够多的数据才能获得特征比较准确的概率分布
通过上述步骤,我们成功地使用朴素贝叶斯分类器来检测垃圾短信。尽管朴素贝叶斯分类器相对简单,但在许多文本分类任务中表现良好。你可以尝试使用其他特征提取方法和分类算法来进一步提高模型的性能。
如果您在人工智能领域遇到技术难题,或是需要专业支持,无论是技术咨询、项目开发还是个性化解决方案,我都可以为您提供专业服务,如有需要可站内私信或添加下方VX名片(ID:xf982831907)
!(data/attachment/forum/202501/14/151953vm5l56bypbybivkv.jpg)
期待与您一起交流,共同探索AI的更多可能!
页:
[1]