机器学习算法原理与实践-朴素贝叶斯(文章迁移)


文章迁移说明:此文已由lightinglei于2019-02-18发布,是本人的另外一个账号,现同步迁移至本账号

一、朴素贝叶斯原理介绍

书籍上对概念的介绍,因引入了很多数学符号,看起来比较晦涩难懂,下面我们以案例的形式先带大家回顾下概率的一些基本知识点,下表为互联网行业不同岗位、不同体重是否会被女神喜欢(纯属虚构,哈哈~)

机器学习算法原理与实践-朴素贝叶斯(文章迁移)

先通过几个小问题回顾下知识点:

1)女生喜欢的概率:用P代表概率,“喜欢”占4个,“不喜欢”占3个,则P(喜欢)=4/7

2)职业是产品汪并且体型匀称的概率:样本总共7个,匀称的产品汪有2个,则P(产品汪,匀称)=2/7

3) 女生喜欢的条件下,职业是程序猿的概率:样本中满足女生“喜欢”的样本有4个,其中是程序猿的概率有2个,则:P(程序猿|喜欢)=1/2

4)女生喜欢的条件下,职业是程序猿,体重超重的概率:样本中满足女生“喜欢”的样本有4个,超重的程序猿只有1个,则:P(程序猿,超重|喜欢)=1/4

这时候再来认识联合概率、条件概率就好理解了,将P(产品汪,匀称)称之为联合概率,P(程序猿|喜欢)称之为条件概率,其具体定义如下:

联合概率:包含多个条件,且所有条件同时成立的概率,记为:P(A,B)

条件概率:事件A在另外一个时间B已经发生的条件下发生的概率,记为:P(A|B),如P(产品汪,超重|喜欢)也属于条件概率

还有一个知识点,在朴素贝叶斯中非常重要,就是特征的相互独立

相互独立:如果P(A,B)=P(A)*P(B),则称事件A和事件B相互独立,这是个充分必要条件,“朴素”一词就是在假定各个特征相互独立的条件下

接下来,再来解决这样一个问题,已知小王是产品汪,体重超重,是否会被女神喜欢?

通过前面的知识点,化成求解的目标为:P(喜欢|产品汪,超重),求解这个目标,就需要引入贝叶斯公式了,先来看下公式的具体定义:

贝叶斯公式

机器学习算法原理与实践-朴素贝叶斯(文章迁移)

其中,W为特征值(如职业、体重),C为类别(如女生是否喜欢),则:

机器学习算法原理与实践-朴素贝叶斯(文章迁移),P(喜欢)=4/7,则还需要求出P(产品汪,超重)和P(产品汪,超重|喜欢)

因表格训练集样本数量有限,不能直接求出P(产品汪,超重),朴素贝叶斯可解决这个问题,前面提到,“朴素”是特征相互独立的意思,而相互独立的特征的公式P(A,B)=P(A)*P(B)

因此,可将P(产品汪,超重)=P(产品汪)*P(超重)=2/7*3/7=6/49,

同理:P(产品汪,超重|喜欢)=P(产品汪|喜欢)*P(超重|喜欢)=1/2*1/4=1/8,假设前提:产品汪这个专业与体重超重无关

则P(喜欢|产品汪,超重)=7/12,从结论来看,超重的产品汪有超过一半的概率会被女生喜欢,与现实应该会存在差异(haha~~),出现的这样情况主要是因为两个原因,一个是训练样本量太少,还有一个是刚才的假设前提,事实上可能产品汪与体重超重并不独立,而我们强制假设独立成立,所以有时候会牺牲掉一定的分类准确率,这也是朴素贝叶斯的特点。

 注意:如果需要求P(运营喵|喜欢)的概率呢,由于样本少,则按照上表计算是0,与事实会有差异,为了解决这个问题,需要引入拉普拉斯平滑系数,以下为其详细定义:

拉普拉斯平滑系数:

机器学习算法原理与实践-朴素贝叶斯(文章迁移),a为指定的系数一般为1,m为训练集中不同职业的个数

则P(运营喵|喜欢)通过拉普拉斯系数变化后:

机器学习算法原理与实践-朴素贝叶斯(文章迁移)

二、朴素贝叶斯实践

本节采用scikit-learn库,其API为sklearn.naive_bayes.MultinomialNB(alpha=1.0),朴素贝叶斯分类,alpha为拉普拉斯平滑系数

以下案例为sklearn中的数据集,20newsgroups数据集是用于文本分类、文本挖据和信息检索研究的国际标准数据集之一。数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合

其算法实现流程为:获取数据集->特征工程->训练模型->模型评估

"""
date:2019.1.25
author:lightinglei
朴素贝叶斯学习总结:
1.贝叶斯公式:P(Y|X)=P(X|Y)P(Y)/P(X)
P(X|Y)=P(x1|Y)P(x2|Y)?P(xn|Y)
X:为特征向量,Y:类别
先验概率P(X):是指根据以往经验和分析得到的概率
后验概率P(Y|X):事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性大小
条件概率P(X|Y):在已知类别的情况下,出现特征值X的概率密度
朴素:特征相互独立,贝叶斯值的是贝叶斯公式,其朴素贝叶斯公式可以如下所示:
那么贝叶斯公式中P(X|Y)可写成 P(X|Y)=P(x1|Y)P(x2|Y)?P(xn|Y)
其中P(A,B)=P(A)*P(B)是A和B相互独立的充分必要条件
所以朴素贝叶斯公式也可生成:
P(Y|X)=P(x1|Y)P(x2|Y)?P(xn|Y)P(Y)/P(X)
2.优缺点分析:
1)优点:朴素贝叶斯来源于古典的数学理论,有稳定的分类效率;对缺失数据不太敏感,算法也比较简单,常用语文本分类;
分类准确度高,速度快
缺点:因假定特征之间是相互独立,若实际存在关联,则效果不好
"""
from sklearn.naive_bayes import GaussianNB 
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB #朴素贝叶斯
from sklearn.model_selection import GridSearchCV
def nb_news():
    # 1.获取数据
    news=fetch_20newsgroups(subset="all")
    # 2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(news.data,news.target)
    # 3.特征工程:文本特征抽取tf-idf
    transfer=TfidfVectorizer() #统计特征词出现的个数
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test)
    # 4.训练朴素贝叶斯模型
    estimator=MultinomialNB() # 实例化对象
    estimator.fit(x_train,y_train)#训练模型
    predict_y = estimator.predict(x_test)
    # 5. 模型评估
    print("测试集的预测值为:\n", predict_y)
    print("真实值与预测值的对比为:\n", y_test == predict_y)
    accuracy = estimator.score(x_test, y_test)  # 测试集在训练集上的准确率
    print("准确率为:\n", accuracy)

    return None

if __name__=="__main__":
    nb_news()542020373514432"""其运行结果为:测试集的预测值为: [10 17  9 ... 15 14  1]真实值与预测值的对比为: [ True  True  True ...  True  True  True]准确率为: 0.8542020373514432"""

三、总结

1.核心思想:“朴素”假定样本的特征相互独立,贝叶斯指的是贝叶斯公式

2.应用场景:由于文本之间相互独立,因此经常应用于文本分类,如垃圾邮件的分类等

3.优缺点分析

优点:

1)朴素贝叶斯来源于古典的数学理论,有稳定的分类效率;

2)对缺失数据不太敏感,算法也比较简单;

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

缺点:

1)需要计算概率值,若给定的样本太少,若未出现该条件,则效果不好;
2)因为假定的是样本与样本之间相互独立,若实际有依赖关系,则结果不准确。

相关推荐