百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

算法干货 | 朴素贝叶斯分类

wptr33 2025-02-27 16:55 22 浏览

分类算法是机器学习算法中的一种,用来判断给定数据项所属的类别,即种类或类型。比如,可以根据某些特征来分辨一部电影属于哪个流派,等等。这样,流派就是我们要预测的类别。第10章“预测性分析与机器学习”还会对机器学习做进一步介绍。此刻,我们要讨论的是一个名为朴素贝叶斯分类的流行算法,它常常用于进行文本文档的研究。

朴素贝叶斯分类是一个概率算法,它基于概率与数理统计中的贝叶斯定理。贝叶斯定理给出了如何利用新证据修正某事件发生的概率的方法。例如,假设一个袋子里装有一些巧克力和其他物品,但是这些我们没法看到。这时,我们可以用P(D)表示从袋子中掏出一块深色巧克力的概率。同时,我们用P(C)代表掏出一块巧克力的概率。当然,因为全概率是1,所以P(D)和P(C)的最大取值也只能是1。贝叶斯定理指出,后验概率与先验概率和相似度的乘积成正比,具体公式如下所示:


上面公式中,P(C|D)是在事件C发生的情况下事件D发生的可能性。在我们还没有掏出任何物品之前,P(D)= 0.5,因为我们尚未获得任何信息。实际应用这个公式时,必须知道P(C|D)和P(C),或者能够间接求出这两个概率。

朴素贝叶斯分类之所以称为朴素,是因为它简单假设特征之间是相互独立的。实践中,朴素贝叶斯分类的效果通常都会很好,说明这个假设得到了一定程度的保证。近来,人们发现这个假设之所以有意义,理论上是有依据的。不过,由于机器学习领域发展迅猛,现在已经发明了多种效果更佳的算法。

下面,我们将利用停用词或标点符号对单词进行分类。这里,将字长作为一个特征,因为停用词和标点符号往往都比较短。

为此,需要定义如下所示的函数:

def word_features(word):
  return {'len': len(word)}

def isStopword(word):
  return word in sw or word in punctuation

下面,对取自古登堡项目的shakespeare-caesar.txt中的单词进行标注,以区分是否为停用词,具体代码如下所示:

labeled_words = ([(word.lower(), isStopword(word.lower())) for 
word in words])
random.seed(42)
random.shuffle(labeled_words)
print labeled_words[:5]

下面显示了5个标注后的单词:

[('was', True), ('greeke', False), ('cause', False), ('but', True),  ('house', False)] 

对于每个单词,我们可以求出其长度:

featuresets = [(word_features(n), word) for (n, word) in 
labeled_words]

前几章介绍过拟合,以及通过训练数据集和测试数据集的交叉验证来避免这种情况的方法。下面将要训练一个朴素贝叶斯分类器,其中90%的单词用于训练,剩下的10%用于测试。首先,创建训练数据集和测试数据集,并针对数据展开训练,具体代码如下所示:

cutoff = int(.9 * len(featuresets))
train_set, test_set = featuresets[:cutoff], featuresets[cutoff:]
classifier = nltk.NaiveBayesClassifier.train(train_set)

如今,拿出一些单词,检查该分类器的效果。

classifier = nltk.NaiveBayesClassifier.train(train_set)
print "'behold' class", 
classifier.classify(word_features('behold'))
print "'the' class", classifier.classify(word_features('the'))

幸运的是,这些单词的分类完全正确:

'behold' class False 'the' class True 

然后,根据测试数据集来计算分类器的准确性,具体代码如下所示:

print "Accuracy", nltk.classify.accuracy(classifier, test_set)

这个分类器的准确度非常高,几乎达到85%。下面来看哪些特征的贡献最大:

print classifier.show_most_informative_features(5)

结果显示,在分类过程中字长的作用最大:


下列代码取自本书代码包中的naive_classification.py文件:

import nltk
import string
import random

sw = set(nltk.corpus.stopwords.words('english'))
punctuation = set(string.punctuation)

def word_features(word):
  return {'len': len(word)}

def isStopword(word):
  return word in sw or word in punctuation

gb = nltk.corpus.gutenberg
words = gb.words("shakespeare-caesar.txt")

labeled_words = ([(word.lower(), isStopword(word.lower())) for 
word in words])
random.seed(42)
random.shuffle(labeled_words)
print labeled_words[:5]

featuresets = [(word_features(n), word) for (n, word) in 
labeled_words]
cutoff = int(.9 * len(featuresets))
train_set, test_set = featuresets[:cutoff], featuresets[cutoff:]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print "'behold' class", 
classifier.classify(word_features('behold'))
print "'the' class", classifier.classify(word_features('the'))

print "Accuracy", nltk.classify.accuracy(classifier, test_set)
print classifier.show_most_informative_features(5)

以上内容选自《Python数据分析》

Python作为一种高级程序设计语言,其数据分析功能也逐渐为大众所认可。本书就是一本介绍如何用Python进行数据分析的指南。全书共12章,从Python程序库入门、NumPy数组、matplotlib和pandas开始,陆续介绍了数据加工、数据处理和数据可视化等内容,还包括信号处理、数据库、文本分析、机器学习、互操作性和性能优化等高级主题。本书补充了一些重要概念、常用函数及在线资源等重要内容。


相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...