当前位置: 首页 > news >正文

3.22决策树,离散值

对于离散值特征,每个特征都有固定的取值,因此可以直接计算不纯度值。而对于连续值特征,由于取值范围可能是连续的,因此需要考虑不同的划分点(阈值)来进行计算。

在选择最佳特征时,需要找到一个划分点,使得在该划分点上按照特征值进行划分后,获得的子集最具有纯度。因此,需要计算每个可能划分点对应的不纯度值,并选择最小的不纯度值作为最佳划分点。

为了计算每个划分点的不纯度值,通常会使用平均值或中值作为划分点,并计算在该划分点上的不纯度值。然后,比较不同划分点的不纯度值,选择最小的不纯度值作为最佳划分点。

因此,对于连续值特征,会得到一个由多个阈值对应的不纯度值的列表,以便选择最佳划分点。

对于连续值特征,由于取值范围是连续的,因此存在无限个可能的划分点。为了找到最佳的划分点,需要计算每个可能的划分点对应的不纯度值,然后选择最小的不纯度值作为最佳划分点。

通常情况下,为了减少计算的复杂度,可以选择一些特定的划分点进行计算。常见的方法是使用平均值或中位数作为划分点,然后计算在该划分点上的不纯度值。然后,可以通过改变划分点的位置来获得不同的划分点以及对应的不纯度值。

因此,在选择最佳划分点时,会获得一个由多个阈值对应的不纯度值的列表,以便选择最小的不纯度值作为最佳划分点。这样可以在有限的计算次数内找到最佳的划分点,并构建出具有较高纯度的决策树。

离散值特征只有有限个离散取值,相对于连续值特征,其取值范围是离散的,不会存在无限个可能的划分点。由于离散特征的取值已经确定,不需要像连续值特征那样进行划分点的选择,所以在计算不纯度值时,只会得到一个不纯度值。

对于离散值特征,可以直接计算每个取值对应的不纯度值,然后将这些值进行比较,选择最小的不纯度值作为最佳的划分点。因为离散值特征的取值是离散的,不存在需要考虑的划分点,所以只会得到一个不纯度值。

这个就是说,当为连续且都可以时,就选择后面的取值分为两份

在这段代码中,`my_tree.subtree` 是一个字典,用于存储子树(或子节点)的引用。字典的键可以是任何可哈希的数据类型,包括字符串。因此,这里将字符串 `up_part` 和 `down_part` 作为 `my_tree.subtree` 的键,用于存储对应的子树。

在这段代码中,使用 `up_part` 和 `down_part` 作为键来存储划分点大于等于和小于的子树。这样,在可视化决策树时,可以通过字典的键来表示划分点的取值范围,以便更好地理解决策树的结构。

树是一个字典

在决策树算法中,划分数据集不仅需要考虑特征变量(X),还需要同时考虑目标变量(y)。划分特征变量和目标变量是为了保证决策树模型在每次划分时能够找到最佳的划分点。

特征变量(X)的划分是为了根据不同特征值的取值,将样本数据划分成不同的子集。但是决策树的目标是根据特征变量的取值来预测目标变量(y)的取值。因此,对特征变量的划分仅仅是决策树算法的一部分,最终的目标是基于这些划分来对目标变量进行预测。

在决策树的构建过程中,通过对特征变量和目标变量同时进行划分,可以选择最佳的划分点,使得划分后的子集在目标变量上的纯度(或不纯度)最大程度上得到提升。这样可以确保每次划分都能够更好地区分不同类别的样本,使得决策树能够更准确地进行分类或预测。

因此,对于决策树算法来说,划分特征变量和目标变量是一个整体的过程,两者都需要同时进行考虑来构建决策树模型。

这段代码是决策树算法中的一部分,用于递归地生成决策树的子树。

首先,通过 `feature_values >= my_tree.split_value` 来创建一个布尔数组,其中为 `True` 的位置表示特征值大于等于划分点的样本,为 `False` 的位置表示特征值小于划分点的样本。

然后,使用布尔数组对特征矩阵 X 和目标变量数组 y 进行索引,获取满足条件的子集。即,`X[feature_values >= my_tree.split_value]` 对应划分点大于等于的特征值样本子集,`y[feature_values >= my_tree.split_value]` 对应划分点大于等于的目标变量子集。

接着,调用 `self.generate_tree` 方法,使用划分点大于等于的子集作为新的训练数据集,递归地生成划分点大于等于的子树。将子树生成的结果存储在 `my_tree.subtree` 字典中,以字符串 `up_part` 作为键。

类似地,对划分点小于的样本,重复上述步骤,生成划分点小于的子树,并将子树结果存储在 `my_tree.subtree` 字典中,以字符串 `down_part` 作为键。

通过递归地生成子树,最终可以构建出完整的决策树模型,每个节点都有对应的子树。这样,在进行预测时,可以根据特征值的取值沿着决策树递归地进行判断,直到达到叶子节点,从而得到预测结果。

在连续值里,划分完这个属性后没有drop掉,后面可能还要再用

对于py而言,数组下标可以是一个bool数组

这个就是一个布尔数组,

这是先在最优属性里找到X下里面的特征值,然后得到最好的划分值后,就是一个数组对一个值的比较,就返回了与原来那个数组相同格式的布尔数组

然后就是x,y数组的下标是一一对应的,就在原来X,Y数组的基础上,继续划分了子集

axis=0为每一列,=1为每一行

这个apply方法就是说将函数predict,应用到x数组里的每一行,如果是0的话就是每一列

是个回调函数

`shape[0]`是一个numpy数组的属性,用于获取数组的第一个维度的大小。对于二维数组来说,`shape[0]`表示行数,`shape[1]`表示列数。

在这个公式中,`Dv1`和`Dv2`是两个子集,`Dv1.shape[0]`表示子集`Dv1`的样本数量(行数),`Dv2.shape[0]`表示子集`Dv2`的样本数量(行数)。

这个公式是计算基尼指数(gini index)。基尼指数用于衡量数据集的不纯度,对于二分类问题,它可用于评估某个特征在划分数据集时的有效性。

在这个公式中,通过使用子集的样本数量(行数)除以总样本数量m,计算出每个子集的权重。然后,分别乘以对应子集的基尼不纯度(`self.gini(Dv1)`和`self.gini(Dv2)`),并将两者相加,得到最终的基尼指数。

基尼指数越小,表示数据集的纯度越高,划分的效果越好。通过选择基尼指数最低的特征作为划分标准,可以在决策树算法中进行有效的特征选择和划分。

y.shape[0]得到样本总数,然后value_counts(y)就是得到y的不同取值在y里出现的频率,p是一个数组,所以是sum(p**2),即P^2然后累和

如果是连续的话,那么必定连续,必定可排序,在连续的序列中找到分割点

如果是离散的话,不关联,不可排序,直接依据不同的属性向下分类,就不需要再找分割点了

就是说选好属性后,如果是连续的话,这个属性下面可以有无数的值,所以就需要进一步确定分割点;但如果离散的话,是有限的取值,在选好属性后就直接向下分类即可

所以对于连续的,不仅要返回分好后的结果,还需要返回一个分解值,有了这个值才会最终确定,就是说返回了两个值,而离散的话就返回一个值

D是一个字典,说的是把x,y的数值放到X,Y里

X.SHAPE[1]返回的是X的特征值数量

这个代码行表示创建一个numpy数组A,其长度为X数组的第二个维度的大小,并依次填充为从0到X数组的第二个维度大小减1的整数。其中X是一个多维数组。

a in A就是说开始遍历特征的编号,X[:,a]是说,选取X里所有的a的取值,然后再去重,保存在avs里

开始遍历X的每一行,就是每个数据

这段代码的目的是用于判断特定情形下是否需要停止生成决策树并返回叶子节点的预测值。

A的数组里,在处理完后放的都是不同的数据

首先,代码通过`np.unique(y)`来获取标签向量y中的唯一类别,并将其赋值给变量`unique_classes`。

然后,代码检查`unique_classes`中的类别数量是否为1,即`len(unique_classes)==1`。如果是,说明所有样本的标签都属于同一类别,无需继续进行决策树的生成,直接返回该类别作为叶子节点的预测值。

接着,代码将标志变量`flag`设置为True,用于记录是否存在可以继续划分的特征。

接下来,代码通过遍历特征集合A中的每个特征a,来检查特征矩阵X[:,a]中的唯一取值的数量是否大于1,即`len(np.unique(X[:,a]))>1`。如果存在某个特征a对应的取值有多个,则将`flag`设置为False,表示可以继续划分数据集。

如果遍历完所有特征后,仍然`flag`为True,说明特征集合A中的每个特征的取值都相同,无法继续进行划分,直接返回标签向量y中出现频率最高的类别作为叶子节点的预测值。

总结起来,这段代码的作用是先检查是否所有样本的标签都属于同一类别,如果是,则返回该类别作为叶子节点的预测值;然后检查是否存在可以继续划分的特征,如果没有,则返回标签向量y中出现频率最高的类别作为叶子节点的预测值。


http://www.mrgr.cn/news/78564.html

相关文章:

  • 从 App Search 到 Elasticsearch — 挖掘搜索的未来
  • uniapp手机端一些坑记录
  • Java中的final关键字详解
  • Java基础面试题08:Java中Exception和Error有什么区别?
  • 力扣第 71 题 简化路径
  • 详解Rust泛型用法
  • 【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践
  • 《Django 5 By Example》阅读笔记:p388-p454
  • 使用C#开发VTK笔记(一)-开发环境搭建
  • 开发指南080-邮箱录入控件
  • 单细胞细胞通讯全流程分析教程,代做分析和辅导
  • 《深入理解经典广度优先遍历算法》
  • C语言 qsort及应用
  • 每天五分钟深度学习PyTorch:搭建卷积神经网络完成手写字体识别
  • DAMODEL丹摩|Faster-Rcnn训练与部署实战
  • 【AIGC】大模型面试高频考点-RAG中Embedding模型选型
  • Ubuntu24.04初始化教程(包含基础优化、ros2)
  • 屏幕分辨率|尺寸|颜色深度指纹
  • Git(一)基本使用
  • 【计网笔记】网络层
  • 分布式系统积累与笔记
  • 【Db First】.NET开源 ORM 框架 SqlSugar 系列
  • Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)
  • 一些面试问题的深入与思考
  • JAVA篇07 —— 异常
  • 68000汇编实战01-编程基础