Fork me on GitHub

分类算法之朴素贝叶斯算法

一、朴素贝叶斯概述

   之前通过k-近邻算法来进行电影的分类,但是此种方法易受异常点的干扰,本质是通过欧式距离来进行类别的判断,而朴素贝叶斯则是将预测电影属于每一个类别的概率计算出来,从而判断最有可能属于的类别。

该算法常用于垃圾邮件的分类以及文章分类。例如:

上面确定一篇文章究竟是属于科技、金融还是娱乐。那么需要计算出该篇文章在每一个类别下的概率,然后再进行分类。

二、概率基础

(一)联合概率

包含多个条件,且每个条件同时成立的概率。记作:P(A,B)=P(A)*P(B)

(二)条件概率

事件A在事件B已经发生的条件下发生的概率。记作:P(A|B)

三、朴素贝叶斯

(一)公式

\[P(C|W) = \frac{{P(W|C)*P(C)}}{{P(W)}}\]

其中:

W为给定文档的特征值(频数统计,预测文档给定)

C为文档类型

公式可以理解为:

\[P(C|{F_1},{F_2},...) = \frac{{P(W|{F_1},{F_2},...)*P(C)}}{{P({F_1},{F_2},...)}}\]

其中C可以是不同类别。

上面的公式可以分成三个部分去理解:

  • P(C)每个文档类别的概率(某文档类别词数/总文档词数)
  • P(W|C)给定类别下特征(被预测文档中出现的词)的概率

     其中:
    𝑃(F1│C)=𝑁𝑖/𝑁 (训练文档中去计算)
    𝑁𝑖为该F1词在C类别所有文档中出现的次数
    N为所属类别C下的文档所有词出现的次数和

  • P(F1,F2,…) 预测文档中每个词的概率

(二)实例

特征\统计

科技

娱乐

汇总(求和)

“商场”

9

51

60

“影院”

8

56

64

“支付宝”

20

15

35

“云计算”

63

0

63

汇总(求和)

100

121

221

现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?

科技:𝑃(影院,支付宝,云计算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109
娱乐:𝑃(影院,支付宝,云计算│娱乐)∗P(娱乐)=56/121∗15/121∗0/121∗(121/221)=0 

你可以发现娱乐分类计算出的概率是0,这样显然是不合适的,所以需要引入一个系数来防止这种情况的产生。

(三)拉普拉斯平滑

\[P({F_1}|C) = \frac{{Ni + \sigma }}{{N + \sigma m}}\]

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

(四)sklearn朴素贝叶斯实现

 1、sklearn.naive_bayes.MultinomialNB(alpha = 1.0)

  •  朴素贝叶斯分类
  • alpha拉普拉斯平滑系数

2、算法案例

  • 描述

  sklearn中20类新闻分类

  • 案例流程

  (1)加载20类新闻数据,并进行分割

  (2)生成文章特征词

  (3)朴素贝叶斯estimator流程进行预估

  • 源码说明
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB


def naive_bytes():
    """
    朴素贝叶斯进行文本分类
    :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)
    print(tf.get_feature_names())  #特征值
    x_test = tf.transform(x_test)

    #进行朴素贝叶斯算法预测
    mlt = MultinomialNB(alpha=1.0)
    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__':
    naive_bytes()

(五)朴素贝叶斯的优缺点

1、优点

  • 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
  • 分类准确度高,速度快

 2、缺点

由于事先假设样本属性是相互独立的,所以对于属性有关联的样本预测效果并不好。

 

 

 

 

 

 

posted @ 2020-06-15 23:10  iveBoy  阅读(497)  评论(0编辑  收藏  举报
TOP