【机器学习】朴素贝叶斯对fetch_20newsgroups数据集进行分类实现

环境

Python 3.x

Scikit-learn库

Jupyter Notebook或类似IDE(用于代码编写和结果展示)

数据集

        使用Scikit-learn自带的fetch_20 Newsgroups数据集。该数据集包含来自20个不同新闻组的文本数据。每个新闻组都包含多篇新闻文档,总共约有18,000篇文档。涵盖了多个主题,包括科技、政治、体育、娱乐等。每个文档都被分配了一个特定的标签,表示其所属的新闻组类别。fetch_20newsgroups数据集是一个常用的用于文本分类任务和主题建模任务的基准数据集之一。

步骤

1. 导入必要的库

导入Scikit-learn中的用于朴素贝叶斯、特征提取、数据分割等的相关模块。

2. 加载、划分数据集

使用Scikit-Learn的datasets模块加载20 Newsgroups数据集。(数据集较大,加载时间可能比较长,耐心等待)

使用train_test_split函数将数据集划分为训练集和测试集。

3. 数据预处理

将新闻文本数据进行特征工程处理,即将新闻文本进行分词,统计每个词的出现频数,将代表性的词汇与文本分类结果对应。常用于文本分类的特征工程为TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文档频率)。它是一种常见的加权统计方法,用于评估每个词汇对每篇文章的重要程度。

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
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

图片1

加载20类新闻数据集

# 读取训练数据
news = fetch_20newsgroups(subset='all')

图片2

数据集分析:

1、数据集信息

数据集形状 (18846,)

    =================   ==========

    Classes                     20

    Samples total            18846

    Dimensionality               1

    Features                  text

    =================   ==========

2、数据集标签20类别

newsgroups = fetch_20newsgroups(subset='train', categories=None, shuffle=True, random_state=42)
newsgroups.target_names

图片3

 划分训练集和测试集

# 进行数据的分割训练集合测试集
# X_train是样本训练集,X_test是样本测试集;y_train是样本训练集对应的标签集,y_test是样本测试集对应的标签集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

图片4

使用TF-IDF向量化文本数据

# 使用TF-IDF向量化文本数据
tfidf_vectorizer = TfidfVectorizer(stop_words='english')
X_train_tfidf = tfidf_vectorizer.fit_transform(x_train)
X_test_tfidf = tfidf_vectorizer.transform(x_test)

图片5

初始化多项式朴素贝叶斯模型

# 初始化多项式朴素贝叶斯模型
multinomial_nb = MultinomialNB()

图片6

训练模型

# 训练模型
multinomial_nb.fit(X_train_tfidf, y_train)

图片7

模型预测

# 模型预测
y_pred = multinomial_nb.predict(X_test_tfidf)

图片8

图片9

计算准确率

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")

图片10

输出分类报告

# 输出分类报告
print("Classification Report:")
print(classification_report(y_test, y_pred))

图片11

输出混淆矩阵

# 输出混淆矩阵
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

图片12

使用高斯朴素贝叶斯(常用于连续数据)进行分类任务

导入必要的库/模块

比先前朴素贝叶斯增加两个模块

图片13

加载20类新闻数据集划分训练集和测试集同前面朴素贝叶斯

图片14

为高斯朴素贝叶斯通常用于连续数据,而不是文本数据。对于文本数据,我们通常需要将其转换为词频或TF-IDF等数值特征所以使用词频向量化文本数据。

图片15

CountVectorizer和TfidfVectorizer默认输出稀疏矩阵,因为文本数据通常是高维稀疏的。为了解决这个问题,需要将稀疏矩阵转换为密集矩阵。可以通过调用.toarray()方法来实现。

图片16

初始化高斯朴素贝叶斯模型并进行训练,高斯朴素贝叶斯,将稀疏矩阵转换为密集矩阵会显著增加计算量和内存需求,从而增加训练时间所以训练时间较长

图片17

进行模型预测并计算准确率,准确率比多项式朴素贝叶斯高一点。

图片18

输出分类报告和混淆矩阵

图片19

图片20

高斯朴素贝叶斯完整代码:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 读取训练数据
news = fetch_20newsgroups(subset='all')
# 进行数据的分割训练集合测试集
# X_train是样本训练集,X_test是样本测试集;y_train是样本训练集对应的标签集,y_test是样本测试集对应的标签集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 使用词频向量化文本数据
count_vectorizer = CountVectorizer(stop_words='english')
X_train_counts = count_vectorizer.fit_transform(x_train)
X_test_counts = count_vectorizer.transform(x_test)
# 将稀疏矩阵转换为密集矩阵
X_train_dense = X_train_counts.toarray()
X_test_dense = X_test_counts.toarray()
# 初始化高斯朴素贝叶斯模型
gaussian_nb = GaussianNB()
# 训练模型
gaussian_nb.fit(X_train_dense, y_train)
# 模型预测
y_pred = gaussian_nb.predict(X_test_dense)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
# 输出分类报告
print("Classification Report:")
print(classification_report(y_test, y_pred))
# 输出混淆矩阵
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

伯努利朴素贝叶斯:

增加以下模块:

图片21

重复上述过程,我们发现,准确率相较于多项式贝叶斯较低。

图片22

伯努利朴素贝叶斯完整代码:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import BernoulliNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 读取训练数据
news = fetch_20newsgroups(subset='all')
# 进行数据的分割训练集合测试集
# X_train是样本训练集,X_test是样本测试集;y_train是样本训练集对应的标签集,y_test是样本测试集对应的标签集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 使用词频向量化文本数据
count_vectorizer = CountVectorizer(stop_words='english')
X_train_counts = count_vectorizer.fit_transform(x_train)
X_test_counts = count_vectorizer.transform(x_test)
# 初始化伯努利朴素贝叶斯模型
bernoulli_nb = BernoulliNB()
# 训练模型
gaussian_nb.fit(X_train_dense, y_train)
# 模型预测
y_pred = bernoulli_nb.predict(X_test_counts)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
# 输出分类报告
print("Classification Report:")
print(classification_report(y_test, y_pred))
# 输出混淆矩阵
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值