机器学习基础算法(3)

首页 » 算法 » 正文

3、朴素贝叶斯算法

贝叶斯学派的思想可以概括为先验概率+数据=后验概率。也就是说我们在实际问题中需要得到的后验概率,可以通过先验概率和数据一起综合得到。数据大家好理解,被频率学派攻击的是先验概率,一般来说先验概率就是我们对于数据所在领域的历史经验,但是这个经验常常难以量化或者模型化,于是贝叶斯学派大胆的假设先验分布的模型,比如正态分布,beta分布等。这个假设一般没有特定的依据,因此一直被频率学派认为很荒谬。虽然难以从严密的数学逻辑里推出贝叶斯学派的逻辑,但是在很多实际应用中,贝叶斯理论很好用,比如垃圾邮件分类,文本分类。

3.1 贝叶斯决策论

贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

具体来说,若我们决策的目标是最小化分类错误率,贝叶斯最优分类器要对每个样本 x,选择能使后验概率 P( c | x )最大的类别 c 标记。在现实任务中后验概率通常难以直接获得。从这个角度来说,机器学习所要实现的是基于有限的训练样本集尽可能准确地估计出后验概率 P( c | x )。大体来说,主要有两种策略:给定x,可通过直接建模P( c | x )来预测c,这样得到的是“判别式模型”,例如,决策树、BP神经网络、支持向量机等等;也可先对联合概率分布P( x,c )建模,然后在由此获得P( c | x ),这样得到的是“生成式模型”。对于生成式模型来说,必然考虑

机器学习基础算法(3)

基于贝叶斯定理, P( c | x )可写为

机器学习基础算法(3)

 这就将求后验概率P(c|x)的问题转变为求类先验概率P(c)和条件概率P(x|c)。

类先验概率 P(c) 表达了样本空间中各类样本所占的比例,根据大数定律,当训练集包含充足的独立同分布样本时,P(c) 可通过各类样本出现的频率来进行估计。

因为对于类条件概率 P( x | c ) 来说,由于它涉及关于 x 所有属性的联合概率,直接根据样本出现的频率来估计将会遇到严重的困难。假如样本的d个属性都是二值的,则样本空间将有2的d次方种可能取值,在现实中,这个种类数往往大于训练样本,也就是说,很多样本取值在训练集中根本没有出现,直接使用频率来估计 P( x | c )显然不可行,因为“未被观测到”与“出现概率为零”通常是不同的。这可以通过极大似然估计来解决。

3.2 朴素贝叶斯分类器

3.2.1 朴素贝叶斯分类的原理与流程

朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。通俗来说,就好比这么个道理,你在街上看到一个黑人,我问你你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?因为黑人中非洲人的比率最高,当然人家也可能是美洲人或亚洲人,但在没有其它可用信息下,我们会选择条件概率最大的类别,这就是朴素贝叶斯的思想基础。

朴素贝叶斯分类的正式定义如下:

1、设机器学习基础算法(3)为一个待分类项,而每个a为x的一个特征属性。

2、有类别集合机器学习基础算法(3)

3、计算机器学习基础算法(3)

4、如果机器学习基础算法(3),则机器学习基础算法(3)

那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

2、统计得到在各类别下各个特征属性的条件概率估计。即机器学习基础算法(3)

 3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

机器学习基础算法(3)

 因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

机器学习基础算法(3)

 根据上述分析,朴素贝叶斯分类的流程可以由下图表示(暂时不考虑验证):

机器学习基础算法(3)

  可以看到,整个朴素贝叶斯分类分为三个阶段:

第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。

第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。

第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

3.2.2 估计类别下特征属性划分的条件概率及Laplace校准

由上文看出,计算各个划分的条件概率P(a|y)是朴素贝叶斯分类的关键性步骤,当特征属性为离散值时,只要很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),下面重点讨论特征属性是连续值的情况。

当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即:

机器学习基础算法(3)

机器学习基础算法(3)

因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。均值与标准差的计算在此不再赘述。

另一个需要讨论的问题就是当P(a|y)=0怎么办,当某个类别下某个特征项划分没有出现时,就是产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。

3.2.3 朴素贝叶斯分类器举例

机器学习基础算法(3)

 结果:

机器学习基础算法(3)

 思考:属于某个类别为0,合适吗?

从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面 有很多出现次数都为0,很可能计算结果都为零。

解决方法:拉普拉斯平滑系数

机器学习基础算法(3)

α为指定的系数一般为1,m为训练文档中统计出的特征词个数

3.3 sklearn实现朴素贝叶斯

 API:sklearn.naive_bayes.MultinomialNB

机器学习基础算法(3)

 案例:此处以sklearn中fetch_20newsgroups的20类新闻分类为案例。20个新闻组数据集包含20个主题的18000个新闻组帖子。

朴素贝叶斯案例流程:

机器学习基础算法(3)

 代码如下:

from sklearn.datasets import load_iris, fetch_20newsgroups, load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
import pandas as pd

def naviebayes():
    """
    朴素贝叶斯进行文本分类
    :return: None
    """
    news = fetch_20newsgroups(subset='all')

    # 进行数据分割
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)

    # 对数据集进行特征抽取
    tf = TfidfVectorizer()

    # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
    x_train = tf.fit_transform(x_train)
    # print(tf.get_feature_names())

    x_test = tf.transform(x_test)

    # 进行朴素贝叶斯算法的预测
    mlt = MultinomialNB(alpha=1.0)
    # print(x_train.toarray())

    mlt.fit(x_train, y_train)

    y_predict = mlt.predict(x_test)

    print("预测的文章类别为:", y_predict)

    # 得出准确率
    print("准确率为:", mlt.score(x_test, y_test))

    print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))

    return None

if __name__ == "__main__":
    naviebayes()

3.4 朴素贝叶斯总结

优点:

(1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

(2)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

(3)分类准确度高,速度快

缺点:

需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验 模型的原因导致预测效果不佳。

拜师教育学员文章:作者:2546-郑同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《机器学习基础算法(3)》 发布于2022-01-20

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录