监督学习之朴素贝叶斯原理与代码实现

朴素贝叶斯公式

在这里插入图片描述

  • “朴素”指的是不同特征间条件独立,即每个特征发生的概率互不影响。
  • C表示类别的集合,W是不同特征的集合。
  • P(C|W)表示,有W这些特征发生,属于C类别的概率。
  • P(W|C)表示,在C类别已经发生的情况下,W特征发生的概率。
  • P(C)表示在所有数据中,判定为C类别的概率。
  • P(W)表示在所有数据中,W特征发生的概率。
  • 朴素贝叶斯会根据特征计算属于每个类别的概率,概率最大的即为最终分类。

贝叶斯公式例题

为了方便理解贝叶斯公式,一起看一下下面的例题。
在这里插入图片描述
上面是在221篇文档中,统计出了科技类和娱乐类文档的关键词(也就是特征)及出现的次数。现有一篇文档,出现了”影院“、”支付宝“、”云计算“这几个关键词,使用贝叶斯公式求出此文档属于科技类还是娱乐类。

根据贝叶斯公式可得:
P(科技) = P(科技|影院,支付宝,云计算) = P(影院,支付宝,云计算|科技)*P(科技) / P(影院,支付宝,云计算)

P(娱乐) = P(娱乐|影院,支付宝,云计算) = P(影院,支付宝,云计算|娱乐)*P(娱乐) / P(影院,支付宝,云计算)
因为最终比较的是P(科技)和P(娱乐)的大小,两个算式分母相同,可以不计算。所以最终计算结果为:
P(科技) = P(影院,支付宝,云计算|科技)*P(科技) = (8/100) x (20/100) x (63/100) x (100/221) = 0.00456109
P(娱乐) = P(影院,支付宝,云计算|娱乐)*P(娱乐) = (56/121) x (15/121) x (0/121) x (121/221) = 0
所以最终的结果为科技类。

贝叶斯算法优化

在上面的例题中,我们可以看到,属于娱乐类的概率是0,这显然是不合理的。如果有多个特征出现的频率是0,那么可能就会出现多个类别的概率是0。为了避免这种情况,我们引入了拉普拉斯平滑系数
在这里插入图片描述
F1表示特征,C表示类别。α表示平滑系数,一般指定为1,Ni表示C类别中F1特征出现的次数,N表示C类别下所有特征出现的次数总和。

贝叶斯的使用

from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB

一般来说,如果样本特征的分布大部分是连续值使用GaussianNB会比较好。如果如果样本特征大部分是多元离散值使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB

代码实现:

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
from sklearn.metrics import classification_report


def bayes():
    # 加载数据,data_home指定数据下载地址
    news = fetch_20newsgroups(data_home=r'D:\学习资料\机器学习资料\fetch数据集', 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)
    # alpha即拉普拉斯平滑系数
    mlt = MultinomialNB(alpha=1.0)
    mlt.fit(x_train, y_train)
    y_predict = mlt.predict(x_test)
    print('准确率为:', mlt.score(x_test, y_test))
    print('精确率和召回率为:', classification_report(y_test, y_predict))
    return None


if __name__ == '__main__':
    bayes()

朴素贝叶斯优缺点

  • 基于古典数学理论,分类效率稳定。
  • 算法简单,对缺失数据不敏感,常用于文档分类
  • 分类准确度高,效率快。
  • 缺点:贝叶斯使用的前提是假设所有特征之间条件独立,如果特征之间有关联,会影响分类效果。
  • 注意使用朴素贝叶斯算法时,需要对文本类型的特征进行特征值化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值