机器学习之朴素贝叶斯方法(Naive Bayes)原理和实现

2023-10-28

目录

一、贝叶斯理论

二、实战朴素贝叶斯

实战朴素贝叶斯1

实战朴素贝叶斯3

三、scikit-learn中朴素贝叶斯的分类算法的适用

四、贝叶斯算法的优缺点


一、贝叶斯理论

贝叶斯模型
现在我们来看一下怎么操作。假设我有m个样本数据:

这大大的简化了n维条件概率分布的难度,虽然很粗暴,但是很给力。

 

 

二、实战朴素贝叶斯

实战朴素贝叶斯1

demo.py(朴素贝叶斯算法实例,预测新闻类别):

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
 
 
# 加载数据集 从scikit-learn官网下载新闻数据集(共20个类别)
news = fetch_20newsgroups(subset='all')  # all表示下载训练集和测试集
 
# 进行数据分割 (划分训练集和测试集)
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
 
# 对数据集进行特征抽取 (进行特征提取,将新闻文档转化成特征词重要性的数字矩阵)
tf = TfidfVectorizer()  # tf-idf表示特征词的重要性
# 以训练集数据统计特征词的重要性 (从训练集数据中提取特征词)
x_train = tf.fit_transform(x_train)
 
print(tf.get_feature_names())  # ["condensed", "condescend", ...]
 
x_test = tf.transform(x_test)  # 不需要重新fit()数据,直接按照训练集提取的特征词进行重要性统计。
 
# 进行朴素贝叶斯算法的预测
mlt = MultinomialNB(alpha=1.0)  # alpha表示拉普拉斯平滑系数,默认1
print(x_train.toarray())  # toarray() 将稀疏矩阵以稠密矩阵的形式显示。
'''
[[ 0.     0.          0.   ...,  0.04234873  0.   0. ]
 [ 0.     0.          0.   ...,  0.          0.   0. ]
 ...,
 [ 0.     0.03934786  0.   ...,  0.          0.   0. ]
'''
mlt.fit(x_train, y_train)  # 填充训练集数据
 
# 预测类别
y_predict = mlt.predict(x_test)
print("预测的文章类别为:", y_predict)  # [4 18 8 ..., 15 15 4]
 
# 准确率
print("准确率为:", mlt.score(x_test, y_test))  # 0.853565365025
 

实战朴素贝叶斯2

如下图中数值解释
13:因为垃圾邮件中所有单词出现了13次。

10:因为正常邮件中所有单词出现了10词。

15:垃圾和正常邮件组成的语料,字典的大小。

单词概率计算举例:(每一个人文本中单词出现的次数重复计算

实战朴素贝叶斯3

代码初始化:

import numpy  as np
def loadDataSet():#数据格式
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]#1 侮辱性文字 , 0 代表正常言论
    return postingList,classVec

def createVocabList(dataSet):#创建词汇表
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet | set(document) #创建并集
    return list(vocabSet)

def bagOfWord2VecMN(vocabList,inputSet):#根据词汇表,讲句子转化为向量
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec

训练:

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = np.ones(numWords);p1Num = np.ones(numWords)#计算频数初始化为1
    #p0Denom = 2.0;p1Denom = 2.0                  #拉普拉斯平滑,
    p0Denom = numWords ;p1Denom = numWords 
    for i in range(numTrainDocs):
        if trainCategory[i]==1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)#注意
    p0Vect = np.log(p0Num/p0Denom)#注意
    return p0Vect,p1Vect,pAbusive#返回各类对应特征的条件概率向量
                                 #和各类的先验概率

分类:

def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)#注意
    p0 = sum(vec2Classify * p0Vec) + np.log(1-pClass1)#注意
    if p1 > p0:
        return 1
    else:
        return 0

def testingNB():#流程展示
    listOPosts,listClasses = loadDataSet()#加载数据
    myVocabList = createVocabList(listOPosts)#建立词汇表
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(bagOfWord2VecMN(myVocabList,postinDoc))
    print(trainMat)
#     trainMat=np.array([np.array(x)for x in trainMat])
#     print(trainMat)
    print(trainMat[0])
    print(np.ones(len(trainMat[0]))+trainMat[0])
    print(type(trainMat[0]))
    print(type(np.ones(len(trainMat[0]))+trainMat[0]))
    p0V,p1V,pAb = trainNB0(trainMat,listClasses)#训练
    #测试
    testEntry = ['love','my','dalmation']
    thisDoc = bagOfWord2VecMN(myVocabList,testEntry)
    print (testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb))
testingNB()打印如下:
[[1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1]]
[1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[2. 1. 1. 2. 1. 2. 2. 1. 1. 1. 1. 1. 1. 2. 2. 1. 2. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1.]
<class 'list'>
<class 'numpy.ndarray'>
['love', 'my', 'dalmation'] classified as:  0

注意:上述代码中标有注意的地方,是公式中概率连乘变成了对数概率相加。此举可以在数学上证明不会影响分类结果,且在实际计算中,避免了因概率因子远小于1而连乘造成的下溢出。

Out[43]:np.log(np.ones(8)/4)

array([-1.38629436, -1.38629436, -1.38629436, -1.38629436, -1.38629436,
       -1.38629436, -1.38629436, -1.38629436])

三、scikit-learn中朴素贝叶斯的分类算法的适用

在scikit-learn中,一共有3个朴素贝叶斯的分类算法类。分别是GaussianNB,MultinomialNB和BernoulliNB。其中GaussianNB就是先验为高斯分布的朴素贝叶斯,MultinomialNB就是先验为多项式分布的朴素贝叶斯,而BernoulliNB就是先验为伯努利分布的朴素贝叶斯。这三个类适用的分类场景各不相同,一般来说,如果样本特征的分布大部分是连续值,使用GaussianNB会比较好。如果如果样本特征的分大部分是多元离散值,使用MultinomialNB比较合适。而如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB

四、贝叶斯算法的优缺点

朴素贝叶斯算法不需要调参,(K近邻和决策树需要调参),朴素贝叶斯受训练集的误差(特征词的提取,例如某篇文章有大量相同的词)影响较大。

优点:
    (1)朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
    (2)对小规模的数据表现很好,能个处理多分类任务,适合增量式训练,尤其是数据量超出内存时,我们可以一批批的去增量训练。
    (3)对缺失数据不太敏感,算法也比较简单,常用于文本分类。

                (4)分类准确率高、速度快。
缺点:
    (1)理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。
    (2)需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
    (3)由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
    (4)对输入数据的表达形式很敏感。

参考:https://blog.csdn.net/qiu_zhi_liao/article/details/90671932

相关参考:

机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现:机器学习笔记:朴素贝叶斯方法(Naive Bayes)原理和实现_Journey-Go的博客-CSDN博客_朴素贝叶斯方法

数据挖掘领域十大经典算法之—朴素贝叶斯算法:数据挖掘领域十大经典算法之—朴素贝叶斯算法(超详细附代码)_fuqiuai的博客-CSDN博客_朴素贝叶斯算法

机器学习实战之朴素贝叶斯--python/scikit-learn实现:机器学习实战之朴素贝叶斯--python/scikit-learn实现_金融科技自习生的博客-CSDN博客:

Naive Bayes for Text Classification:Naive Bayes for Text Classification - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习之朴素贝叶斯方法(Naive Bayes)原理和实现 的相关文章

随机推荐

  • 小朋友学机器人编程

    小朋友学机器人编程 很多的家长在培养孩子的学习方面可以说是相当的耐心的 他们会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于小朋友学机器人编程并不是很清楚 今天我们就一起来了解一下
  • 基于Java+Springboot+vue的幼儿园管理系统设计与实现(数据库,源码和教程)

    文章目录 一 效果演示 二 前言介绍 三 主要技术 四 系统设计 部分 4 1 主要功能模块设计 4 2 系统登录设计 五 运行截图 5 1 用户功能模块 5 1 1 个人信息 5 1 2 缴费信息管理 5 1 3 儿童体检管理 5 2 管
  • Python编程求出所有的3位水仙花数

    利用Python编程求出所有的3位水仙花数 sum 0 print 所有的3位水仙花数 for x in range 100 1000 定义x范围 low x 10 取余数即最低位的数 high x 100 取高的数 middle x 10
  • Datahub组成

    Datahub平台由下图所示的组件组成 元数据存储 元数据存储负责存储构成元数据图的实体和方面 这包括 公开用于引入元数据 按主键提取元数据 搜索实体和提取 实体 它由一个Spring Java服务组成 托管一组 Rest li API端点
  • 2020京东java面试笔试总结 (含面试题解析)

    本人5年开发经验 19年年底开始跑路找工作 在互联网寒冬下成功拿到阿里巴巴 今日头条 京东等公司offer 岗位是Java后端开发 因为发展原因最终选择去了京东 入职一年时间了 也成为了面试官 之前面试了很多家公司 感觉大部分公司考察的点都
  • 详解二分查找算法

    1 详解二分查找算法 我周围的人几乎都认为二分查找很简单 但事实真的如此吗 二分查找真的很简单吗 并不简单 看看 Knuth 大佬 发明 KMP 算法的那位 怎么说的 Although the basic idea of binary se
  • class-aware detector 和 class-agnostic detector

    For a class aware detector if you feed it an image it will return a set of bounding boxes each box associated with the c
  • C++ 链表遍历

    C 链表遍历 首先定义链表的结构 struct ListNode int val 存储数据 ListNode next next指针 ListNode val 0 next NULL 类似构造函数 ListNode int x val x
  • 内核调试方法 三

    目录 大海里的鱼有很多 而我们需要的是鱼钩一只 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 第一部分 基础知识 总纲 内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和
  • 国内可用的ChatGPT以及ChatGPT的工作流程(一文读懂ChatGPT)

    ChatGPT 介绍 国内可用的CHatGPT ChatGPT的工作流程 介绍 ChatGPT是由OpenAI公司开发的一种用于自然语言处理的语言模型 它是OpenAI旗下的GPT系列 Generative Pre trained Tran
  • 微信小程序用户登录功能无法使用

    背景 一个半年前的小程序项目了 最近一个用我项目的朋友说用户登录功能不能用了 小程序端 后端都没有报错 只有我开发时留下的 信息提示 我第一个反应就是微信小程序在今年三月份更新的接口 wx getUserProfile 但我都把方法改好了呀
  • git删除远程文件夹或文件

    1 操作一 预览将要删除的文件 如果不清楚该目录下是否存在不应该删除的文件 加上 n 这个参数 执行命令时 是不会删除任何文件 而是展示此命令要删除的文件列表预览 1 git rm r n cached 文件 文件夹名称 2 确定无误后删除
  • VGGNet简介及VGG13实现cifar100分类

    目录 VGGNet简介 VGGNet简介 VGG的创新之处 VGG的缺点 VGG13实现cifar100分类 cifar100 tensorflow实现VGG13 VGGNet简介 VGGNet简介 VGGNet由牛津大学计算机视觉组合和G
  • 2023电工杯数学建模B题思路分析

    文章目录 0 赛题思路 1 竞赛信息 2 竞赛时间 3 组织机构 4 建模常见问题类型 4 1 分类问题 4 2 优化问题 4 3 预测问题 4 4 评价问题 0 赛题思路 赛题出来以后第一时间在CSDN分享 1 竞赛信息 中国电机工程学会
  • NOIP中的数学--第8课 容斥原理(一)

    小学数学知识 容斥原理 容斥原理的题目都可以借助韦恩图这一工具来解决 并且非常快速与准确 一 关于两个集合的容斥原理 集合 A 与B 的并集的元素个数 等于集合 A 的元素个数与集合B 的元素个数的和 减去集合A 与 B 的交的元素个数 即
  • nn.AvgPool2d——二维平均池化操作

    PyTorch学习笔记 nn AvgPool2d 二维平均池化操作 torch nn AvgPool2d kernel size stride None padding 0 ceil mode False count include pad
  • 常见合并两个数组的方法

    数组合并方法 concat concat 方法合并数组不改变原数组 let arr1 1 3 4 5 let arr2 1 4 6 7 let result arr1 concat arr2 console log result 1 3 4
  • set实现返回小于给定值的数的个数

    使用pbds平衡树实现 头文件代码如下 for policy based data structures include
  • zookeeper报错Java Home Is Not Set

    安装zookeeper在网站上下载 https zookeeper apache org releases html 解压放在目录D bigdata 本文所用的目录 下 关于zookeeper以及kafka的目录 路径中最好不要出现空格 比
  • 机器学习之朴素贝叶斯方法(Naive Bayes)原理和实现

    目录 一 贝叶斯理论 二 实战朴素贝叶斯 实战朴素贝叶斯1 实战朴素贝叶斯3 三 scikit learn中朴素贝叶斯的分类算法的适用 四 贝叶斯算法的优缺点 一 贝叶斯理论 贝叶斯模型 现在我们来看一下怎么操作 假设我有m个样本数据 这大