gini系数 决策树_深入浅出决策树

本文深入探讨了决策树的工作原理,重点介绍了信息熵、信息增益、信息增益率和Gini指数在构建决策树过程中的作用。通过对ID3、C4.5、CART算法的比较,阐述了如何选择最佳划分特征,以及如何通过预剪枝和后剪枝优化决策树。此外,还讨论了决策树的优点和缺点,如过拟合问题,以及在处理不同类型数据时的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

f458af7a19fe51e8c9508eee3721a5b2.png

什么是决策树

机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。

c6a5d217e11fcd02adc9ffac5bed41b8.png

决策的形式以树的形式进行示意和编码,就形成了决策树

决策树是怎样工作的?

决策树的学习本质上就是从训练数据集中归纳出一组分类规则,使它与训练数据矛盾较小的同时具有较强的泛华能力。从另一个角度看,学习也是基于训练数据集估计条件概率模型。

在面对多个属性的数据时,决策树的做法是每次选择一个属性进行判断,如果不能得出结论,继续选择其他属性进行判断,直到能够“肯定地”判断出结果或者是上述属性都已经使用完毕。

如何构建决策树?

那么问题就来了,如何构建一棵决策树呢?决策树的构建是数据逐步分裂的过程,构建的步骤如下:

步骤1:将所有的数据看成是一个节点,进入步骤2;

步骤2:从所有的数据特征中挑选一个数据特征对节点进行分割,进入步骤3;

步骤3:生成若干孩子节点,对每一个孩子节点进行判断,如果满足停止分裂的条件,进入步骤4;否则,进入步骤2;

步骤4:设置该节点是子节点,其输出的结果为该节点数量占比最大的类别。

从上述步骤可以看出,决策生成过程中有三个重要的问题:

  • 如何选择分裂的特征
  • 数据如何分割
  • 什么时候停止分裂

决策树的构建算法主要有ID3、C4.5、CART三种,其中ID3和C4.5是分类树,CART是分类回归树,其中ID3是决策树最基本的构建算法,而C4.5和CART是在ID3的基础上进行优化的算法。

ID3 使用信息增益作为选择特征的准则;

C4.5 使用信息增益比作为选择特征的准则;

CART 使用 Gini 指数作为选择特征的准则。

决策树的特征选择算法

决策树学习的关键在于如何选择最优的划分属性,所谓的最优划分属性,对于二元分类而言,就是尽量使划分的样本属于同一类别,即“纯度”最高的属性。那么如何来度量特征(features)的纯度,这时候就要用到“信息熵”和"信息增益","信息增益率”以及“基尼系数”等概念。

信息熵

68f77e49fda32657f5ad3209de4fe607.png

9c69b5ed7fb8c604268459df67e1aa32.png

信息增益

ec3234950822e8ac06dd9a615e10cbef.png

0b367f64d52569b2db4aeb804702c3dc.png

信息增益的理解:

​ 对于待划分的数据集D,其 entroy(前)是一定的,但是划分之后的熵 entroy(后)是不定的,entroy(后)越小说明使用此特征划分得到的子集的不确定性越小(也就是纯度越高),因此 entroy(前) - entroy(后)差异越大,说明使用当前特征划分数据集D的话,其纯度上升的更快。而我们在构建最优的决策树的时候总希望能更快速到达纯度更高的集合,这一点可以参考优化算法中的梯度下降算法,每一步沿着负梯度方法最小化损失函数的原因就是负梯度方向是函数

决策树Gini系数是一种衡量数据集纯度的指标,用于选择最佳的划分特征。下面是一个简单的示例代码,用于计算决策树节点的Gini系数: ```python import numpy as np def gini_index(groups, classes): # 计算总样本数量 total_samples = sum(len(group) for group in groups) # 初始化Gini系数 gini = 0.0 # 遍历每个组 for group in groups: size = float(len(group)) # 避免除以0的情况 if size == 0: continue score = 0.0 # 计算每个类别在当前组中的比例 for class_val in classes: p = [row[-1] for row in group].count(class_val) / size score += p * p # 根据组的大小加权计算Gini系数 gini += (1.0 - score) * (size / total_samples) return gini # 示例数据集 dataset = [[2.771244718,1.784783929,0], [1.728571309,1.169761413,0], [3.678319846,2.81281357,0], [3.961043357,2.61995032,0], [2.999208922,2.209014212,0], [7.497545867,3.162953546,1], [9.00220326,3.339047188,1], [7.444542326,0.476683375,1], [10.12493903,3.234550982,1], [6.642287351,3.319983761,1]] # 示例划分特征和类别 split_feature = 0 split_value = 6.642287351 left_group = [[2.771244718,1.784783929,0], [1.728571309,1.169761413,0], [3.678319846,2.81281357,0], [3.961043357,2.61995032,0], [2.999208922,2.209014212,0]] right_group = [[7.497545867,3.162953546,1], [9.00220326,3.339047188,1], [7.444542326,0.476683375,1], [10.12493903,3.234550982,1], [6.642287351,3.319983761,1]] # 计算Gini系数 classes = np.unique([row[-1] for row in dataset]) gini = gini_index([left_group, right_group], classes) print('Gini Index:', gini) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值