text.html 5.8 KB
Newer Older
ToTensor's avatar
ToTensor 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
 
<p class="content">朴素贝叶斯(Naive Bayes)这一算法的名字也有点奇怪。其中,“朴素”的英文“naive”的意思实际上是“天真的”,其原意大概是说算法有很多的预设(assumption),因此会给人一种考虑问题不周全的感觉。其实,这个算法本身是相当高效实用的。它是一个通过条件概率进行分类的算法。所谓条件概率,就是在事件<span class="italic">A</span>发生的概率下<span class="italic">B</span>发生的概率。例如,男生(事件<span class="italic">A</span>)是烟民(事件<span class="italic">B</span>)的概率为30%,女生(事件<span class="italic">A</span>)是烟民(事件<span class="italic">B</span>)的概率为5%。这些事件<span class="italic">A</span>就是“已发生的事件”,也就是所谓“预设”,也就是条件。</p> 
<p class="content">那么如何把条件概率引入机器学习呢?可以这么理解:数据集中数据样本的特征就形成了条件事件。比如:男,80岁,血压150mm Hg,这3个已发生的事件,就是样本已知的特征。下面就需要进行二分类,确定患病还是未患病。此时我们拥有的信息量不多,怎么办呢?看一下训练数据集中满足这3个条件的数据有多少个,然后计算概率和计算分布。假如还有3个同样是80岁的男人,血压也是150mm Hg,两个有心脏病,一个健康。此时算法就告诉我们,应该判断这个人也有心脏病的概率比较大。如果没有其他血压读数刚好是150的人呢?那就看看其他80岁的男人。如果10个人里面6个人都有心脏病,我们也只好推断此人有心脏病。</p> 
<p class="content">这就是朴素贝叶斯的基本原理。它会假设每个特征都是相互独立的(这就是一个很强的预设),然后计算每个类别下的各个特征的条件概率。条件概率的公式如下:</p> 
<div class="bodyPic_104"> 
 <img src="http://csdn-ebook-resources.oss-cn-beijing.aliyuncs.com/images/b88b00f6ad14402ea66695d6809614da/figure-0273-0370.jpg"> 
</div> 
<p class="content">在机器学习实践中,可以将上面的公式拆分成多个具体的特征:</p> 
<div class="bodyPic_104"> 
 <img src="http://csdn-ebook-resources.oss-cn-beijing.aliyuncs.com/images/b88b00f6ad14402ea66695d6809614da/figure-0273-0371.jpg"> 
</div> 
<p class="content">公式解释如下。</p> 
<p class="content"><span class="italic">c</span><span class="sub">k</span>,代表的是分类的具体类别<span class="italic">k</span></p> 
<p class="content"><span class="italic">P</span><span class="italic">c</span>|<span class="italic">x</span>)是条件概率,也就是所要计算的,当特征为x时,类别为<span class="italic">c</span>的概率。</p> 
<p class="content"><span class="italic">P</span><span class="italic">x</span>|<span class="italic">c</span>)叫作似然(likelihood),就是训练集中标签分类为<span class="italic">c</span>的情况下,特征为<span class="italic">x</span>的概率。比如,在垃圾电子邮件中,文本中含有“幸运抽奖”这个词的概率为0.2,换句话说,这个“0.2”也就是“幸运抽奖”这个词出现在垃圾电子邮件中的似然。</p> 
<p class="content"><span class="italic">P</span><span class="italic">c</span>),是训练集中分类为<span class="italic">C</span>的先验概率。比如,全部电子邮件中,垃圾电子邮件的概率为0.1。</p> 
<p class="content"><span class="italic">P</span><span class="italic">x</span>),是特征的先验概率。</p> 
<p class="content_105">小冰突然说道:“你这两个公式不大一样啊,第二个公式没有<span class="italic">P</span><span class="italic">x</span>)了。”</p> 
<p class="content_105">咖哥说:“在实践中,这个分母项在计算过程中会被忽略。因为这个<span class="italic">P</span><span class="italic">x</span>),不管它的具体值多大,具体到一个特征向量,对于所有的分类<span class="italic">c</span>来说,这个值其实是固定的—并不随<span class="italic">c</span><span class="sub">k</span><span class="italic">K</span>值的变化而改变。因此它是否存在,并不影响一个特定数据样本的归类。机器最后所要做的,只是确保所求出的所有类的后验概率之和为1。这可以通过增加一个归一化参数而实现。”</p> 
<p class="content">下面咱们就使用朴素贝叶斯算法来解决心脏病的预测问题:</p> 
<div class="content_106"> 
 <p class="content_105">from sklearn.naive_bayes import Gaussian NB # 导入朴素贝叶斯模型</p> 
 <p class="content_105">nb = Gaussian NB()</p> 
 <p class="content_105">nb.fit(X_train, y_train)</p> 
 <p class="content_105">y_pred = nb.predict(X_test) # 预测心脏病结果</p> 
 <p class="content_105">nb_acc = nb.score(X_test, y_test)*100</p> 
 <p class="content_105">print("NB预测准确率:: {:.2f}%".format(svm.score(X_test, y_test)*100))</p> 
 <p class="content_105">print("NB预测F1分数: {:.2f}%".format(f1_score(y_test, y_pred)*100))</p> 
 <p class="content_105">print('NB混淆矩阵:\n', confusion_matrix(y_pred, y_test))</p> 
</div> 
<p class="content">输出结果显示,采用默认值的情况下,预测准确率为86.89%:</p> 
<div class="content_113"> 
 <p class="content_109">NB预测准确率:: 86.89%</p> 
 <p class="content_109">NB预测F1分数: 88.24%</p> 
 <p class="content_109">NB混淆矩阵:</p> 
 <p class="content_110">[[23 4]</p> 
 <p class="content_110">[ 4 30]]</p> 
</div> 
<p class="content">效果还不错。基本上,朴素贝叶斯是基于现有特征的概率对输入进行分类的,它的速度相当快,当没有太多数据并且需要快速得到结果时,朴素贝叶斯算法可以说是解决分类问题的良好选择。</p>