伯努利朴素贝叶斯解析:面向初学者的带代码示例的视觉指南

news2024/11/14 12:13:16

通过二进制简单性释放预测能力,欢迎来到雲闪世界。

添加图片注释,不超过 140 字(可选)

与虚拟分类器的基线方法或基于相似性的 KNN 推理不同,朴素贝叶斯利用了概率论。它结合了每个“线索”(或特征)的个体概率来做出最终预测。这种简单而强大的方法已被证明在各种机器学习应用中具有无价的价值。 定义 朴素贝叶斯是一种使用概率对数据进行分类的机器学习算法。它基于贝叶斯定理,即计算条件概率的公式。“朴素”部分指的是它的关键假设:它将所有特征视为彼此独立,即使它们在现实中可能并非如此。这种简化虽然通常不切实际,但大大降低了计算复杂性,并且在许多实际场景中效果很好。

添加图片注释,不超过 140 字(可选)

朴素贝叶斯分类器的主要类型 朴素贝叶斯分类器主要有三种类型。这些类型之间的关键区别在于它们对特征分布的假设:

  1. 伯努利朴素贝叶斯:适用于二进制/布尔特征。它假设每个特征都是一个二进制值(0/1)变量。

  2. 多项式朴素贝叶斯:通常用于离散计数。它经常用于文本分类,其中特征可能是字数。

  3. 高斯朴素贝叶斯:假设连续特征遵循正态分布。

添加图片注释,不超过 140 字(可选)

首先,我们先来关注最简单的伯努利 NB。其名称中的“伯努利”源于每个特征都是二值化的假设。 使用的数据集 在本文中,我们将使用这个人工高尔夫数据集(灵感来自 [1])作为示例。该数据集根据天气状况预测一个人是否会打高尔夫球。

添加图片注释,不超过 140 字(可选)
 
   
 
   

# 导入数据集 # 从sklearn.model_selection导入train_test_split 从sklearn.metrics导入accuracy_score 导入pandas作为pd 导入numpy作为np dataset_dict = { 'Outlook':[ 'sunny','sunny','overcast','rain','rain','rain',' overcast','sunny ','rain','sunny',' rain','sunny','overcast' , ' rain',' sunny ' , 'overcast' ,'rain',' sunny' ,'overcast','rain','sunny' , ' rain' ,'sunny','overcast','rain','阴天' ], '温度' : [ 85.0 , 80.0 , 83.0 , 70.0 , 68.0 , 65.0 , 64.0 , 72.0 , 69.0 , 75.0 , 75.0 , 72.0 , 81.0 , 71.0 , 81.0 , 74.0 , 76.0 , 78.0 , 82.0 , 67.0 , 85.0 , 73.0 , 88.0 , 77.0 , 79.0 , 80.0 , 66.0 , 84.0 ], '湿度' : [ 85.0 , 90.0 , 78.0 , 96.0、80.0、70.0、65.0、95.0、70.0、80.0、70.0、90.0、75.0、80.0、​​​​​​​​​​​​​88.0、92.0、85.0、75.0、​​​​​​ 92.0 , 90.0 , 85.0 , 88.0 , 65.0 , 70.0 , 60.0 , 95.0 , 70.0 , 78.0 ] ,' 风' :[假,真,假...​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ , '是' , '是' , '是' , '否' , '否' , '是' , '是' , '否' , '否' , '是' , '是' , '是' , '是' , '是' , '是' , '是' , '否' , '是' ] } df = pd.DataFrame(dataset_dict) # 对 'Outlook' 列进行 ONE-HOT 编码df = pd.get_dummies(df, columns=[ 'Outlook' ], prefix= '' , prefix_sep= '' , dtype= int ) # 将 'Windy' (bool) 和 'Play' (binary) 列转换为二进制指标df[ 'Wind' ] = df[ '风' ]。astype( int ) df[ 'Play' ] = (df[ 'Play' ] == 'Yes' ).astype( int ) # 设置特征矩阵X和目标向量y X, y = df.drop(columns= 'Play' ), df[ 'Play' ] # 将数据分成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, train_size= 0.5 , shuffle= False ) print (pd.concat([X_train, y_train], axis= 1 ), end= '\n\n' ) print (pd.concat([X_test, y_test], axis= 1 )) 我们将通过将特征转换为二进制来针对伯努利朴素贝叶斯进行稍微调整。

添加图片注释,不超过 140 字(可选)
 
   
 
   

# 对分类后的列进行独热编码,然后删除它们,但对训练集和测试集分别执行此操作 # 为训练集定义“温度”和“湿度”类别 X_train[ '温度' ] = pd.cut(X_train[ '温度' ], bins=[ 0 , 80 , 100 ], labels=[ '温暖' , '热' ]) X_train[ '湿度' ] = pd.cut(X_train[ '湿度' ], bins=[ 0 , 75 , 100 ], labels=[ '干燥' , '湿度' ]) # 类似地,为测试集定义 X_test[ '温度' ] = pd.cut(X_test[ '温度' ], bins=[ 0 , 80 , 100 ], labels=[ 'Warm' , 'Hot' ]) X_test[ 'Humidity' ] = pd.cut(X_test[ 'Humidity' ], bins=[ 0 , 75 , 100 ], labels=[ 'Dry' , 'Humid' ]) # 对分类列进行独热编码 one_hot_columns_train = pd.get_dummies(X_train[[ 'Temperature' , 'Humidity' ]], drop_first= True , dtype= int ) one_hot_columns_test = pd.get_dummies(X_test[[ 'Temperature' , 'Humidity' ]], drop_first= True , dtype= int ) # 从训练和测试集中删除分类列 X_train = X_train.drop([ 'Temperature' , '湿度' ], axis= 1 ) X_test = X_test.drop([ '温度' , '湿度' ], axis= 1 ) # 将独热编码列与原始 DataFrames 连接 X_train = pd.concat([one_hot_columns_train, X_train], axis= 1 ) X_test = pd.concat([one_hot_columns_test, X_test], axis= 1 ) print (pd.concat([X_train, y_train], axis= 1 ), '\n' ) print (pd.concat([X_test, y_test], axis= 1 ))

主要机制 伯努利朴素贝叶斯对每个特征为 0 或 1 的数据进行操作。

  1. 计算训练数据中每个类别的概率。

  2. 对于每个特征和类别,计算给定类别时特征为 1 和 0 的概率。

  3. 对于新实例:对于每个类,将其概率乘以该类每个特征值(0 或 1)的概率。

  4. 预测结果概率最高的类别。

添加图片注释,不超过 140 字(可选)

训练步骤 伯努利朴素贝叶斯的训练过程涉及根据训练数据计算概率:

  1. 类别概率计算:对于每个类别,计算其概率:(该类别中的实例数)/(实例总数)

添加图片注释,不超过 140 字(可选)
 
   
 
   

从分数导入分数 def calc_target_prob(attr):calc_target_prob (attr): total_counts = attr.value_counts (). sum () prob_series = attr.value_counts (). apply (lambda x: Fraction (x, total_counts) .limit_denominator ()) 返回 prob_series 打印( calc_target_prob (y_train))

2.特征概率计算:对于每个特征和每个类,计算:

  • (此类中特征为 0 的实例数)/(此类中的实例数)

  • (该类中特征为 1 的实例数)/(该类中的实例数)

添加图片注释,不超过 140 字(可选)
 
   
 
   

从分数导入分数 def sort_attr_label(attr,lbl): 返回(pd.concat([attr,lbl],axis = 1) .sort_values([attr.name,lbl.name]) .reset_index() .rename(columns = { 'index':'ID' }) .set_index('ID')) def calc_feature_prob(attr,lbl): total_classes = lbl.value_counts() counts = pd.crosstab(attr,lbl) prob_df = counts.apply(lambda x:[Fraction(c,total_classes[x.name])。limit_denominator()for c in x]) 返回prob_df 打印(sort_attr_label(y_train,X_train[ 'sunny' ])) 打印(calc_feature_prob(X_train[ ‘阳光’ ], y_train))

添加图片注释,不超过 140 字(可选)
 
   
 
   

对于 X_train.columns 中的 col:.columns: 打印(calc_feature_prob(X_train[col],y_train),“\n”)

3.平滑(可选):在每个概率计算的分子和分母上添加一个小值(通常为 1),以避免零概率

添加图片注释,不超过 140 字(可选)
 
   
 
   

# 在 sklearn 中,上述所有过程都总结在这个 'fit' 方法中:总结如下‘fit’方法: from sklearn.naive_bayes import BernoulliNB nb_clf = BernoulliNB(alpha= 1 ) nb_clf.fit(X_train, y_train)

4.存储结果:保存所有计算出的概率以供分类时使用。

添加图片注释,不超过 140 字(可选)

分类步骤 给定一个特征为 0 或 1 的新实例:

  1. 概率收集:对于每个可能的类别:

  • 从该类发生的概率(类概率)开始。

  • 对于新实例中的每个特征,收集该特征对于该类为 0/1 的概率。

添加图片注释,不超过 140 字(可选)

2.分数计算及预测:每个班级:

  • 将所有收集到的概率相乘

  • 结果为该课程的成绩

  • 得分最高的类别是预测

添加图片注释,不超过 140 字(可选)
 
   
 
   

y_pred = nb_clf.预测(X_test) 打印(y_pred)

评估步骤

添加图片注释,不超过 140 字(可选)
 
   
 
   

# 评估分类器 print ( f"Accuracy: {accuracy_score(y_test, y_pred)} " )

关键参数 伯努利朴素贝叶斯有几个重要参数:

  1. Alpha (α):这是平滑参数。它为每个特征添加一个小计数以防止零概率。默认值通常为 1.0(拉普拉斯平滑),如前所示。

  2. 二值化:如果您的特征尚未二值化,此阈值会对其进行转换。高于此阈值的任何值都变为 1,低于此阈值的任何值都变为 0。

对于 scikit-learn 中的 BernoulliNB,数值特征通常是标准化的,而不是手动二值化。然后模型内部将这些标准化值转换为二进制,通常使用 0(平均值)作为阈值。

3.拟合先验:是否学习类先验概率或假设统一先验(50/50)。

对于我们的高尔夫数据集,我们可能从默认的 α=1.0 开始,不进行二值化(因为我们已经将我们的特征二值化),并且 fit_prior=True。

优点和缺点 与机器学习中的任何算法一样,伯努利朴素贝叶斯有其优点和局限性。 优点:

  1. 简单:易于实现和理解。

  2. 效率:训练和预测速度快,适用于大特征空间。

  3. 小型数据集的性能:即使训练数据有限也能表现良好。

  4. 处理高维数据:适用于许多功能,特别是在文本分类中。

缺点:

  1. 独立性假设:假设所有特征都是独立的,但这在现实世界的数据中通常并不正确。

  2. 仅限于二进制特征:纯形式仅适用于二进制数据。

  3. 对输入数据的敏感性:对特征的二值化方式很敏感。

  4. 零频率问题:如果没有平滑,零概率会严重影响预测。

结语 伯努利朴素贝叶斯分类器是一种简单但功能强大的二元分类机器学习算法。它在文本分析和垃圾邮件检测方面表现出色,这些分析中的特征通常是二元的。这种概率模型以速度快、效率高而闻名,在小数据集和高维空间中表现良好。 尽管它对特征独立性的假设很天真,但它的准确性往往可以与更复杂的模型相媲美。伯努利朴素贝叶斯是一种出色的基线和实时分类工具。 🌟 伯努利朴素贝叶斯简化版

 
   
 
   

# 导入所需库 import pandas as pd from sklearn.naive_bayes import BernoulliNB from sklearn.preprocessing import StandardScaler from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split # 加载数据集 dataset_dict = { 'Outlook' : [ 'sunny' , 'sunny' , 'overcast' , 'rainy' , 'rainy' , 'rainy' , 'overcast' , 'sunny' , 'rainy' , 'sunny' , ' overcast' , 'rainy','sunny' , 'overcast' , 'rainy' , 'sunny' , 'overcast' , 'rainy' , 'sunny' , 'sunny' , 'rainy' , 'overcast' , 'rainy' , 'sunny' , '阴天' , '晴天' , '阴天' , '下雨' , '阴天' ], '温度' : [ 85.0 , 80.0 , 83.0 , 70.0 , 68.0 , 65.0 , 64.0 , 72.0 , 69.0 , 75.0 , 75.0 , 72.0 , 81.0 , 71.0 , 81.0 , 74.0 , 76.0 , 78.0 , 82.0 , 67.0 , 85.0 , 73.0 , 88.0 , 77.0 , 79.0 , 80.0 , 66.0 , 84.0 ], ‘湿度’:[ 85.0 , 90.0 , 78.0 , 96.0 , 80.0 , 70.0 , 65.0 , 95.0 , 70.0、80.0、70.0、90.0、75.0 、​​​​​​​ 80.0 , 88.0 , 92.0 , 85.0 , 75.0 , 92.0 , 90.0 , 85.0 , 88.0 , 65.0 , 70.0 , 60.0 , 95.0 , 70.0 , 78.0 ] , ' 风' : [假,真,假,假,假,假,真,假,假,假,真,假,假,真,假,假,假,假,假,假,假] , '播放' : [ '否' , '否' , '是' , '是' , '是' , '否' , '是' , '否' , '是','是' , '是' , '是' , '是' , '是' , '否' , '是', '否' , '是' , '是' , '否' , '否' , '是','是' , '否' , '否' , '是' , '是' , '是' , '是' , '是' , '是','是','是','是', '是' ] } df = pd.DataFrame(dataset_dict) # 为模型准备数据df = pd.get_dummies(df, columns=[ 'Outlook' ], prefix= '' , prefix_sep= '' , dtype= int ) df[ 'Wind' ] = df[ 'Wind' ].astype( int ) df[ '播放' ] = (df[ '播放' ] == '是' ).astype( int ) at_cols] = scaler.transform(X_test[float_cols]) # 训练模型 nb_clf = BernoulliNB() nb_clf.fit(X_train, y_train) # 进行预测 y_pred = nb_clf.predict(X_test) # 检查准确度 print ( f"Accuracy: {accuracy_score(y_test, y_pred)} " )

进一步阅读

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

订阅频道(https://t.me/awsgoogvps_Host) TG交流群(t.me/awsgoogvpsHost)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宿舍管理系统设计与分析

第一章 管理信息系统概述 在人类进入21世纪之际,随着社会的组织化程度以及企业生产的社会化程度越来越高,信息作为一种资源已经和材料、能源并称为现代社会化发展的三大支柱之一。管理信息系统是融科学、信息科学、系统工程以及现代通讯技术、计算机技术…

阿里HPN-大型语言模型训练的数据中心网络架构

阿里巴巴HPN:用于大型语言模型训练的数据中心网络 摘要 本文介绍了阿里云用于大型语言模型(LLM)训练的数据中心网络HPN。由于LLM和一般云计算之间的差异(例如,在流量模式和容错性方面),传统的数据中心网络不太适合LLM训练。这就要求我们专门为LLM培训设…

【NetTopologySuite类库】多边形的五种包围盒(AABB、OBB、包围圆、八边形、凸包)

示例 用的是NetTopologySuite1.5.3版本。 var r new WKTReader(); var wkt "polygon((0 0,0 0.5,1 2,5 0,4 -2,3 -1, 0 0))"; var rawGeo r.Read(wkt); var b1 rawGeo.Envelope;//AABB var b2 new MinimumBoundingCircle(rawGeo).GetCircle();//包围圆 var b3…

基于GeoToolKit实现三维断面的绘制研究

GeoToolkit默认自带PillarSurfaceData的三维断面绘制要求断棱(有时叫断柱)必须是单调的,否则组件底层就会自动优化,导致断面出现回弯,相当于出现重叠,无法实现最终的效果。因此,本文主要在之前文章的基础上,拓展了GeoToolKit的三维断面显示功能。本文主要基于GeoToolKi…

计算机毕业设计hadoop+spark+hive漫画推荐系统 动漫视频推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据

流程:1.DrissionPageSelenium自动爬虫工具采集漫画视频、详情、标签等约200万条漫画数据存入mysql数据库; 2.Mapreduce对采集的动漫数据进行数据清洗、拆分数据项等,转为.csv文件上传hadoop的hdfs集群; 3.hive建库建表导入.csv动漫…

能精准捕捉股价波峰波谷的 Findpeaks

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 在AI对金融产品进行价值分析中,检测波峰波谷具有至关重要的应用意义。投资者可以直接观察股票价格走势图,通过肉眼识别波峰和波谷的位置。这种方法简单易行,但主观性较强,可能受到投资者个人经验…

【最长公共上升子序列】

题目 解决 for (int i 1; i < n; i)for (int j 1; j < n; j){ f[i][j] f[i - 1][j];if (a[i] b[j]){ f[i][j] max(f[i][j], 1);for (int k 1; k < j; k)if (b[j] > b[k])f[i][j] max(f[i][j], f[i - 1][k] 1);} } 先假设不影响结果&#xff0c;纳入 &…

大语言模型的“智能飞轮”!阿里最新综述全面解析大模型的自进化之路

©PaperWeekly 原创 作者 | 林廷恩 单位 | 阿里通义实验室算法研究员 研究方向 | 自然语言处理 想象一下&#xff0c;一个 AI 不仅能学习&#xff0c;还能自我改进&#xff0c;变得越来越聪明。这不是科幻小说&#xff0c;而是我们正在见证的现实。大语言模型&#xff08;…

pdf有密码,如何实现pdf转换word?

PDF想要转换成其他格式&#xff0c;但是当我们将文件拖到PDF转换器进行转换的时候发现PDF文件带有密码怎么办&#xff1f;今天分享PDF有密码如何转换成word方法。 方法一、 PDF文件有两种密码&#xff0c;打开密码和限制编辑&#xff0c;如果是因为打开密码&#xff0c;建议使…

全套安全帽佩戴检测算法源码与实战应用分享

在许多工业环境中&#xff0c;安全帽是确保工人安全的重要防护装备。为了降低工人受伤的风险&#xff0c;尤其是在建筑工地、矿山、工厂等高危环境下&#xff0c;确保工人正确佩戴安全帽是至关重要的。然而&#xff0c;由于现场管理的复杂性和人员流动性&#xff0c;单靠人工监…

Chrome H265 WebRTC 支持

Chrome从127版本开始支持RTC H265解码&#xff0c;这样服务器就不需要对H265转码了&#xff0c; H5S和USC会自动检测浏览器支持的解码类型并自动判断是否启动转码&#xff0c;这样客户端不用关心摄像机具体是H264还是H265&#xff0c;尽量使用带GPU的客户端&#xff0c;这样服务…

什么是红黑树-面试中常问的数据结构

你有没有想过,为什么你的 Java HashMap 能够如此高效地处理数百万个键值对?或者你的 Linux 系统是如何在眨眼间就能管理成千上万的进程的?这些看似神奇的性能背后,隐藏着一个优雅而强大的数据结构 - 红黑树。 目录 什么是红黑树?红黑树的特性为什么需要红黑树?红黑树的结…

java基础 之 抽象类

文章目录 前言抽象类浅浅的理解下抽象类关键字&#xff1a;abstract抽象类 VS 普通类特点 前言 1、类是一个模板&#xff0c;类被继承后成为父类&#xff0c;继承父类的类称为子类。 2、子类可以对父类的方法进行重写&#xff0c;也可以直接使用父类的方法。 3、类称为继承&…

鸿蒙笔记--WorkerTaskPool

这一节了解一下鸿蒙中的Worker和TaskPool,Worker和TaskPool的作用是为应用程序提供一个多线程的运行环境&#xff0c;用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程&#xff0c;从而最大化系统的利用率&#xff0c;降低整体资源消耗&#xff0c;并…

python动画:manim中的颜色【ManimColor】的使用方法

一&#xff0c;什么是彩色(颜色) Color是视觉艺术不可或缺的一部分&#xff0c;但我们怎么知道它如此重要呢&#xff1f;嗯&#xff0c;一种方法是通过色彩理论的应用。什么是色彩理论&#xff1f;我们将定义色彩理论&#xff0c;然后分解来自绘画、照片和电影的各种色彩理论示…

活动预告 | Global RAG Hack Together Ⅲ-用VS Code AI Tools结合SLM构建RAG应用

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 九月&#xff0c;Global RAG Hack Together 即将在全球开启&#xff0c;在这场全球 RAG 黑客松中&#xff0c;我们不仅可以学习到生成式 AI 下的 RAG 技术&#xff0c;还可以用我们掌握的 RAG 技术提交参…

python读取calibre的opf文件到表格

opf文件之一&#xff1a; python 将 Calibre Library 里面所有opf文件的title&#xff0c;creator&#xff0c;date&#xff0c;description&#xff0c;language&#xff0c;subject内容写入表格中&#xff0c;其中opf之一如上&#xff0c;表头对应为&#xff1a;标题&#xf…

豆包大模型升级:日均Tokens使用量破5000亿,字节跳动打造即刻体验的《Her》式AI

ChatGPT 发布近两年后&#xff0c;全球掀起了一场大模型竞赛&#xff0c;如今怎么将大模型落地&#xff0c;成为萦绕在每一家 AI 公司的最大命题。 最近有媒体统计&#xff0c;自从 GPT-3.5 上线以来&#xff0c;中国新成立的 AI 公司已经有近 8 万家陷入注销、吊销或停业异常…

【前端】vue数据监测原理

问题展示&#xff1a; 点击按钮之后&#xff0c;vue中的persons数据改变&#xff0c;但是页面显示的内容没变。&#xff08;先点击按钮再打开vue的数据面板可以看见改变&#xff0c;先打开后点击数据面板也不能显示改变。&#xff09; 此时的更新代码&#xff1a; methods:{…

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话&#xff1a;悟空》一经发布&#xff0c;瞬间登顶steam榜首&#xff0c;打破单机游戏在线记录&#xff0c;全球几十万国外玩家听着中文配音&#xff0c;看着翻译过来的英文字幕&#xff0c;玩的不亦乐乎&#xff01; 甚至国外论坛上兴起了一股西游风&a…