机器学习06:朴素贝叶斯算法

朴素贝叶斯的思想如下:
假设我们有四篇文章,三个类别,要判断每一篇文章属于哪一种类别,这种算法是将文章属于每一种概率的类别计算出来,并且判断它属于哪一种类别的概率最大,那么它就属于这个类别
在这里插入图片描述
先介绍一下与概率有关的内容
概率定义为一件事情发生的可能性

联合概率:包含多个条件,且所有条件同时成立的概率
记作:P(A,B)或P(AB)
P(A,B) = P(A)P(B)
在这里插入图片描述
上表中职业是程序员并且体型匀称的概率是多少?
P(程序员, 匀称) = (3/7)*(4/7) = 12/49

条件概率:事件A在事件B已经发生条件下的发生概率,记作P(A|B)
P(A|B) = P(AB)
特性:P(A1,A2|B)=P(A1 |B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果
(互相独立:A1,A2不互相影响)
朴素贝叶斯的"朴素",就是特征相互独立的意思
上表中,在女神喜欢的条件下,职业是产品,体重是超重的概率?
P(产品,超重|喜欢)= P(产品|喜欢)P(超重|喜欢)= (1/2)*(1/4)=1/8

当朴素贝叶斯用于实现文章分类时,大致的方法如下:

朴素贝叶斯的公式为:
在这里插入图片描述
其中W为给定文档的特征值(频数统计,预测文档提供),C为文档类别
公式可以理解为:
在这里插入图片描述
其中C可以是不同类别

分别看一下公式的组成部分
例如当拿到一篇文章,这篇文章包含词1,词2,词3…求这篇文章所属各个类别的概率,公式中分为三个部分:
①P( C):
每个文档类别的概率(某文档类别词数/总文档词数)
②P(W|C):
给定类别下特征(被预测文档中出现的词)的概率
计算方法:P(F1|C)=Ni/N(训练文档中去计算)
Ni为该F1词在c类别所有文档中出现的次数
N为所属类别C下的文档所有词出现的次数和
③P(F1, F2, F3…)

显然对于同一篇文章,③是不影响概率的比较的,因此我们比较P( C)P(W|C)即可
来看一个例子
在这里插入图片描述
现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
科技:P(影院,支付宝,云计算|科技)*P(科技)=
在这里插入图片描述
娱乐:P(影院,支付宝,云计算|娱乐)*P(娱乐)=
在这里插入图片描述
因此最终我们预测该文章为科技

但是我们注意到一个问题,刚才的例子我们计算出某一篇文章属于娱乐分类的概率为0,这并不合理,因为如果词频列表里面有很多出现次数都为0,那么很可能计算结果都为0,如何解决这个问题呢?
那我们就需要用到拉普拉斯平滑系数
在这里插入图片描述
α为指定的系数一般为1,m为训练文档中统计出的特征词个数,这样就保证概率不为0,刚才的式子就变成
(56+1/121+14)(15+1/121+14)(0+1/121+1*4)(60/90) = 0.001

API:sklearn. naive_bayes. MultinomialNB(alpha = 1.0)

# -*- coding: utf-8 -*-
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
"""
sklearn20类新闻分类
20个新闻组数据集包含20个主题的18000个新闻组帖子
"""


def naviebayes():
    """
    朴素贝叶斯进行文本分类
    :return:
    """
    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)
    x_test = tf.transform(x_test)
    # 进行朴素贝叶斯算法的预测
    # alpha选取默认的1.0即可
    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))


if __name__ == '__main__':
    naviebayes()

朴素贝叶斯分类优缺点
优点:
·朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快
缺点:
·需要知道先验概率P(F,2,…C),因此在某些时候会由于假设的先验模型的原因导致预测效果不佳

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值