朴素贝叶斯案例

一、朴素贝叶斯算法:

朴素贝叶斯算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法,基于贝叶斯后验概率建立的模型,它用于解决分类问题。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现简单,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。

它的主要思想是,通过历史数据,对每个类别建立经验概率公式,然后当新样本进来时,用各个类别的概率经验公式分别进行预测,最终,属于哪个类别的概率最大,就认为是哪个类别。

二、计算条件概率

朴素贝叶斯算法的核心内容即使贝叶斯公式,也就是计算特征在类别下的条件概率的计算,贝叶斯原理为,在已知发生B条件下,发生A的概率为:

P(A):为先验概率,即在B事件发生之前,对A事件发生概率的预判。

P(A|B):为后验概率,即在B事件发生之后,对A事件发生概率的重新评估。

P(B|A)/P(B):为可能性函数,是一个调整因子,使得预估概率更加接近真实概率。可以理解为:P(B)P(A∣B) = P(B∣A)P(A),即:发生B,且发生A = 发生A且发生B。

换个表达形式就会明朗很多,如下:

所以贝叶斯公式可以表示为:后验概率=先验概率 * 调整因子

三、预测精度的计算与评估

estimator.score():一般最常见使用的是准确率,即预测结果正确的百分比。

也可以使用召回率(Recall),真实为正例的样本中预测结果为正例的比例(查的全,对正样本的区分能力)

其他分类标准,F1-score,反映了模型的稳健型,F1值是准确率和召回率的调和平均数。

也可以使用分类模型评估API: sklearn.metrics.classification_report

sklearn.metrics.classification_report(y_true,y_pred,target_names=None)

  y_true:真实目标值

  y_pred:估计器预测目标值

  target_names:目标类别名称

  return:每个类别精确率与召回率

四、编程实现贝叶斯分类算法,并对简单应用样本数据实现预测分类

算法过程描述:

我们以西瓜的特征为变量,好坏质量为二元结果,准备数据如下:

定义一个名数组进行数据集的存储。数据集的每一行表示一个西瓜的属性,包括色泽、根蒂、敲击、纹理、脐部和触感。最后一行表示西瓜是好瓜还是坏瓜。

并且申请一个字典存放特征features(特征)的可能值,并为最终的二元结果申请一个列表标签 labels(标签)。

以上查看数据,即标签的分布比例。

from pprint import pprint
import numpy as np
dataset = np.array([# 色泽,根蒂,敲击,纹理,脐部,触感, 好坏['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '好瓜'],['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '好瓜'],['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '好瓜'],['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '好瓜'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '好瓜'],['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜'],['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '坏瓜'],['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '坏瓜'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '坏瓜'],['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '坏瓜'],['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '坏瓜'],['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '坏瓜'],['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '坏瓜'],['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '坏瓜']
])features = {'色泽': ['青绿', '乌黑', '浅白'],'根蒂': ['蜷缩', '稍蜷', '硬挺'],'敲击': ['浊响', '沉闷', '清脆'],'纹理': ['清晰', '稍糊', '模糊'],'脐部': ['凹陷', '稍凹', '平坦'],'触感': ['硬滑', '软粘']
}labels = ["好瓜", "坏瓜"]class Bayes:def __init__(self, features: dict, labels: list) -> None:self.features = featuresself.labels = labelsself.feature_classes = list(self.features.keys())self.condi_prob = {}self.prior_prob = {}self._statistic = {}self._samples = 0for i in self.labels:self.prior_prob[i] = 1 / len(self.labels)self.condi_prob[i] = {}self._statistic[i] = 0for j in self.feature_classes:self.condi_prob[i][j] = {}for k in self.features[j]:self.condi_prob[i][j][k] = 1 / len(self.features[j])self._statistic['.'.join([i, j, k])] = 0def bayes_prob(self, arr):plist = []for i in self.labels:idx = 0p = self.prior_prob[i]for j in self.feature_classes:p *= self.condi_prob[i][j][arr[idx]]idx += 1plist.append(p)return plistdef train(self, X, Y):rows, cols = X.shapefor i in range(rows):self._statistic[Y[i]] += 1for j in range(cols):self._statistic['.'.join([Y[i], self.feature_classes[j], X[i, j]])] += 1self._samples += 1for i in self.labels:self.prior_prob[i] = (self._statistic[i] + 1) / (self._samples+len(self.labels))for j in self.feature_classes:for k in self.features[j]:self.condi_prob[i][j][k] = (self._statistic['.'.join([i, j, k])] + 1) / (self._statistic[i] + len(self.features[j]))def predic(self, X):rows, cols = X.shaperes = []for i in range(rows):y = self.bayes_prob(X[i])res.append(y)res = np.argmax(res, axis=1)res = [self.labels[x] for x in res]return np.array(res)def show_params(self) -> str:pprint(self.prior_prob)pprint(self.condi_prob , sort_dicts=False)# pprint(self._statistic)if __name__ == "__main__":X = dataset[:, :6]Y = dataset[:, 6]print(X)print(Y)clf = Bayes(features, labels)clf.show_params()clf.train(X, Y)clf.show_params()Yp = clf.predic(X)print(f"原始:{Y}\n预测:{Yp}\n准确率:{np.sum(Y==Yp)/len(Y)}")

进行初始化,初始化函数来构建一个朴素贝叶斯分类器,接收两个参数:features和labels。

将features和labels分别赋值给实例变量,计算特征类的列表,并初始化self.condi_prob(条件概率)、self.prior_prob(先验概率)、self._statistic(统计信息)和self._samples(样本数量)。

函数遍历labels中的每个标签,并计算先验概率,遍历features中的每个特征,并初始化一个空字典,用于存储特征在标签下的条件概率。

函数遍历features中的每个特征和每个可能的特征值,并计算条件概率。同时,它将特征值与标签组合成一个字符串,并将其作为键添加到字典中,初始值为0。

接下来训练朴素贝叶斯分类器。

第一部分遍历所有样本,统计每个类别和每个特征值出现的次数。使用两个字典`_statistic`和`_samples`来存储这些统计信息。

第二部分计算先验概率和条件概率。先验概率是指在给定类别的情况下,某个特征值出现的概率。条件概率是指在给定某个特征值的情况下,某个类别出现的概率。使用贝叶斯公式来计算这些概率。

然后,准备计算贝叶斯的概率函数。初始化一个空列表,用于存储每个类别的贝叶斯概率。遍历类标签列表,对于每个类标签,计算先验概率。遍历特征类别列表,对于每个特征类别,计算条件概率。将计算出的条件概率乘以先验概率,并将结果添加到返回值列表中。

定义一个分类器, 申请一个空列表,用于存储每个样本的预测结果。调用前面我们提到的计算贝叶斯的概率函数方法计算当前行的概率分布。返回数组中每行的最大值的下标,即预测结果。最后将预测结果转换为对应的类别标签存储为一维数组。

在训练前后我们可以分别显示模型参数。打印两个字典,计算先验概率、条件概率,下图为训练前模型参数:

下图为训练后模型参数:

以下是模型的两次预测结果及准确率,趋于一致:

具体来说,原始的标签包括了17个样本,其中有8个属于"好瓜"类别,9个属于"坏瓜"类别。预测的结果与原始标签进行了比较,其中有14个样本的预测结果与原始标签一致,3个样本的预测结果与原始标签不一致。

根据比较结果计算得到的准确率为0.8235,召回率为0.875。这个准确率表明,贝叶斯算法在这个测试数据集上的分类表现较为良好,但仍有改进的空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/357790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07-appium常用操作

一、press_keycode 1)方法说明 press_keycode方法是appium的键盘相关函数,可以实现键盘的相关操作,比如返回、按键、音量调节等等。也可以使用keyevent方法,功能与press_keycode方法类似。 常见按键编码:https://www.…

FreeCAD中事务机制实现原理分析

1.基本实现思路 实现一个文件的撤销重做最简单的思想就是,在每个撤销重做节点处保存一份文件的内容,撤销重做时,分别替换对应节点处的文件内容即可。这种做法开销太大,每个节点处都需要保存一份完整的文档内容,每次撤…

Hadoop3:MapReduce中的Partition原理及自定义Partition

一、默认Partition分区配置 以WC案例来进行验证。 1、设置setNumReduceTasks 修改的代码 这行代码,确定了reduceTask的数量,也确定了分区逻辑 在mapper文件中,打上断点 计算分区的代码 这里会对每一个kv进行计算,然后&#…

【JavaEE】Spring Web MVC详解

一.基本概念. 1.什么是Spring Web MVC? 官方链接: https://docs.spring.io/spring-framework/reference/web/webmvc.html Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning…

浅析MySQL-基础篇01

目录 执行一条select语句,发生了什么? MYSQL执行流程是怎么样的? 第一步:连接器 第二步:查询缓存 第三步:解析SQL 解析器 第四步:执行SQL 预处理器 优化器 执行器 执行一条select语句…

hive on spark 记录

环境&#xff1a; hadoop 2.7.2 spark-without-hadoop 2.4.6 hive 2.3.4 hive-site.xml <property><name>hive.execution.engine</name><value>spark</value> </property> <property><name>spark.yarn.jars</name>&l…

【git1】指令,commit,免密

文章目录 1.常用指令&#xff1a;git branch查看本地分支&#xff0c; -r查看远程分支&#xff0c; -a查看本地和远程&#xff0c;-v查看各分支最后一次提交, -D删除分支2.commit规范&#xff1a;git commit进入vi界面&#xff08;进入前要git config core.editor vim设一下vi模…

不用写一行代码,deepseek结合腾讯云语音识别来批量转录Mp3音频

首先&#xff0c;打开window系统中的cmd命令行工具&#xff0c;或者powershell&#xff0c;安装腾讯云tencentcloud的Python库 pip install -i https://mirrors.tencent.com/pypi/simple/ --upgrade tencentcloud-sdk-python 然后&#xff0c;开通腾讯云的对象存储COS服务&…

超级好用的JSON格式化可视化在线工具

JSON是开发非常常用的一种报文格式&#xff0c;最常见的需求就是将JSON进行格式化&#xff0c;最好是有图形化界面显示结构关系&#xff0c;以便进行数据分析。 理想的在线JSON工具&#xff0c;应该支持快速格式化、可压缩、快捷复制、可下载导出&#xff0c;对存在语法错误的地…

计算机组成原理 —— 存储系统(DRAM和SRAM,ROM)

计算机组成原理 —— 存储系统&#xff08;DRAM和SRAM&#xff09; DRAM和SRAMDRAM的刷新DRAM地址复用ROM&#xff08;Read-Only Memory&#xff08;只读存储器&#xff09;&#xff09; 我们今天来看DRAM和SRAM&#xff1a; DRAM和SRAM DRAM&#xff08;动态随机存取存储器&…

【ajax基础】回调函数地狱

一&#xff1a;什么是回调函数地狱 在一个回调函数中嵌套另一个回调函数&#xff08;甚至一直嵌套下去&#xff09;&#xff0c;形成回调函数地狱 回调函数地狱存在问题&#xff1a; 可读性差异常捕获严重耦合性严重 // 1. 获取默认第一个省份的名字axios({url: http://hmaj…

具有 Hudi、MinIO 和 HMS 的现代数据湖

Apache Hudi 已成为管理现代数据湖的领先开放表格式之一&#xff0c;直接在现代数据湖中提供核心仓库和数据库功能。这在很大程度上要归功于 Hudi 提供了表、事务、更新/删除、高级索引、流式摄取服务、数据聚类/压缩优化和并发控制等高级功能。 我们已经探讨了 MinIO 和 Hudi…

【Python】从0开始的Django基础

Django框架基础 unit01一、Django基础1.1 什么是Django?1.2 安装与卸载1.2.1 Python与Django的版本1.2.2 安装1.2.3 查看Django版本1.2.4 卸载 二、Django项目2.1 概述2.2 创建项目2.3 启动项目2.4 项目的目录结构2.5 配置 三、URL 调度器3.2 定义URL路由3.2 定义首页的路由3.…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

android 在线程中更新界面

在Android中&#xff0c;你不能直接从子线程中更新UI&#xff0c;因为这会导致应用崩溃。你需要使用Handler或runOnUiThread()来更新UI。 使用Handler 以下是如何使用Handler在子线程中更新UI的示例&#xff1a; 1. 创建Handler实例&#xff1a; import android.os.Bundle;…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

数据可视化实验一:Panda数据处理及matplotlib绘图初步

目录​​​​​​​ 2024-6-17 一、请将所有含有发明家“吴峰”的发明专利的“申请日”打印出来。并将含有“吴峰”的所有发明专利条目保存到Excel中 1.1 代码实现 1.2 运行结果 二、读取文件创建城市、人口、性别比、城镇化率DataFrame对象&#xff0c;计算指标排名&…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

学习C++第二天

1.缺省参数 缺省参数的概念&#xff1a; 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void show(int a 10) {cout << a << endl; }int main() {sho…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号&#xff1a;FPGA开源工坊 引言 FPGA的学习主要分为以下两部分 语法领域内知识 做FPGA开发肯定要首先去学习相应的编程语言&#xff0c;FPGA开发目前在国内采用最多的就是使用Verilog做开发&#xff0c;其次还有一些遗留下来的项目会采用…