机器学习经典算法之朴素贝叶斯分类

不少人都据说过贝叶斯原理,在哪据说过?基本上是在学几率统计的时候知道的。有些人可能会说,我记不住这些几率论的公式,不要紧,我尽可能用通俗易懂的语言进行讲解。

/*请尊重做者劳动成果,转载请标明原文连接:*/html

/* http://www.javashuo.com/article/p-wsikcjwu-cs.html  * /程序员

贝叶斯原理是英国数学家托马斯·贝叶斯提出的。贝叶斯是个很神奇的人,他的经历相似梵高。生前没有获得重视,死后,他写的一篇关于概括推理的论文被朋友翻了出来,并发表了。这一发表没关系,结果这篇论文的思想直接影响了接下来两个多世纪的统计学,是科学史上著名的论文之一。
贝叶斯原理跟咱们的生活联系很是紧密。举个例子,若是你看到一我的老是花钱,那么会推断这我的多半是个有钱人。固然这也不是绝对,也就是说,当你不能准确预知一个事物本质的时候,你能够依靠和事物本质相关的事件来进行判断,若是事情发生的频次多,则证实这个属性更有可能存在。    
 
1、 贝叶斯原理
贝叶斯原理是怎么来的呢?贝叶斯为了解决一个叫“逆向几率”问题写了一篇文章,尝试解答在没有太多可靠证据的状况下,怎样作出更符合数学逻辑的推测。
 
什么是“逆向几率”呢?
所谓“逆向几率”是相对“正向几率”而言。正向几率的问题很容易理解,好比咱们已经知道袋子里面有 N 个球,不是黑球就是白球,其中 M 个是黑球,那么把手伸进去摸一个球,就能知道摸出黑球的几率是多少。但这种状况每每是上帝视角,即了解了事情的全貌再作判断。
在现实生活中,咱们很难知道事情的全貌。贝叶斯则从实际场景出发,提了一个问题:若是咱们事先不知道袋子里面黑球和白球的比例,而是经过咱们摸出来的球的颜色,能判断出袋子里面黑白球的比例么?
正是这样的一个问题,影响了接下来近 200 年的统计学理论。这是由于,贝叶斯原理与其余统计学推断方法大相径庭,它是创建在主观判断的基础上:在咱们不了解全部客观事实的状况下,一样能够先估计一个值,而后根据实际结果不断进行修正。
咱们用一个题目来体会下:假设有一种病叫作“贝叶死”,它的发病率是万分之一,即 10000 人中会有 1 我的得病。现有一种测试能够检验一我的是否得病的准确率是 99.9%,它的误报率是 0.1%,那么如今的问题是,若是一我的被查出来患有“叶贝死”,实际上患有的可能性有多大?
你可能会想说,既然查出患有“贝叶死”的准确率是 99.9%,那是否是实际上患“贝叶死”的几率也是 99.9% 呢?实际上不是的。你本身想一想,在 10000 我的中,还存在 0.1% 的误查的状况,也就是 10 我的没有患病可是被诊断成阳性。固然 10000 我的中,也确实存在一个患有贝叶死的人,他有 99.9% 的几率被检查出来。因此你能够粗算下,患病的这我的其实是这 11 我的里面的一员,即实际患病比例是 1/11≈9%。
上面这个例子中,实际上涉及到了贝叶斯原理中的几个概念:
 
先验几率
经过经验来判断事情发生的几率,好比说“贝叶死”的发病率是万分之一,就是先验几率。再好比南方的梅雨季是 6-7 月,就是经过往年的气候总结出来的经验,这个时候下雨的几率就比其余时间高出不少。
 
后验几率
后验几率就是发生结果以后,推测缘由的几率。好比说某人查出来了患有“贝叶死”,那么患病的缘由多是 A、B 或 C。患有“贝叶死”是由于缘由 A 的几率就是后验几率。它是属于条件几率的一种。
 
条件几率
事件 A 在另一个事件 B 已经发生条件下的发生几率,表示为 P(A|B),读做“在 B 发生的条件下 A 发生的几率”。好比缘由 A 的条件下,患有“贝叶死”的几率,就是条件几率。
 
似然函数(likelihood function)
你能够把几率模型的训练过程理解为求参数估计的过程。举个例子,若是一个硬币在 10 次抛落中正面均朝上。那么你确定在想,这个硬币是均匀的可能性是多少?这里硬币均匀就是个参数,似然函数就是用来衡量这个模型的参数。似然在这里就是可能性的意思,它是关于统计参数的函数。
介绍完贝叶斯原理中的这几个概念,咱们再来看下贝叶斯原理,实际上贝叶斯原理就是求解后验几率,咱们假设:A 表示事件 “测出为阳性”, 用 B1 表示“患有贝叶死”, B2 表示“没有患贝叶死”。根据上面那道题,咱们能够获得下面的信息。
患有贝叶死的状况下,测出为阳性的几率为 P(A|B1)=99.9%,没有患贝叶死,但测出为阳性的几率为 P(A|B2)=0.1%。另外患有贝叶死的几率为 P(B1)=0.01%,没有患贝叶死的几率 P(B2)=99.99%。
那么咱们检测出来为阳性,并且是贝叶死的几率 P(B1,A)=P(B1)*P(A|B1)=0.01%*99.9%=0.00999%。
这里 P(B1,A) 表明的是联合几率,一样咱们能够求得 P(B2,A)=P(B2)*P(A|B2)=99.99%*0.1%=0.09999%。
而后咱们想求得是检查为阳性的状况下,患有贝叶死的几率,也便是 P(B1|A)。
因此检查出阳性,且患有贝叶死的几率为:
检查出是阳性,但没有患有贝叶死的几率为:
这里咱们能看出来 0.01%+0.1% 均出如今了 P(B1|A) 和 P(B2|A) 的计算中做为分母。咱们把它称之为论据因子,也至关于一个权值因子。
其中 P(B1)、P(B2) 就是先验几率,咱们如今知道了观测值,就是被检测出来是阳性,来求患贝叶死的几率,也就是求后验几率。求后验几率就是贝叶斯原理要求的,基于刚才求得的 P(B1|A),P(B2|A),咱们能够总结出贝叶斯公式为:
由此,咱们能够得出通用的贝叶斯公式:
 
 
 
朴素贝叶斯
讲完贝叶斯原理以后,咱们再来看下今天重点要讲的算法,朴素贝叶斯。 它是一种简单但极为强大的预测建模算法 。之因此称为朴素贝叶斯,是由于它假设每一个输入变量是独立的。这是一个强硬的假设,实际状况并不必定,可是这项技术对于绝大部分的复杂问题仍然很是有效。
 
朴素贝叶斯模型由两种类型的几率组成:
每一个 类别的几率 P(Cj);
每一个属性的 条件几率 P(Ai|Cj)。
 
我来举个例子说明下什么是类别几率和条件几率。假设我有 7 个棋子,其中 3 个是白色的,4 个是黑色的。那么棋子是白色的几率就是 3/7,黑色的几率就是 4/7,这个就是类别几率。
假设我把这 7 个棋子放到了两个盒子里,其中盒子 A 里面有 2 个白棋,2 个黑棋;盒子 B 里面有 1 个白棋,2 个黑棋。那么在盒子 A 中抓到白棋的几率就是 1/2,抓到黑棋的几率也是 1/2,这个就是条件几率,也就是在某个条件(好比在盒子 A 中)下的几率。
在朴素贝叶斯中,咱们要统计的是属性的条件几率,也就是假设取出来的是白色的棋子,那么它属于盒子 A 的几率是 2/3。
为了训练朴素贝叶斯模型,咱们须要先给出训练数据,以及这些数据对应的分类。那么上面这两个几率,也就是类别几率和条件几率。他们均可以从给出的训练数据中计算出来。一旦计算出来,几率模型就可使用贝叶斯原理对新数据进行预测。
 
另外我想告诉你的是,贝叶斯原理、贝叶斯分类和朴素贝叶斯这三者之间是有区别的。
贝叶斯原理是最大的概念,它解决了几率论中“逆向几率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器,朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最经常使用的分类器。朴素贝叶斯之因此朴素是由于它假设属性是相互独立的,所以对实际状况有所约束,若是属性之间存在关联,分类准确率会下降。不过好在对于大部分状况下,朴素贝叶斯的分类效果都不错。
 
 
2、 朴素贝叶斯分类工做原理
朴素贝叶斯分类是经常使用的贝叶斯分类方法。咱们平常生活中看到一个陌生人,要作的第一件事情就是判断 TA 的性别,判断性别的过程就是一个分类的过程。根据以往的经验,咱们一般会从身高、体重、鞋码、头发长短、服饰、声音等角度进行判断。这里的“经验”就是一个训练好的关于性别判断的模型,其训练数据是平常中遇到的各式各样的人,以及这些人实际的性别数据。
 
离散数据案例
咱们遇到的数据能够分为两种,一种是离散数据,另外一种是连续数据。那什么是离散数据呢?离散就是不连续的意思,有明确的边界,好比整数 1,2,3 就是离散数据,而 1 到 3 之间的任何数,就是连续数据,它能够取在这个区间里的任何数值。
我如下面的数据为例,这些是根据你以前的经验所得到的数据。而后给你一个新的数据:身高“高”、体重“中”,鞋码“中”,请问这我的是男仍是女?
针对这个问题,咱们先肯定一共有 3 个属性,假设咱们用 A 表明属性,用 A1, A2, A3 分别为身高 = 高、体重 = 中、鞋码 = 中。一共有两个类别,假设用 C 表明类别,那么 C1,C2 分别是:男、女,在未知的状况下咱们用 Cj 表示。
那么咱们想求在 A一、A二、A3 属性下,Cj 的几率,用条件几率表示就是 P(Cj|A1A2A3)。根据上面讲的贝叶斯的公式,咱们能够得出:
由于一共有 2 个类别,因此咱们只须要求得 P(C1|A1A2A3) 和 P(C2|A1A2A3) 的几率便可,而后比较下哪一个分类的可能性大,就是哪一个分类结果。
在这个公式里,由于 P(A1A2A3) 都是固定的,咱们想要寻找使得 P(Cj|A1A2A3) 的最大值,就等价于求 P(A1A2A3|Cj)P(Cj) 最大值。
咱们假定 Ai 之间是相互独立的,那么: P(A1A2A3|Cj)=P(A1|Cj)P(A2|Cj)P(A3|Cj)
而后咱们须要从 Ai 和 Cj 中计算出 P(Ai|Cj) 的几率,带入到上面的公式得出 P(A1A2A3|Cj),最后找到使得 P(A1A2A3|Cj) 最大的类别 Cj。
我分别求下这些条件下的几率:
P(A1|C1)=1/2, P(A2|C1)=1/2, P(A3|C1)=1/4,P(A1|C2)=0, P(A2|C2)=1/2, P(A3|C2)=1/2,因此 P(A1A2A3|C1)=1/16, P(A1A2A3|C2)=0。
由于 P(A1A2A3|C1)P(C1)>P(A1A2A3|C2)P(C2),因此应该是 C1 类别,即男性。
 
连续数据案例
实际生活中咱们获得的是连续的数值,好比下面这组数据:
那么若是给你一个新的数据,身高 180、体重 120,鞋码 41,请问该人是男是女呢?
公式仍是上面的公式,这里的困难在于,因为身高、体重、鞋码都是连续变量,不能采用离散变量的方法计算几率。并且因为样本太少,因此也没法分红区间计算。怎么办呢?
这时,能够假设男性和女性的身高、体重、鞋码都是正态分布,经过样本计算出均值和方差,也就是获得正态分布的密度函数。有了密度函数,就能够把值代入,算出某一点的密度函数的值。好比,男性的身高是均值 179.五、标准差为 3.697 的正态分布。因此男性的身高为 180 的几率为 0.1069。怎么计算得出的呢? 你可使用 EXCEL 的 NORMDIST(x,mean,standard_dev,cumulative) 函数,一共有 4 个参数:
x:正态分布中,须要计算的数值;
Mean:正态分布的平均值;
Standard_dev:正态分布的标准差;
Cumulative:取值为逻辑值,即 False 或 True。它决定了函数的形式。当为 TRUE 时,函数结果为累积分布;为 False 时,函数结果为几率密度。
这里咱们使用的是 NORMDIST(180,179.5,3.697,0)=0.1069。
同理咱们能够计算得出男性体重为 120 的几率为 0.000382324,男性鞋码为 41 号的几率为 0.120304111。
因此咱们能够计算得出:
P(A1A2A3|C1)=P(A1|C1)P(A2|C1)P(A3|C1)=0.1069*0.000382324* 0.120304111=4.9169e-6
同理咱们也能够计算出来该人为女的可能性:
P(A1A2A3|C2)=P(A1|C2)P(A2|C2)P(A3|C2)=0.00000147489* 0.015354144* 0.120306074=2.7244e-9
很明显这组数据分类为男的几率大于分类为女的几率。
固然在 Python 中,有第三方库能够直接帮咱们进行上面的操做,这个咱们会在下文中介绍。这里主要是给你讲解下具体的运算原理。
 
3、朴素贝叶斯分类器工做流程
朴素贝叶斯分类经常使用于文本分类,尤为是对于英文等语言来讲,分类效果很好。它经常使用于垃圾文本过滤、情感预测、推荐系统等。
朴素贝叶斯分类器须要三个流程,我来给你一一讲解下这几个流程。
第一阶段:准备阶段
在这个阶段咱们须要肯定特征属性,好比上面案例中的“身高”、“体重”、“鞋码”等,并对每一个特征属性进行适当划分,而后由人工对一部分数据进行分类,造成训练样本。
这一阶段是整个朴素贝叶斯分类中惟一须要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段:训练阶段
这个阶段就是生成分类器,主要工做是计算每一个类别在训练样本中的出现频率及每一个特征属性划分对每一个类别的条件几率。
输入是特征属性和训练样本,输出是分类器。
第三阶段:应用阶段
这个阶段是使用分类器对新数据进行分类。输入是分类器和新数据,输出是新数据的分类结果。
好了,在此次课中你了解了几率论中的贝叶斯原理,朴素贝叶斯的工做原理和工做流程,也对朴素贝叶斯的强大和限制有了认识。下一节中,我将带你实战,亲自掌握 Python 中关于朴素贝叶斯分类器工具的使用。
 
4、 sklearn 机器学习包
接下来带你一块儿使用朴素贝叶斯作下文档分类的项目,最重要的工具就是 sklearn 这个机器学习神器。
sklearn 的全称叫 Scikit-learn,它给咱们提供了 3 个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。
 
这三种算法适合应用在不一样的场景下,咱们应该根据特征变量的不一样选择不一样的算法:
高斯朴素贝叶斯 :特征变量是连续变量,符合高斯分布,好比说人的身高,物体的长度。
多项式朴素贝叶斯 :特征变量是离散变量,符合多项分布,在文档分类中特征变量体如今一个单词出现的次数,或者是单词的 TF-IDF 值等。
伯努利朴素贝叶斯 :特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现。
伯努利朴素贝叶斯是以文件为粒度,若是该单词在某文件中出现了即为 1,不然为 0。而多项式朴素贝叶斯是以单词为粒度,会计算在某个文件中的具体次数。而高斯朴素贝叶斯适合处理特征变量是连续变量,且符合正态分布(高斯分布)的状况。好比身高、体重这种天然界的现象就比较适合用高斯朴素贝叶斯来处理。而文本分类是使用多项式朴素贝叶斯或者伯努利朴素贝叶斯。
 
什么是 TF-IDF 值呢?
我在多项式朴素贝叶斯中提到了“词的 TF-IDF 值”,如何理解这个概念呢?
TF-IDF 是一个统计方法,用来评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度。
TF-IDF 其实是两个词组 Term Frequency 和 Inverse Document Frequency 的总称,二者缩写为 TF 和 IDF,分别表明了词频和逆向文档频率
词频 TF 计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。
逆向文档频率 IDF ,是指一个单词在文档中的区分度。它认为一个单词出如今的文档数越少,就越能经过这个单词把该文档和其余文档区分开。IDF 越大就表明该单词的区分度越大。
因此 TF-IDF 其实是词频 TF 和逆向文档频率 IDF 的乘积 。这样咱们倾向于找到 TF 和 IDF 取值都高的单词做为区分,即这个单词在一个文档中出现的次数多,同时又不多出如今其余文档中。这样的单词适合用于分类。
TF-IDF 如何计算
首先咱们看下词频 TF 和逆向文档几率 IDF 的公式。
为何 IDF 的分母中,单词出现的文档数要加 1 呢?由于有些单词可能不会存在文档中,为了不分母为 0,统一给单词出现的文档数都加 1。
TF-IDF=TF*IDF。
你能够看到,TF-IDF 值就是 TF 与 IDF 的乘积, 这样能够更准确地对文档进行分类。好比“我”这样的高频单词,虽然 TF 词频高,可是 IDF 值很低,总体的 TF-IDF 也不高。
我在这里举个例子。假设一个文件夹里一共有 10 篇文档,其中一篇文档有 1000 个单词,“this”这个单词出现 20 次,“bayes”出现了 5 次。“this”在全部文档中均出现过,而“bayes”只在 2 篇文档中出现过。咱们来计算一下这两个词语的 TF-IDF 值。
针对“this”,计算 TF-IDF 值:
因此 TF-IDF=0.02*(-0.0414)=-8.28e-4。
针对“bayes”,计算 TF-IDF 值:
 
很明显“bayes”的 TF-IDF 值要大于“this”的 TF-IDF 值。这就说明用“bayes”这个单词作区分比单词“this”要好。
如何求 TF-IDF
在 sklearn 中咱们直接使用 TfidfVectorizer 类,它能够帮咱们计算单词 TF-IDF 向量的值。在这个类中,取 sklearn 计算的对数 log 时,底数是 e,不是 10。
下面我来说下如何建立 TfidfVectorizer 类。
TfidfVectorizer 类的建立:
建立 TfidfVectorizer 的方法是:
1 TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern)
咱们在建立的时候,有两个构造参数,能够自定义停用词 stop_words 和规律规则 token_pattern。须要注意的是传递的数据结构,停用词 stop_words 是一个列表 List 类型,而过滤规则 token_pattern 是正则表达式。
什么是停用词?停用词就是在分类中没有用的词,这些词通常词频 TF 高,可是 IDF 很低,起不到分类的做用。为了节省空间和计算时间,咱们把这些词做为停用词 stop words,告诉机器这些词不须要帮我计算。
当咱们建立好 TF-IDF 向量类型时,能够用 fit_transform 帮咱们计算,返回给咱们文本矩阵,该矩阵表示了每一个单词在每一个文档中的 TF-IDF 值。
在咱们进行 fit_transform 拟合模型后,咱们能够获得更多的 TF-IDF 向量属性,好比,咱们能够获得词汇的对应关系(字典类型)和向量的 IDF 值,固然也能够获取设置的停用词 stop_words。
举个例子,假设咱们有 4 个文档:
文档 1:this is the bayes document;
文档 2:this is the second second document;
文档 3:and the third one;
文档 4:is this the document。
如今想要计算文档里都有哪些单词,这些单词在不一样文档中的 TF-IDF 值是多少呢?
首先咱们建立 TfidfVectorizer 类:
1 from sklearn.feature_extraction.text import TfidfVectorizer
2 tfidf_vec = TfidfVectorizer()
而后咱们建立 4 个文档的列表 documents,并让建立好的 tfidf_vec 对 documents 进行拟合,获得 TF-IDF 矩阵:
1 documents = [
2     'this is the bayes document',
3     'this is the second second document',
4     'and the third one',
5     'is this the document'
6 ]
7 tfidf_matrix = tfidf_vec.fit_transform(documents)
输出文档中全部不重复的词:
1 print('不重复的词:', tfidf_vec.get_feature_names())

运行结果正则表达式

1 不重复的词: ['and', 'bayes', 'document', 'is', 'one', 'second', 'the', 'third', 'this']
输出每一个单词对应的 id 值:
1 print('每一个单词的 ID:', tfidf_vec.vocabulary_)
运行结果
1 每一个单词的 ID: {'this': 8, 'is': 3, 'the': 6, 'bayes': 1, 'document': 2, 'second': 5, 'and': 0, 'third': 7, 'one': 4}
输出每一个单词在每一个文档中的 TF-IDF 值,向量里的顺序是按照词语的 id 顺序来的:
1 print('每一个单词的 tfidf 值:', tfidf_matrix.toarray())
运行结果:
1 每一个单词的 tfidf 值: [[0.         0.63314609 0.40412895 0.40412895 0.         0.
2   0.33040189 0.         0.40412895]
3 [0.         0.         0.27230147 0.27230147 0.         0.85322574
4   0.22262429 0.         0.27230147]
5 [0.55280532 0.         0.         0.         0.55280532 0.
6   0.28847675 0.55280532 0.        ]
7 [0.         0.         0.52210862 0.52210862 0.         0.
8   0.42685801 0.         0.52210862]]
 
5、 如何对文档进行分类
若是咱们要对文档进行分类,有两个重要的阶段:
1.基于分词的数据准备 ,包括分词、单词权重计算、去掉停用词;
2.应用朴素贝叶斯分类进行分类 ,首先经过训练集获得朴素贝叶斯分类器,而后将分类器应用于测试集,并与实际结果作对比,最终获得测试集的分类准确率。
下面,我分别对这些模块进行介绍。
 
模块 1:对文档进行分词
在准备阶段里,最重要的就是分词。那么若是给文档进行分词呢?英文文档和中文文档所使用的分词工具不一样。
在英文文档中,最经常使用的是 NTLK 包。NTLK 包中包含了英文的停用词 stop words、分词和标注方法。
1 import nltk
2 word_list = nltk.word_tokenize(text) # 分词
3 nltk.pos_tag(word_list) # 标注单词的词性
在中文文档中,最经常使用的是 jieba 包。jieba 包中包含了中文的停用词 stop words 和分词方法。
import jieba
word_list = jieba.cut (text) # 中文分词
 
模块 2:加载停用词表
咱们须要本身读取停用词表文件,从网上能够找到中文经常使用的停用词保存在 stop_words.txt,而后利用 Python 的文件读取函数读取文件,保存在 stop_words 数组中。
1 stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]
 
模块 3:计算单词的权重
这里咱们用到 sklearn 里的 TfidfVectorizer 类,上面咱们介绍过它使用的方法。
直接建立 TfidfVectorizer 类,而后使用 fit_transform 方法进行拟合,获得 TF-IDF 特征空间 features,你能够理解为选出来的分词就是特征。咱们计算这些特征在文档上的特征向量,获得特征空间 features。
1 tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5)
2 features = tf.fit_transform(train_contents)
这里 max_df 参数用来描述单词在文档中的最高出现率。假设 max_df=0.5,表明一个单词在 50% 的文档中都出现过了,那么它只携带了很是少的信息,所以就不做为分词统计。
通常不多设置 min_df,由于 min_df 一般都会很小。
 
模块 4:生成朴素贝叶斯分类器
咱们将特征训练集的特征空间 train_features,以及训练集对应的分类 train_labels 传递给贝叶斯分类器 clf,它会自动生成一个符合特征空间和对应分类的分类器。
这里咱们采用的是多项式贝叶斯分类器,其中 alpha 为平滑参数。为何要使用平滑呢?由于若是一个单词在训练样本中没有出现,这个单词的几率就会被计算为 0。但训练集样本只是总体的抽样状况,咱们不能由于一个事件没有观察到,就认为整个事件的几率为 0。为了解决这个问题,咱们须要作平滑处理。
当 alpha=1 时,使用的是 Laplace 平滑。Laplace 平滑就是采用加 1 的方式,来统计没有出现过的单词的几率。这样当训练样本很大的时候,加 1 获得的几率变化能够忽略不计,也同时避免了零几率的问题。
当 0<alpha<1 时,使用的是 Lidstone 平滑。对于 Lidstone 平滑来讲,alpha 越小,迭代次数越多,精度越高。咱们能够设置 alpha 为 0.001。
# 多项式贝叶斯分类器
1 from sklearn.naive_bayes import MultinomialNB  
2 clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
 
模块 5:使用生成的分类器作预测
首先咱们须要获得测试集的特征矩阵。
方法是用训练集的分词建立一个 TfidfVectorizer 类,使用一样的 stop_words 和 max_df,而后用这个 TfidfVectorizer 类对测试集的内容进行 fit_transform 拟合,获得测试集的特征矩阵 test_features。
1 test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary)
2 test_features=test_tf.fit_transform(test_contents)
 
而后咱们用训练好的分类器对新数据作预测。
方法是使用 predict 函数,传入测试集的特征矩阵 test_features,获得分类结果 predicted_labels。predict 函数作的工做就是求解全部后验几率并找出最大的那个。
1 predicted_labels=clf.predict(test_features)
 
模块 6:计算准确率
计算准确率其实是对分类模型的评估。咱们能够调用 sklearn 中的 metrics 包,在 metrics 中提供了 accuracy_score 函数,方便咱们对实际结果和预测的结果作对比,给出模型的准确率。
使用方法以下:
1 from sklearn import metrics
2 print metrics.accuracy_score(test_labels, predicted_labels)
 
搜索关注微信公众号“程序员姜小白”,获取更新精彩内容哦。
相关文章
相关标签/搜索