03. 分类算法-朴素贝叶斯算法

1. 朴素贝叶斯算法的前提: 特征独立(有的时候说朴素指的就是“特征独立”)

  • 朴素贝叶斯中的“朴素”二字突出了这个算法的简易性。朴素贝叶斯的简易性表现该算法基于一个很朴素的假设:所有的变量都是相互独立的,假设各特征之间相互独立,各特征属性是条件独立的。

2. 联合概率

  • P(A,B) = P(A)P(B)

3. 条件概率

  • P(A|B) = P(AB) / P(B)
  • 特性:
    • P(A1,A2|B) = P(A1|B)P(A2|B)
    • 注意: 此条件概率的成立,是由于A1,A2相互独立

4. 文档分类

  • 公式

    • p(科技|词1, 词2, 词3,…) 文档1: 词1, 词2, 词3,…
    • p(娱乐|词a, 词b,…) 文档2:词a,词b,…
  • 朴素贝叶斯公式

    • P(C|W) = P(W|C)p© / P(W) 注: W为给定文档的特征值(频数统计, 预测文档提供), C为文档的类别, 也可以理解为:
    • P(C|F1,F2,…) = P(F1,F2,…|C) p© / P(F1,F2,…), 其中,C可以是不同的类别。
      • 公式解释:
        • P©:每个文档类别的概率(某文档类别数/ 总文档数量)
        • P(W|C):给定类别下特征(被预测文档中出现的次数)的概率
          • 计算方法: P(F1|C) = Ni / N (训练集文档中计算), Ni为该F1词在C类别所有文档中出现的次数, N为所属类别C下的文档所有词出现的次数和
        • P(F1,F2,…) : 预测文档中每个词的概率
  • 样例

    • 训练集统计结果(指定统计词频)
    特征\统计	科技30	娱乐60	汇总90(求和)
    “商场”	    9	    51	    60
    “影院”	    8	    56	    64
    “支付宝”	20	    15	    35
    “云计算”	63	    0	    63
    汇总(求和)	100	    121	    221
    
    • 现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
      • P(科技|影院,支付宝,云计算) = p(影院,支付宝,云计算|科技)P(科技) / P(影院,支付宝,云计算)
      • P(娱乐|影院,支付宝,云计算) = p(影院,支付宝,云计算|娱乐)P(娱乐) / P(影院,支付宝,云计算)
      • P(科技|影院,支付宝,云计算) = 8/100 * 20/100 * 63/100 * 30/90 = 0.00456
      • P(娱乐|影院,支付宝,云计算) = 56/121 * 15/121 * 0/121 * 60/90 = 0
  • 思考:求出娱乐的类别等于0,不合理

  • 拉普拉斯平滑系数
    P(F1|C) = (Ni + a) / (N + am), a指定的系数一般为1, m为训练文档中统计出的特征词个数

5. 朴素贝叶斯优缺点的分类

  • 优点

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

    • 假设了文章中一些词语和另外一些是独立没关系的,不太靠谱
    • 训练集当中去进行统计词这些工作, 有可能会对结果造成干扰
    • 神经网络比朴素贝叶斯的的效果要好
  • 代码实现

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

news = fetch_20newsgroups(data_home='/home/hadoop/fanjh/',subset='all')

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

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

# 以训练集当中的词的列表进行每篇文章重要性统计 ['one','two','three']
x_train = tf.fit_transform(x_train)

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))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值