朴素贝叶斯实战: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(YX)=P(X)P(XY)P(Y)

用一句话概括朴素贝叶斯基于已有的数据,计算新数据属于哪一类的概率,并假设所有特征互不相关。

1、数据集

fetch_20newsgroups 是机器学习中经典的文本分类数据集,常用于自然语言处理(NLP)和朴素贝叶斯等算法的实践。

  • 样本数量:约 18846 篇文档(训练集11314 + 测试集7532)。
  • 类别(Classes):共20 个类别,分为几个大主题组:
    • 计算机相关:如 comp.graphicscomp.os.ms-windows.misc
    • 体育相关:如 rec.sport.baseballrec.sport.hockey
    • 科学相关:如 sci.medsci.space
    • 政治/宗教:如 talk.politics.gunstalk.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),又能像朴素贝叶斯处理文本那样,从繁杂的暑热中提取出有价值的信息,沉淀属于自己的技术硕果。毕竟,熬过这最热的时光,收获的秋天就不远了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐