贝叶斯分类器做文本分类案例

article/2025/10/15 15:27:26

贝叶斯分类器做文本分类

文本分类是现代机器学习应用中的一大模块,更是自然语言处理的基础之一。我们可以通过将文字数据处理成数字然后使用贝叶斯来帮助我们判断一段话或者一篇文章中的主题分类感情倾向甚至文章体裁绝大多数社交媒体数据的自动化采集都是依靠首先将文本编码成数字然后按分类结果采集需要的信息虽然现在自然言处理领域大部分由深度学习所控制贝叶斯分类器依然是文本分类中的一颗明珠现在我们就来学习一下贝叶斯分类器是怎样实现文本分类的

文本编码技术简介

单词计数向量

在开始分类之前,我们必须先将文本编码成数字。一种常用的方法是单词计数向量。在这种技术中,一个样本可以包 含一段话或一篇文章,这个样本中如果出现了10 个单词,就会有 10个 特征
(n=10),每个特征代表一个单词,特征的取值表示这个单词在这个样本中总共出现了几次,是一个离散的,代表次数的,正整数
sklearn 当中,单词计数向量计数可以通过 feature_extraction.text 模块中的 CountVectorizer 类实现,来看一个简单的例子:
sample = ["Machine learning is fascinating, it is wonderful","Machine learning is a sensational techonology","Elsa is a popular character"]
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer()
X = vec.fit_transform(sample) 
print(X)#使用接口get_feature_names()调用每个列的名称
import pandas as pd
#注意稀疏矩阵是无法输入pandas的
CVresult = pd.DataFrame(X.toarray(),columns = vec.get_feature_names())
CVresult

结果:

TF-IDF

TF-IDF全称term frequency-inverse document frequency频逆文档频率是通过单词在文档中出现的频率来衡量其权重,也就是说,IDF的大小与一个词的常见程度成反比这个词越常见编码后为它设置的权重会倾向于越小,以此来压制频繁出现的一些无意义的词。在sklearn当中我们使用feature_extraction.text中类TdfVectorizer 来执行这种编码

from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF
vec = TFIDF()
X = vec.fit_transform(sample) 
X

结果:

#同样使用接口get_feature_names()调用每个列的名称
TFIDFresult = pd.DataFrame(X.toarray(),columns=vec.get_feature_names())
TFIDFresult

结果: 

#使用TF-IDF编码之后,出现得多的单词的权重被降低了么?
CVresult.sum(axis=0)/CVresult.sum(axis=0).sum()

结果: 

character      0.0625
elsa           0.0625
fascinating    0.0625
is             0.2500
it             0.0625
learning       0.1250
machine        0.1250
popular        0.0625
sensational    0.0625
techonology    0.0625
wonderful      0.0625
dtype: float64
TFIDFresult.sum(axis=0) / TFIDFresult.sum(axis=0).sum()

结果:

character      0.083071
elsa           0.083071
fascinating    0.064516
is             0.173225
it             0.064516
learning       0.110815
machine        0.110815
popular        0.083071
sensational    0.081192
techonology    0.081192
wonderful      0.064516
dtype: float64

案例

探索文本数据

在现实中,文本数据的处理是十分耗时耗力的,尤其是不规则的长文本的处理方式,绝对不是一两句话能够说明白的,因此这里我们使用的数据集是sklearn自带的文本数据集fetch_20newsgroup。这个数据集是20个网络新闻组的语料库,其中包含约2万篇新闻,全部以英文显示,如果大家希望使用中文则处理过程会更加困难,会需要自己加载中文的语料库。在这个例子中,主要目的是为大家展示贝叶斯的用法和效果,因此我们就使用英文的语料库。

from sklearn.datasets import fetch_20newsgroups
#初次使用这个数据集的时候,会在实例化的时候开始下载
data = fetch_20newsgroups()
#通常我们使用data来查看data里面到底包含了什么内容,但由于fetch_20newsgourps这个类加载出的数据巨大,数
#据结构中混杂很多文字,因此很难去看清
#不同类型的新闻
data.target_names
#其实fetch_20newsgroups也是一个类,既然是类,应该就有可以调用的参数
#面对简单数据集,我们往往在实例化的过程中什么都不写,但是现在data中数据量太多,不方便探索
#因此我们需要来看看我们的类fetch_20newsgroups都有什么样的参数可以帮助我们

结果:

import numpy as np
import pandas as pd
categories = ["sci.space" #科学技术 - 太空,"rec.sport.hockey" #运动 - 曲棍球,"talk.politics.guns" #政治 - 枪支问题,"talk.politics.mideast"] #政治 - 中东问题
train = fetch_20newsgroups(subset="train",categories = categories)
test = fetch_20newsgroups(subset="test",categories = categories)#可以观察到,里面依然是类字典结构,我们可以通过使用键的方式来提取内容
train.target_names

结果:

使用TF-IDF将文本数据编码

from sklearn.feature_extraction.text import TfidfVectorizer as TFIDF
Xtrain = train.data
Xtest = test.data
Ytrain = train.target
Ytest = test.targettfidf = TFIDF().fit(Xtrain)
Xtrain_ = tfidf.transform(Xtrain)
Xtest_ = tfidf.transform(Xtest)Xtrain_

结果:

tosee = pd.DataFrame(Xtrain_.toarray(),columns=tfidf.get_feature_names()) 
tosee.head()

结果:

tosee.shape

结果: 

在贝叶斯上分别建模查看结果

from sklearn.naive_bayes import MultinomialNB, ComplementNB, BernoulliNB
from sklearn.metrics import brier_score_loss as BS
name = ["Multinomial","Complement","Bournulli"] #注意高斯朴素贝叶斯不接受稀疏矩阵
models = [MultinomialNB(),ComplementNB(),BernoulliNB()]
for name,clf in zip(name,models):clf.fit(Xtrain_,Ytrain)y_pred = clf.predict(Xtest_)proba = clf.predict_proba(Xtest_)score = clf.score(Xtest_,Ytest)print(name)#4个不同的标签取值下的布里尔分数Bscore = []for i in range(len(np.unique(Ytrain))):bs = BS(Ytest,proba[:,i],pos_label=i)Bscore.append(bs)print("\tBrier under {}:{:.3f}".format(train.target_names[i],bs))print("\tAverage Brier:{:.3f}".format(np.mean(Bscore)))print("\tAccuracy:{:.3f}".format(score))print("\n")

结果:

Multinomial
Brier under rec.sport.hockey:0.018
Brier under sci.space:0.033
Brier under talk.politics.guns:0.030
Brier under talk.politics.mideast:0.026
Average Brier: 0.027
Accuracy: 0.975Complement
Brier under rec.sport.hockey:0.023
Brier under sci.space:0.039
Brier under talk.politics.guns:0.039
Brier under talk.politics.mideast:0.033
Average Brier:0.033
Accuracy: 0.986Bournulli
Brier under rec.sport.hockey: 0.068
Brier under sci.space:0.025
Brier under talk.politics.guns:0.045
Brier under talk.politics.mideast:0.053
Average Brier: 0.048
Accuracy: 0.902

概率校准 

from sklearn.calibration import CalibratedClassifierCV
name = ["Multinomial","Multinomial + Isotonic","Multinomial + Sigmoid","Complement","Complement + Isotonic","Complement + Sigmoid","Bernoulli","Bernoulli + Isotonic","Bernoulli + Sigmoid"]
models = [MultinomialNB(),CalibratedClassifierCV(MultinomialNB(), cv=2, method='isotonic'),CalibratedClassifierCV(MultinomialNB(), cv=2, method='sigmoid'),ComplementNB(),CalibratedClassifierCV(ComplementNB(), cv=2, method='isotonic'),CalibratedClassifierCV(ComplementNB(), cv=2, method='sigmoid'),BernoulliNB(),CalibratedClassifierCV(BernoulliNB(), cv=2, method='isotonic'),CalibratedClassifierCV(BernoulliNB(), cv=2, method='sigmoid')]
for name,clf in zip(name,models):clf.fit(Xtrain_,Ytrain)y_pred = clf.predict(Xtest_)proba = clf.predict_proba(Xtest_)score = clf.score(Xtest_,Ytest)print(name)Bscore = []for i in range(len(np.unique(Ytrain))):bs = BS(Ytest,proba[:,i],pos_label=i)Bscore.append(bs)print("\tBrier under {}:{:.3f}".format(train.target_names[i],bs))print("\tAverage Brier:{:.3f}".format(np.mean(Bscore)))print("\tAccuracy:{:.3f}".format(score))print("\n")

结果:

Multinomial
Brier under rec.sport.hockey: 0.018
Brier under sci.space:0.033
Brier under talk.politics.guns:0.030
Brier under talk.politics.mideast:0.026
Average Brier: 0.027
Accuracy: 0.975Multinomial + Isotonic
Brier under rec.sport.hockey: 0.006
Brier under sci.space:0.012
Brier under talk.politics.guns: 0.013
Brier under talk.politics.mideast:0.009
Average Brier: 0.010
Accuracy: 0.973Multinomial + Sigmoid
Brier under rec.sport.hockey: 0.006
Brier under sci.space:0.012
Brier under talk.politics.guns:0.013
Brier under talk.politics.mideast:0.009
Average Brier:0.010
Accuracy: 0.973Complement
Brier under rec.sport.hockey:0.023
Brier under sci.space:0.039
Brier under talk.politics.guns:0.039
Brier under talk.politics.mideast:0.033
Average Brier: 0.033
Accurary.0.996Bernoulli
Brier under rec.sport.hockey: 0.068
Brier under sci.space:0.025
Brier under talk.politics.guns:0.045
Brier under talk.politics.mideast:0.053
Average Brier: 0.048
Accuracy: 0.902Bernoulli + Isotonic
Brier under rec.sport.hockey: 0.016
Brier under sci. space: 0. 014
Brier under talk.politics.guns:0.034
Brier under talk.politics.mideast:0.033
Average Brier: 0.024
Accuracy: 0.952Complement + Isotonic
Brier under rec.sport.hockey: 0.004
Brier
under sci.space:0.}e7
Brier under talk.politics.guns:0.009
Brier under talk.politics.mideast:0.006
Average Brier:0.006
Accuracy: 0.985Complement + Sigmoid
Brier under rec.sport.hockey: 0.004
Brier under
sci.space:0.009
Brier under talk.politics.guns:0.010
Brier under talk.politics.mideast:0.007
Average Brier: 0.097
Accuracy:0.986
可以观察到,多项式分布下无论如何调整,算法的效果都不如补集朴素贝叶斯来得好。因此我们在分类的时候,应该选择补集朴素贝叶斯。对于补集朴素贝叶斯来说,使用Sigmoid 进行概率校准的模型综合最优秀:准确率最高,对数损失和布里尔分数都在0.1 以下,可以说是非常理想的模型了。对于机器学习而言,朴素贝叶斯也许不是最常用的分类算法,但作为概率预测算法中唯一一个真正依赖概率来进行计算,并且简单快捷的算法,朴素贝叶斯还是常常被人们提起。并且,朴素贝叶斯在文本分类上的效果的确非常优秀。由此可见,只要我们能够提供足够的数据,合理利用高维数据进行训练,朴素贝叶斯就可以为我们提供意想不到的效果。

http://chatgpt.dhexx.cn/article/kVNqvdqB.shtml

相关文章

贝叶斯分类——朴素贝叶斯算法

在机器学习分类算法中,大多数的分类算法,比如决策树,KNN,SVM等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数 Yf(x) ,要么是条件分布 P(Y|X)。 但是朴素贝叶斯…

朴素贝叶斯分类:原理

贝叶斯原理是英国数学家托马斯贝叶斯提出的。贝叶斯是个很神奇的人,他的经历类似梵高。生前没有得到重视,死后,他写的一篇关于归纳推理的论文被朋友翻了出来,并发表了。这一发表不要紧,结果这篇论文的思想直接影响了接…

贝叶斯多分类原理与python代码

贝叶斯处理多分类问题时,对于不同的数据特征要采用不同的贝叶斯变体。这里主要说下处理“连续型”变量的高斯贝叶斯分类和处理”离散型“变量的多项式贝叶斯分类。 回顾:贝叶斯公式 p(x):对于输入的每个x值是随机的,它们应该有相…

朴素贝叶斯分类的概念(一)

朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集.速度快,可调参数少.非常适合为分类问题提供快速粗糙的基本方案. 作为一个数学小白,乍一听到朴素贝叶斯这个名词时一般都是晕的,根据多年的初等数学学习经验,贝叶斯应该是一个人,但是"朴素"…

Python3 实现朴素贝叶斯分类

Python3 实现朴素贝叶斯分类 贝叶斯定理朴素贝叶斯源代码样例测试 贝叶斯定理 贝叶斯定理是由已知事件概率和条件概率计算未知条件概率的概率推理算法,其公式如下: 其中,P(Bi|A)是要计算的目标条件概率,表示事件 A 发生的条件下…

浅谈贝叶斯分类

贝叶斯分类 贝叶斯分类是一类分类算法的总称,以贝叶斯定理为基础。其中我们较为熟悉的朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。 贝叶斯网络 贝叶斯网络是一种概念图模型。概率图模型就是用图论和概率论的知识,利…

基于Python实现的图片贝叶斯分类器分类

使用流程及应用展示: 1. 选择图片: 控制台版本从命令行输入 当直接回车时将读取默认路径图片(./assets/生活照-武.jpg),相对路径是从打开程序的文件夹开始的,若输入路径无效或不可读将继续询问输入 GUI 从文件浏览器…

【贝叶斯分类4】贝叶斯网

文章目录 1. 半朴素贝叶斯分类器知识回顾2. 贝叶斯网学习笔记2.1 引言2.2 知识卡片2.3 概率图模型(PGM)2.3.1 引言2.3.2 为什么引入概率图?2.3.3 概率图的三个基本问题(表示,学习,推断) 2.4 贝叶斯网2.4.1 贝叶斯网的表达2.4.2 结…

机器学习算法-朴素贝叶斯分类

机器学习算法--朴素贝叶斯分类 引入贝叶斯决策论条件概率和全概率公式贝叶斯推断和朴素贝叶斯推断拉普拉斯平滑 代码实例1、言论过滤器2、垃圾邮件过滤器 代做 引入 贝叶斯决策论(Bayesian decision theory)是概率论框架下实施决策的基本方法。对分类任务来说,在所有…

【ML】贝叶斯分类和朴素贝叶斯分类

一、介绍 贝叶斯定理是英国数学家托马斯贝叶斯提出的,为了解决一个“逆概率”问题。 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种…

机器学习之朴素贝叶斯分类

朴素贝叶斯分类 贝叶斯定理和基础概率论朴素贝叶斯高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别几种朴素贝叶斯实战总结 贝叶斯定理和基础概率论 概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述&…

机器学习--朴素贝叶斯分类函数

一、前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独…

机器学习之贝叶斯算法图像分类

数据集:数据集采用Sort_1000pics数据集。数据集包含1000张图片,总共分为10类。分别是人(0),沙滩(1),建筑(2),大卡车(3),恐龙&#xff…

使用 Python 进行朴素贝叶斯分类

定义 在机器学习中,贝叶斯分类器是一种简单的概率分类器,它基于应用贝叶斯定理。朴素贝叶斯分类器使用的特征模型做出了很强的独立性假设。这意味着一个类的特定特征的存在与其他所有特征的存在是独立的或无关的。 独立事件的定义: 两个事件…

数据分类《二》贝叶斯分类

本博客是参考《数据仓库与数据挖掘技术》以及诸多道友的blog。仅作为自己学习的一个总结。 贝叶斯分类是一种基于统计学的分类方法,可以预测一个类成员关系的可能性。数据挖掘主要使用两种分类,朴素贝叶斯和贝叶斯网络方法。前者使用贝叶斯进行预测&…

贝叶斯分类及其代码

学期末的综述报告我选择了贝叶斯分类,既然已经写了就将它分享一下。 主要目的就是以教促学。 如有问题欢迎在评论区进行讨论。 随着现代社会信息技术的发展,对于数据的挖掘越来越重要,分类是数据挖掘中应用领域极其广泛的技术之一[1]&#…

栈和队列、

目录 1、栈: 1.1、栈的概念及结构: 1.2、栈的实现: 1.2.1、test.c源文件: 1.2.2、Stack.c源文件: 1.2.3、Stack.h头文件: 1.3、例题1: 2、队列: 2.1、队列的概念及结构&…

栈和队列——表达式求值大全

表达式求值 一.关于三种表达式的分类 中缀表达式:即我们最为常见的表达式,运算符号位于参与运算的连个操作数中间的表达式称作中缀表达式前缀表达式:前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将…

栈与队列-

基础 stl中栈和队列不是容器,而是容器适配器。它们提供接口,由其他容器实现。 20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否…

数据结构----栈和队列

xdm这玩意我不会导入,只能截图了。 目录 栈篇 1.1栈 1.2.栈操作数据元素的两种动作: 2.代码实现 2.1初始化和销毁 2.2插入 2.3删除和判空 2.4返回栈顶值,计算栈长 队列篇 3.1队列 4.代码实现 4.1初始化和销毁和判空 4.2入列 4.3出列 4.4…