机器学习基础04_朴素贝叶斯分类决策树分类

目录

一、朴素贝叶斯分类理论

1、贝叶斯分类理论

2、条件概率

3、全概率公式

4、贝叶斯推断

5、朴素贝叶斯推断

6、拉普拉斯平滑系数

二、决策树分类

1、相关概念

2、基于信息增益决策树的建立

3、基于基尼指数决策树的建立


一、朴素贝叶斯分类理论

1、贝叶斯分类理论

假设一个数据集,它由两类数据组成,数据分布如下图所示:

 p1(x,y)表示数据点(x,y)属于类别1(图中红点)

p2(x,y)表示数据点(x,y)属于类别2(图中蓝点)

那么对于一个新数据点 (x,y):

  • 如果p1(x,y)>p2(x,y),那么类别为1

  • 如果p1(x,y)<p2(x,y),那么类别为2

也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

2、条件概率

条件概率(Conditional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。

由事件A、事件B同时发生的概率等于事件B发生的概率乘以事件B发生中事件A也发生的概率,即𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵),同理𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)。

得出𝑃(𝐴|𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)/𝑃(𝐵),即条件概率的计算公式。

3、全概率公式

由公式 𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′),代入𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)得到全概率公式:𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′),再代入条件概率的计算公式:

P(A|B) = \frac{P(B|A)P(A)}{P(B|A)P(A)+P(B|A^{'})P(A^{'})}

4、贝叶斯推断

𝑃(𝐴|𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)/𝑃(𝐵)中:

𝑃(𝐴|𝐵)是后验概率(Posterior probability),可理解为在观察证据 B 时假设 A 发生的概率;

𝑃(𝐵|𝐴)是似然度,即在假设 A 成立的条件下,观察到证据 B 的概率;

𝑃(𝐴)是先验概率(Prior probability),即在没有观察到任何证据前,假设 A 成立的概率;

𝑃(𝐵)是边缘概率,即观察到证据 B 的概率,可以视为归一化常量;

𝑃(𝐵|𝐴)/𝑃(𝐵)称为可能性函数(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

所以,条件概率可以理解为:后验概率=先验概率x调整因子

我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

5、朴素贝叶斯推断

贝叶斯和朴素贝叶斯的概念是不同的,区别就在于“朴素”二字,朴素贝叶斯对条件概率分布做了条件独立性的假设。 比如下面的公式,假设有n个特征:

根据贝叶斯定理,后验概率 P(a|X) 可以表示为𝑃(a|X)=𝑃(X|a)𝑃(a)/𝑃(X),将联合概率 P(X|a) 分解为各个特征的概率乘积:

P(X|a) = P(x_1, x_2, ..., x_n|a) = P(x_1|a)P(x_2|a)...P(x_n|a)

将这个条件独立性假设应用于贝叶斯公式,得到:

P(a|X) = \frac{P(x_1|a)P(x_2|a)...P(x_n|a)P(a)}{P(X)}

这样,朴素贝叶斯分类器就可以通过计算每种可能类别的条件概率和先验概率,然后选择具有最高概率的类别作为预测结果。  

6、拉普拉斯平滑系数

某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。然而,在实际应用中,即使某个事件或特征没有出现在训练集中,也不能完全排除它在未来样本中出现的可能性。拉普拉斯平滑技术可以避免这种“零概率陷阱”。

P(F1|C) = \frac{N_{i}+\alpha }{N+\alpha m}

一般α取值1,m的值为总特征数。

通过这种方法,即使某个特征在训练集中从未出现过,它的概率也不会被估计为零,而是会被赋予一个很小但非零的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误。

api:

# 朴素贝叶斯算法

sklearn.naive_bayes.MultinomialNB()

estimator.fit(x_train, y_train)

y_predict = estimator.predict(x_test)

# 鸢尾花数据集 贝叶斯分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB# 加载数据
x,y = load_iris(return_X_y=True)
# 划分数据
x_train,x_test,y_trian,y_test = train_test_split(x,y,train_size=0.8)
# 处理数据 不用标准化
# 初始化贝叶斯预估器
estimator = MultinomialNB()
# 训练模型
estimator.fit(x_train,y_train)
# 评估模型
score = estimator.score(x_test,y_test)
print(score)
# 泰坦尼克号数据集 贝叶斯分类
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
import pandas as pddata = pd.read_csv('../src/titanic/titanic.csv')
x = data[['pclass','age','sex']]
# 众数填充age的缺省值
x['age'].fillna(x['age'].value_counts().index[0],inplace=True)
# 将sex特征下的male和female转换为0和1
x['sex'] = [0 if i=='male' else 1 for i in x['sex']]
x['pclass']=[int(i[0]) for i in x['pclass']]
print(x)y = data[['survived']]# 划分数据
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8,random_state=100)
# 初始化朴素贝叶斯预估器
estimator = MultinomialNB()
# 训练模型
estimator.fit(x_train,y_train)
# 评估模型
score = estimator.score(x_test,y_test)
print(score)
# 预测
y_predict = estimator.predict([[1,30,1]])
print(y_predict)

 

二、决策树分类

1、相关概念

1.决策节点

通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。

2.叶子节点

没有子节点的节点,表示最终的决策结果。

3.决策树的深度

所有节点的最大层次数。决策树具有一定的层次结构,根节点的层次数定为0,从下面开始每一层子节点层次数增加。

4.决策树优点

可视化-可解释能力-对算力要求低

5.决策树缺点

容易产生过拟合,所以应避免调整过大的深度。

2、基于信息增益决策树的建立

信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树。

1.信息熵

信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则D的纯度越高。

假设样本集合D共有N类,第k类样本所占比例为pk,则D的信息熵为 H(D) = -\sum_{k=1}^{N}p_{k}log_{2}p_{k}

2.信息增益

信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,那么决策树就会越简洁。

这里信息增益的程度用信息熵的变化程度来衡量, 信息增益公式:

IG(Y|X) = H(Y)-H(Y|X) \geq 0

3.建立步骤

计算根节点的信息熵---计算属性的信息增益---划分属性

3、基于基尼指数决策树的建立

基尼指数(Gini Index)是决策树算法中用于评估数据集纯度的一种度量,基尼指数衡量的是数据集的不纯度,或者说分类的不确定性。

对于多分类问题,如果一个节点包含的样本属于第 k 类的概率是 pk,则节点的基尼指数定义为:

Gini(p) = 1 - \sum_{k=1}^{K} p_k^2

意义

  • 当一个节点的所有样本都属于同一类别时,基尼指数为 0,表示纯度最高。

  • 当一个节点的样本均匀分布在所有类别时,基尼指数最大,表示纯度最低。

应用

在构建决策树时,我们希望每个内部节点的子节点能更纯,即基尼指数更小。因此,选择分割特征和分割点的目标是使子节点的平均基尼指数最小化。

具体来说,对于一个特征,我们计算其所有可能的分割点对应的子节点的加权平均基尼指数,然后选择最小化这个值的分割点。这个过程会在所有特征中重复,直到找到最佳的分割特征和分割点。

例如,考虑一个数据集 (D),其中包含 (N) 个样本,特征 (A) 将数据集分割为 |D_1|和 |D_2| ,则特征 (A) 的基尼指数为:

Gini_A = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2)

其中 |D_1|和 |D_2| 分别是子集 D_1 和 D_2 中的样本数量。

通过这样的方式,决策树算法逐步构建一棵树,每一层的节点都尽可能地减少基尼指数,最终达到对数据集的有效分类。

api:

sklearn.tree.DecisionTreeClassifier(....)

参数:

criterion "gini" "entropy” 默认为="gini"

    当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树,

    当criterion取值为"entropy”时采用信息增益( information gain)算法构造决策树.

max_depth   int, 默认为=None  树的最大深度

可视化决策树

sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

参数:

    estimator决策树预估器

    out_file生成的文档

    feature_names节点特征属性名

功能:

    把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate Graph"会生成一个树型的决策树图

# 鸢尾花数据集 使用信息增益算法构造决策树
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier,export_graphviziris = load_iris()
x,y = load_iris(return_X_y=True)x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.75)scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)# critierion=entropuy 采用信息增益算法构建决策树 (criterion默认为gini 采用基尼不纯度算法构造决策树)
estimator = DecisionTreeClassifier(criterion=entropuy)
estimator.fit(x_train,y_trian)score = estimator.score(x_test,y_test)
print(score)y_predict = estimator.predict([[2,2,3,1],[3,5,4,7]])
print(y_predict)# 可视化决策树
# export_graphviz(estimator, out_file='../model/iris_tree.dot', feature_names=iris.feature_names)

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

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

相关文章

git日志查询和导出

背景 查看git的提交记录并下载 操作 1、找到你idea代码的路径&#xff0c;然后 git bash here打开窗口 2、下载所有的日志记录 git log > commit.log3、下载特定日期范围内记录 git log --since"2024-09-01" --until"2024-11-18" 你的分支 > c…

后台管理系统(开箱即用)

很久没有更新博客了&#xff0c;给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理&#xff0c;部门管理&#…

Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误

今天看了下书翻了下Spring Boot的用法&#xff0c;下载idea后&#xff0c; 反复出现org.springframework.boot:spring-boot-maven-plugin:找不到类错误&#xff0c;后来看了下调试窗口&#xff0c;发现是连不上maven的网站443错误&#xff0c;解决思路很简单&#xff0c;把ide连…

数据中心的拥塞控制

前面提到&#xff0c;如今的高速网络方案集中在卸载主机网络能力&#xff0c;降低主机处理时延&#xff0c;甚至 PFC 用网络排队时延换主机时延&#xff0c;本末倒置。而在拥塞控制领域仍是传统的 AIMD 闭环反馈&#xff0c;ECN&#xff0c;QCN 那一套&#xff0c;但拥塞是端到…

【网络云计算】2024第48周-技能大赛-初赛篇

文章目录 1、比赛前提2、比赛题目2.1、 修改CentOS Stream系统的主机名称&#xff0c;写出至少3种方式&#xff0c;并截图带时间戳和姓名&#xff0c;精确到秒&#xff0c;否则零分2.2、 创建一个名为你的名字的拼音的缩写的新用户并设置密码&#xff0c;将用户名添加到 develo…

SAP+Internet主题HTML样式选择

SAP目前只支持三种HTML样式选择&#xff1a; 样式一 背景色&#xff1a;深色&#xff0c;蓝 特点&#xff1a;适中型排列&#xff0c;与SAP界面排列相同&#xff0c;富含UI特征&#xff0c;整齐美观 URL地址&#xff1a;http://cn1000-sap-01.sc.com:8000/sap/bc/gui/sap/it…

鸿蒙动画开发07——粒子动画

1、概 述 粒子动画是在一定范围内随机生成的大量粒子产生运动而组成的动画。 动画元素是一个个粒子&#xff0c;这些粒子可以是圆点、图片。我们可以通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等维度变化做动画&#xff0c;来营造一种氛围感&#xff0c;比如下…

Java 使用MyBatis-Plus数据操作关键字冲突报错You have an error in your SQL syntax问题

问题 这个报错是出现在Java Spring boot项目中&#xff0c;使用MyBatis-Plus通过创建的实体类对数据库的操作过程中&#xff0c;通过实体创建数据库表是没有问题的&#xff0c;而在接口调用服务类操作数据库的时候&#xff0c;会出现报错。报错详情如下&#xff1a; 服务请求异…

<项目代码>YOLOv8 草莓成熟识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构

目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …

Flutter:Dio下载文件到本地

import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…

Golang | Leetcode Golang题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …

鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)

元服务是什么&#xff1f;和App的关系&#xff1f; 元服务是是一种HarmonyOS轻量应用形态&#xff0c;用户无需安装即可使用&#xff0c;具备随处可及、服务直达、自由流转的特征。 元服务是可以独立部署和运行的程序实体&#xff0c;独立于应用&#xff0c;不依赖应用可独立…

Exadata: 将数据库硬件和软件设计在一起

Engineering Database Hardware and Software Together&#xff0c;是Juan Loaiza在2015 VLDB大会上的Keynotes。虽然是10年前的文章&#xff0c;但其中一些要点一直延续至今&#xff0c;并未改变。 本文将讲解Keynotes摘要和演讲中的要点。 摘要 其中的一些观点&#xff1a…

Windows配置域名映射IP

一、找到 hosts 文件 打开 C:\Windows\System32\drivers\etc 二、添加hosts文件修改、写入权限 右击hosts文件&#xff0c;点击属性 -> 安全 -> Users -> 编辑 -> Users -> 添加修改、写入权限 -> 确定 -> 确定 进入常规&#xff0c;将只读属性关闭 三、…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterato…

XXL JOB DockerCompose部署

官网给的方式是 Docker 命令启动&#xff0c;但是用起来太麻烦了&#xff0c;所以用DockerCompose 简化部署 创建数据库&#xff0c;导入 SQL SQL 脚本位置为/xxl-job/doc/db/tables_xxl_job.sql https://raw.githubusercontent.com/xuxueli/xxl-job/refs/heads/master/doc/…

【原创】如何备份和还原Ubuntu系统,非常详细!!

前言 我在虚拟机装了一个xfce4的Ubuntu桌面版&#xff0c;外加输入法、IDEA等&#xff0c;我想将这个虚拟机里的系统直接搬到物理机中&#xff0c;那我可以省的再重新装一遍、配置xfce4桌面、修改一堆快捷键还有配置idea了&#xff0c;那直接说干就干。 本教程基于Ubuntu24.0…

YOLO系列番外——数据偏移与分布不均对模型的影响分析与炫酷的动态分布图代码分享

背景 在深度学习的应用中&#xff0c;数据质量对模型的性能至关重要。随着智能化应用场景的扩展&#xff0c;数据的复杂性不断增加&#xff0c;如何处理数据偏移&#xff08;Data Shift&#xff09;和数据分布不均&#xff08;Data Imbalance&#xff09;成为了模型训练和部署过…

Shell脚本6 -- 条件判断if

声明&#xff1a; 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程&#xff08;4&#xff09;脚本与用户交互以及if条件判断】的公开分享&#xff0c;所有内容仅限于网络安全技术的交流学习&#xff0c;不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c…