决策树分裂

本文深入讲解决策树算法,包括其工作原理、构建过程及ID3、C4.5算法的具体应用。通过实例演示如何根据天气状况决定是否打高尔夫球,详细解析信息熵、信息增益及信息增益率的计算。

什么是决策树

举个校园相亲的例子,今天校园的小猫(女)和小狗(男)准备配对,小猫如何才能在众多的优质🐶的心仪的狗呢?于是呢?有一只特乖巧的小猫找到了你,你正在学习机器学习,刚好学习了决策树,准备给这只猫猫挑选优质狗,当然,你不仅仅是直接告诉猫哪些狗是合适你的?你更应该详细的给猫讲解决策树是如何根据它提出的标准选出的符合要求的狗呢?
猫给出如下信息:
年龄<0.5 不心仪;年龄大于>=0.5 6.5<=体重<=8.5;心仪; 年龄>=0.5 体重>8.5 长相好 心仪;其余情况不心仪; 根据上述条件可以构造一颗树:

上面的图就是决策树,最终的结果是心仪或者不心仪。决策树算法以树形结构表示数据分类的结果

基本概念

决策树属于也只能非参数学习算法、可以用于解决(多)分类问题,回归问题。 回归问题的结果,叶子结点的平均值是回归问题的解。
根节点:决策树具有数据结构里面的二叉树、树的全部属性
非叶子节点 :(决策点) 代表测试的条件,数据的属性的测试
叶子节点 :分类后获得分类标记,最后没有异议条件的节点
分支: 测试的结果

训练算法

基于信息熵的构造

当选择某个特征作为节点时,我们就希望这个特征的信息熵越小越好,那么不确定性越小


njnj: 第j个类别,在样本中出现的频数
SS: 样本个数
对于离散属性,直接计算信息熵,连续属性,就需要划分区间,按区间计算信息熵。

  1. 基于某一层的数据集 a. 遍历计算所有属性,遍历相应属性以不同值为分截点的信息熵 b. 选择信息熵最小的作为节点
  2. 如果到达终止条件,返回相应信息,否则,按照分支重复步骤1    

        ID3算法: 信息增益最大化

决策树构建过程:

1、将所有训练数据集放在根节点上;

2、遍历每种属性的每种分割方式,找到最好的分割点;

3、根据2中最好的分割点将根节点分割成多个子节点(大于等于2个);

4、对剩下的样本和属性重复执行步骤2、3,直到每个子节点中的数据都属于同一类为止。

C4.5算法:

C4.5算法是采用信息增益率来进行节点的分裂的,公式为:,

其中,     ,

,    ,并且要求信息增益率越大越好。

下面举例具体计算,如下图为各种天气下是否打高尔夫球的表格。

DayOutlookTemperatureHumidityWindyPlay Golf
1Sunny8585FN
2Sunny8090TN
3Overcast8378FY
4Rainy7096FY
5Rainy6880FY
6Rainy6570TN
7Overcast6465TY
8Sunny7295FN
9Sunny6970FY
10Rainy7580FY
11Sunny7570TY
12Overcast7290TY
13Overcast8175FY
14Rainy7180TN

步骤1:将所有的节点放在根节点上,计算此时根节点的信息熵为:

步骤2:遍历每种属性的每种分割方式,先看Outlook属性,它有三种取值Sunny, Rainy, Overcast,

,

  

  

  

故按照Outlook属性分裂的话信息增益为:

而Outlook属性本身的分裂信息熵为:

故最终的信息增益率为:

 

接下来计算Humidity的信息增益率。因为Humidity为连续型的属性,故其计算方法相对于离散型的属性计算会复杂很多。

对于Humidity属性,我们先对其进行升序排列如下:

DayHumidityPlay Golf
765Y
670N
970Y
1170Y
1375Y
378Y
580Y
1060Y
1480N
185N
290N
1290Y
895N
496Y

然后就是选取分裂节点,那么对于连续型属性,它的分裂节点是任意相邻的两个取值的中点,我们从第一个开始,取65和70的加权均值:,解释一下,对于65和70这两个数值,

因为65只有一个,70有3个,所以分别乘以1/4和3/4,然后在计算按68.75来分裂的信息熵:

再选取第二个分裂点:

同理可得所有的分裂点的信息熵:

分裂点68.7571.2576.579.581.2588.33391.66795.5
信息熵0.8930.9250.8950.8500.8380.9150.9300.893

 由表可知,节点81.25作为分裂节点时,其信息熵最小,所以信息增益最大,故将此节点作为分裂点。这里用信息增益最大而不是信息增益率最大作为连续型属性分裂节点的评判标准,

是为了防止连续型属性每个取值都对应了一个样本,这样的分裂信息熵就最大了。对于分裂点81.25,其对应的信息增益率的计算如下:

同理对于属性Temperature也是如上的操作,先排序,再算信息熵,结果如下:

分裂点64.566.568.569.570.571.66773.576.66780.58284
信息熵0.8930.930.940.9250.8950.9390.9390.9150.940.930.827

其信息增益率为:

最终得到所有的属性的信息增益率为:

属性OutlookWindyHumidityTemperature
信息增益率0.1560.0490.1090.305

选取信息增益率最大的Temperature属性作为分裂属性,分类结果如下:

对于Temperature <=84的节点继续进行分裂,只不过分裂的时候去掉Temperature属性以及Temperature>84的节点里的样本,重复上面步骤。

 

### 连续属性的决策树分裂方法 在机器学习中,当面对连续属性时,决策树算法通常采用特定的方法来决定最佳分割点。对于连续特征,常见的做法是在该特征的不同取值处尝试划分数据集,并选择能够最大化某个不纯度减少量(如基尼系数或熵减)的最佳切分点[^1]。 具体来说,在构建决策树的过程中: - 对于每一个可能作为节点测试条件的连续变量,考虑其所有潜在的二元切割位置。 - 计算这些候选阈值下子集合内部类别的分布情况以及相应的分类质量指标。 - 选取使得整体样本集纯净度提升最大的那个数值作为实际使用的边界线。 以下是Python实现的一个简单例子,展示了如何利用`sklearn`库中的`DecisionTreeClassifier`处理含有连续型输入的数据并自动寻找最优分裂点: ```python from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier import numpy as np # 加载鸢尾花数据集 data = load_iris() X = data['data'][:, :2] # 只选用前两个特征以便可视化 y = data['target'] # 创建并训练模型 clf = DecisionTreeClassifier(random_state=0) clf.fit(X, y) def find_split_thresholds(tree): """提取给定决策树内用于区分连续特性的临界值""" thresholds = [] n_nodes = tree.node_count children_left = tree.children_left children_right = tree.children_right for i in range(n_nodes): if children_left[i] != children_right[i]: feature_id = tree.feature[i] threshold = tree.threshold[i] thresholds.append((feature_id, threshold)) return thresholds split_points = find_split_thresholds(clf.tree_) print("Split points found by the trained classifier:") for feat_idx, thresh in split_points: print(f"Feature {feat_idx}: Split at value <= {thresh:.3f}") ``` 此代码片段会打印出由训练后的决策树所确定的一系列针对不同维度上的连续特性进行有效分离的具体界限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值