朴素贝叶斯算法及其实战

1.概率:

      随机事件发生的可能性

2.定义

 贝叶斯方法

    贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主观偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。 [2] 

朴素贝叶斯算法

    朴素贝叶斯算法(Naive Bayesian algorithm) 是应用最为广泛的分类算法之一。

    朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。虽然这个简化方式在一定程度上降低了贝叶斯分类算法的分类效果,但是在实际的应用场景中,极大地简化了贝叶斯方法的复杂性。

    首先给出贝叶斯公式:
    换成分类任务的表达式:
     我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

     则,朴素贝特斯公式为:

3.结合具体实例理解

  数据:

现在给我们的问题是,如果一对男女朋友,男生想女生求婚,男生的四个特点分别是不帅,性格不好,身高矮,不上进,请你判断一下女生是嫁还是不嫁?

扫描二维码关注公众号,回复: 8615206 查看本文章

这是典型的二分类问题,按照朴素贝叶斯的求解,转换为P(嫁|不帅、性格不好、矮、不上进)和P(不嫁|不帅、性格不好、矮、不上进)的概率,最终选择嫁与不嫁的答案。

这里我们根据贝特斯公式:

由此,我们将(嫁|不帅、性格不好、矮、不上进)转换成三个可求的P(嫁)、P(不帅、性格不好、矮、不上进|嫁)、P(不帅、性格不好、矮、不上进)。进一步分解可以得:
     P(不帅、性格不好、矮、不上进)=P(嫁)P(不帅|嫁)P(性格不好|嫁)P(矮|嫁)P(不上进|嫁)+P(不嫁)P(不帅|不嫁)P(性格不好|不嫁)P(矮|不嫁)P(不上进|不嫁)。
    P(不帅、性格不好、矮、不上进|嫁)=P(不帅|嫁)P(性格不好|嫁)P(矮|嫁)P(不上进|嫁)

将上面的公式整理一下可得:

     P(嫁)=1/2、P(不帅|嫁)=1/2、P(性格不好|嫁)=1/6、P(矮|嫁)=1/6、P(不上进|嫁)=1/6。
     P(不嫁)=1/2、P(不帅|不嫁)=1/3、P(性格不好|不嫁)=1/2、P(矮|不嫁)=1、P(不上进|不嫁)=2/3
 但是由贝叶斯公式可得:对于目标求解为不同的类别,贝叶斯公式的分母总是相同的。所以,只求解分子即可:

    于是,对于类别“嫁”的贝叶斯分子为:P(嫁)P(不帅|嫁)P(性格不好|嫁)P(矮|嫁)P(不上进|嫁)=1/2 * 1/2 * 1/6 * 1/6 * 1/6=1/864     
对于类别“不嫁”的贝叶斯分子为:P(不嫁)P(不帅|不嫁)P(性格不好|不嫁)P(矮|不嫁)P(不上进|不嫁)=1/2 * 1/3 * 1/2 * 1* 2/3=1/18。
经代入贝叶斯公式可得:P(嫁|不帅、性格不好、矮、不上进)=(1/864) / (1/864+1/18)=1/49=2.04%
P(不嫁|不帅、性格不好、矮、不上进)=(1/18) / (1/864+1/18)=48/49=97.96%
则P(不嫁|不帅、性格不好、矮、不上进) > P(嫁|不帅、性格不好、矮、不上进),则该女子选择不嫁!

 4. 引子:

                        

      根据前面推算公式可直接求:

科技:
    P(科技|影院,支付宝,云计算) = P(影院,支付宝,云计算|科技)*P(科技)
             =(8/100)*(20/100)*(63/100)*(30/90)
             = 126 / 37500
             ≈ 0.0036
 娱乐:
      P(娱乐|影院,支付宝,云计算) = P(影院,支付宝,云计算|娱乐)*P(娱乐)
             = (56/232)*(25/122)*(0/121)*(60/90)
             = 0 

从公式和结果中,可以看出属于娱乐的概率为,具有不合理性,因此引入拉普拉斯平滑系数

         

 5.Python中朴素贝叶斯算法API

sklearn.naive_bayes.MultinomialNB(alpha=1.0)
    .朴素贝叶斯分类
    .alpha 拉普拉斯平滑系数

6.实战:对sklearn数据集中20类新闻数据分类

其中:该数据集包含20个新闻类别及18000条新闻数据

from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
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() #实例化
    x_train = tf.fit_transform(x_train)#以训练集单重的词的列表进行每篇文章重要性统计
    x_test = tf.transform(x_test)

    #进行朴素贝叶斯算法的预测
    mlt = MultinomialNB(alpha=1)
    mlt.fit(x_train,y_train)
    y_predict = mlt.predict(x_test)

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

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


    return None

if __name__ == "__main__":
    naviebayes()

分类结果及预算正确率:

预测出的文章类别为: [15  9  9 ...  1 11 17]
准确率为: 0.8527164685908319

根据公式可知,不存在调参的算法优化, 唯一影响预测结果的因素: 训练集数据的准确性

7.分类模型评估

       正确率:estimator.score():即预测结果的正确百分比
       精确率(Precision): 预测结果为正例样本中真实为正例的比例(查得准)
       召回率(Recall):真实为正例样本中预测结果为正例的比例(查得全,对正样本的区分能力)
        API:
            sklearn.metrics.classification_report
        使用:
            classification_report(y_true,y_pred,target_names= None)
                y_true:真实目标值
                y_pred:估计器预测目标值
                target_names:目标类别名称
                return : 每个类别精确率与召回率

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

打印精确率和召回率入下 

                             precision    recall  f1-score   support
             alt.atheism       0.90      0.77      0.83       195
           comp.graphics       0.91      0.79      0.84       240
 comp.os.ms-windows.misc       0.87      0.81      0.84       259
comp.sys.ibm.pc.hardware       0.64      0.89      0.75       219
   comp.sys.mac.hardware       0.93      0.83      0.88       240
          comp.windows.x       0.92      0.87      0.89       234
            misc.forsale       0.91      0.72      0.80       234
               rec.autos       0.92      0.90      0.91       258
         rec.motorcycles       0.95      0.97      0.96       250
      rec.sport.baseball       0.95      0.97      0.96       245
        rec.sport.hockey       0.93      0.98      0.95       242
               sci.crypt       0.83      0.97      0.90       264
         sci.electronics       0.95      0.80      0.87       253
                 sci.med       0.98      0.93      0.95       259
               sci.space       0.89      0.96      0.92       257
  soc.religion.christian       0.62      0.98      0.76       263
      talk.politics.guns       0.76      0.97      0.85       233
   talk.politics.mideast       0.93      0.97      0.95       239
      talk.politics.misc       1.00      0.63      0.77       180
      talk.religion.misc       0.98      0.28      0.44       148
             avg / total       0.89      0.87      0.86      4712

 *注:每次结果不一样,因为样本随机分,词语也是,导致结果稍微有偏差。

8.朴素贝叶斯分类优缺点:

     优点
    (1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
    (2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
    (3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  缺点
    (1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
    (2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
    (3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
    (4)对输入数据的表达形式很敏感。

文章参考链接:

https://baike.baidu.com/item/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF/4925905?fr=aladdin 

朴素贝叶斯算法的理解与实现 

带你彻彻底底搞懂朴素贝叶斯公式

某机构视频

发布了128 篇原创文章 · 获赞 95 · 访问量 35万+

猜你喜欢

转载自blog.csdn.net/qq_36853469/article/details/103467822