【机器学习案列】基于朴素贝叶斯的垃圾短信分类

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个性化解决方案等服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:xf982831907
💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

【机器学习案列】基于朴素贝叶斯的垃圾短信分类

  • 一、引言
  • [二、 准备工作](#二、 准备工作)
  • [三、 数据准备](#三、 数据准备)
    • [3.1 导入需要的库](#3.1 导入需要的库)
    • [3.2 下载nltk数据包](#3.2 下载nltk数据包)
    • [3.3 读取数据](#3.3 读取数据)
    • [3.4 修改训练标签](#3.4 修改训练标签)
    • [3.5 清洗数据](#3.5 清洗数据)
    • [3.6 特征转化并生成数据集](#3.6 特征转化并生成数据集)
  • 四、训练模型
  • 五、模型评估
  • 六、完整代码
  • 总结

一、引言

在现代社会中,垃圾短信已经成为一个普遍的问题。为了有效地过滤这些垃圾短信,我们可以使用机器学习技术。朴素贝叶斯分类器是一种简单而有效的分类算法,特别适合处理文本分类问题,如垃圾邮件检测。本文将介绍如何使用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())

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 = [word for word in words if word.isalnum()]  # 去除标点符号
    words = [word for word in words if word not in stopwords.words('english')]  # 去除停用词
    return ' '.join(words)

# 对短信内容进行预处理
df['processed_message'] = df['message'].apply(preprocess_text)

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)

四、训练模型

使用朴素贝叶斯分类器进行训练。

python 复制代码
# 创建并训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)

五、模型评估

使用测试集评估模型性能。

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']))

六、完整代码

以下是完整的代码示例:

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 = [word for word in words if word.isalnum()]  # 去除标点符号
    words = [word for word in words if word not in stopwords.words('english')]  # 去除停用词
    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']))

总结

朴素贝叶斯优点

  • 可以处理特征数量巨大的情况
  • 不易过拟合
  • 训练时间短
    朴素贝叶斯缺点
  • 朴素贝叶斯假设所有特征都是独立的,某些情况下可能会出现问题
  • 需要足够多的数据才能获得特征比较准确的概率分布

通过上述步骤,我们成功地使用朴素贝叶斯分类器来检测垃圾短信。尽管朴素贝叶斯分类器相对简单,但在许多文本分类任务中表现良好。你可以尝试使用其他特征提取方法和分类算法来进一步提高模型的性能。

相关推荐
laopeng30120 分钟前
1.Spring AI 从入门到实践
java·人工智能·spring
uncle_ll34 分钟前
ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT
人工智能·gpt·chatgpt·大模型·llm
深图智能37 分钟前
PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别
人工智能·pytorch·python·深度学习
CSDN云计算41 分钟前
聚焦算力、AI、安全、5G等十大领域,赛迪顾问发布2025年IT趋势
人工智能·5g·安全·量子计算·赛迪
Ai智享41 分钟前
单线性激光扫描、多线性激光扫描?激光扫描三维重建算法环节
人工智能·算法·计算机视觉
开出南方的花1 小时前
大模型微调介绍-Prompt-Tuning
人工智能·自然语言处理·lora·llm·prompt·peft·adapter
阿里云云原生1 小时前
5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署
人工智能·gpt·语音识别
点云SLAM1 小时前
CVPR 2024 图像处理方向总汇(图像去噪、图像增强、图像分割和图像恢复等)
人工智能·深度学习·计算机视觉·图像分割·图像增强·cvpr2024
不爱原创的Yoga2 小时前
半导体、芯片、人工智能、智能驾驶汽车的趋势
人工智能·汽车
python机器学习ML2 小时前
机器学习——集成学习、线性模型、支持向量机、K近邻、决策树、朴素贝叶斯、虚拟分类器分析电动车数据集Python完整代码
python·算法·机器学习·分类