【机器学习】朴素贝叶斯实战:20 Newsgroups新闻分类全流程解析
本文详细介绍了使用朴素贝叶斯算法对20 Newsgroups新闻数据集进行分类的完整流程。首先解析了朴素贝叶斯的数学原理和文本分类优势,然后针对数据集下载可能遇到的HTTP 403错误提供了具体解决方案。文章逐步演示了数据加载、预处理、TF-IDF特征提取、模型训练和评估的全过程,并附上完整实现代码。特别加入"大暑与科技人"的文化视角,将算法调优与节气特点巧妙结合,既展现了技术实践,又体现了人文关
朴素贝叶斯实战:20 Newsgroups新闻分类全流程解析
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的简单但高效的分类算法,尤其适用于文本分类和高维数据。
P(Y∣X)=P(X∣Y)⋅P(Y)P(X) P(Y \mid X) = \frac{P(X \mid Y) \cdot P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)⋅P(Y)
用一句话概括朴素贝叶斯:基于已有的数据,计算新数据属于哪一类的概率,并假设所有特征互不相关。
1、数据集
fetch_20newsgroups 是机器学习中经典的文本分类数据集,常用于自然语言处理(NLP)和朴素贝叶斯等算法的实践。
- 样本数量:约 18846 篇文档(训练集11314 + 测试集7532)。
- 类别(Classes):共20 个类别,分为几个大主题组:
- 计算机相关:如
comp.graphics、comp.os.ms-windows.misc。 - 体育相关:如
rec.sport.baseball、rec.sport.hockey。 - 科学相关:如
sci.med、sci.space。 - 政治/宗教:如
talk.politics.guns、talk.religion.misc。 - 其他(如娱乐、商业等)。
- 计算机相关:如
- 文本特征:每篇文档是纯文本,包含标题(
header)和正文,需预处理(如去除停用词、词干化等)。
2、问题及解决
2.1问题描述
执行这句代码的时候news = fetch_20newsgroups(subset='all'),控制台报了一个错误:

File "D:\anaconda3\Lib\urllib\request.py", line 643, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
这个错误是因为 fetch_20newsgroups() 尝试从互联网下载数据集时被服务器拒绝(HTTP 403 Forbidden)。
2.2解决方案
1. 手动下载数据集
- 访问 20 Newsgroups 数据集官网:http://qwone.com/~jason/20Newsgroups/
- 下载
20news-bydate.tar.gz, - 放在本地目录,如
E:\scikit_learn_data\20news_home\20news-bydate.tar.gz,不需要解压。 
2. 找到文件_twenty_newsgroups.py
①在电脑搜索框中直接搜索_twenty_newsgroups.py 文件并打开
①如果搜索太慢了,可以在解释器的目录中搜索,比如,我用的anaconda3解释器:

搜索到后在pycharm中打开,也可以在记事本中打开:

3. 修改文件_twenty_newsgroups.py

路径,就是你刚刚下载的20news-bydate.tar.gz的路径,注意不要使用中文。比如我的路径就是:archive_path = "E:\\scikit_learn_data\\20news_home\\20news-bydate.tar.gz"。修改完成后ctrl+s保存文件。
现在就能正常加载数据了:

3、实现步骤
1. 数据加载阶段
news = fetch_20newsgroups(subset='all')
print("类别和样本数:\n", news.target_names, news.target.shape)
实现步骤:
- 使用
fetch_20newsgroups加载完整的20 Newsgroups数据集 - 打印输出数据集的20个类别名称和对应的样本数量
- 数据集自动包含文本内容(news.data)和分类标签(news.target)
2. 数据预处理阶段
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target)
实现步骤:
- 使用
train_test_split将数据集随机分割为训练集和测试集 - 默认分割比例是75%训练集和25%测试集
- 得到四个变量:训练文本(X_train)、测试文本(X_test)、训练标签(y_train)、测试标签(y_test)
3. 特征工程阶段
transfer = TfidfVectorizer()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)
实现步骤:
- 创建TF-IDF向量化器(TfidfVectorizer)对象
- 对训练集调用fit_transform方法:学习词汇表并转换文本为TF-IDF特征矩阵
- 对测试集调用transform方法:使用训练集学习的词汇表进行转换
- 文本数据被转换为数值型特征矩阵,供模型使用
4. 模型训练阶段
estimator = MultinomialNB()
estimator.fit(X_train, y_train)
实现步骤:
- 创建多项式朴素贝叶斯(MultinomialNB)分类器
- 调用fit方法在训练集上训练模型
- 模型学习每个特征词在不同类别中的条件概率分布
5. 模型评估阶段
y_predict = estimator.predict(X_test)
print("预测结果为:", y_predict)
print(f"直接比对真实值和预测值:\n{y_test == y_predict}")
print(f"准确率:\n{estimator.score(X_test, y_test)}")
实现步骤:
- 使用训练好的模型对测试集进行预测
- 打印预测结果、预测值与真实值的逐条对比
- 计算并输出模型在测试集上的准确率
- 评估指标简单直观,适合快速验证模型效果
4、完整代码
# 导入所需库
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def nb_news_text_classify():
"""
用朴素贝叶斯算法对新闻进行分类
步骤:
1. 加载数据
2. 数据预处理(TF-IDF向量化)
3. 构建模型(多项式朴素贝叶斯)
4. 训练和评估
"""
# 1.获取数据
news = fetch_20newsgroups(subset='all')
# 查看类别和样本数
print("类别和样本数:\n", news.target_names, news.target.shape)
# 2. 数据拆分
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target)
# 3. 特征工程
transfer = TfidfVectorizer()
X_train = transfer.fit_transform(X_train)
X_test = transfer.transform(X_test)
# 4. 朴素贝叶斯算法预估器
estimator = MultinomialNB()
estimator.fit(X_train, y_train)
# 5. 模型评估
y_predict = estimator.predict(X_test)
print("预测结果为:", y_predict)
print(f"直接比对真实值和预测值:\n{y_test == y_predict}")
print(f"准确率:\n{estimator.score(X_test, y_test)}")
# 主程序入口
if __name__ == '__main__':
nb_news_text_classify()
后续你可以使用matplotlib这个库添加可视化输出。
5、文化角——大暑与科技人的夏日情怀
今日大暑,是二十四节气中的第十二个节气,也是夏季最后一个节气。《月令七十二候集解》有言:"大暑,六月中。暑,热也,就热之中分为大小,月初为小,月中为大,今则热气犹大也。"此时正值"三伏天"的中伏前后,是一年中最炎热的时期,民间素有"小暑大暑,上蒸下煮"之说。
在这炎炎夏日里,科技工作者们依然保持着对知识的渴求。就像朴素贝叶斯算法需要"降温"处理(如平滑参数alpha防止过拟合),我们也需要为自己"降温":一杯清茶,一段优雅的代码,或是午后小憩时思考算法的奥妙。古人消暑有"浮甘瓜于清泉,沉朱李于寒水"的雅趣,而今我们有空调房里的编程马拉松,有实验室里的算法调优,都是现代科技人特有的"消暑"方式。
大暑时节,万物荣华。愿各位开发者在这热情似火的日子里,既能保持代码的"冷静"(避免bug),又能像朴素贝叶斯处理文本那样,从繁杂的暑热中提取出有价值的信息,沉淀属于自己的技术硕果。毕竟,熬过这最热的时光,收获的秋天就不远了。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)