决策树-ID3、C4.5
决策树可用于分类( ),也可用于回归(),同时适合集成学习比如随机森林。
决策树学习分3步:特征选择、决策树的生成、剪枝。
一、分类决策树模型与学习
1.决策树模型
分类决策树模型由结点和有向边组成。
结点分两部分:内部节点、叶节点。内部结点表示一个特征或属性,叶节点表示一个类。
2.决策树学习
假设训练集
其中, 为输入实例(特征向量), 为特征个数, 为类标记, 为样本容量。
学习目标:构建决策树模型,能对实例进行正确分类。
学习本质:从训练集中估计条件概率模型。
决策树学习用损失函数表示这一目标,决策树损失函数是正则化的极大似然函数。
决策树常用算法:、、 ,结合这些算法分别叙述特征选择、决策树的生成、剪枝。
二、特征选择
特征选择的准则通常是:信息增益、信息增益比、基尼系数。
1.信息增益
熵:度量随机变量的不确定性,越不确定,熵就越大。随机变量 的熵定义为
其中 代表 的 种不同的离散取值。而 代表 取值为 的概率,通常 是以 或 为底的对数。
由定义可知,熵只依赖 的分布,与 的取值无关。所以也可将随机变量 的熵定义为
例 :当随机变量只有两个取值 时。
解:如果取值概率各为 时, 的熵最大, 具有最大的不确定性为:
。
如果一个值的概率大于 ,另一个值的概率小于 ,则不确定性减小,对应的熵减小。比如一个概率 ,一个概率 ,则熵为:
。
熵 随概率 变换的曲线(以 为底)。
联合熵:已知熵容易推广到联合熵,这里给出两个变量 和 的联合熵:
条件熵:已知联合熵容易推广到条件熵,条件熵表示已知 的条件下 的不确定性。
信息增益:也称互信息,表示已知 的条件下 不确定性减少的程度。
信息增益算法:
训练集为 , 表示样本容量,即样本个数。设有 个类 ,, 为类 的样本个数,。
设特征 有 个不同的取值 ,根据特征 的取值将 划分为 个子集 , 为 的样本个数,。记子集 中输入类 的样本集合为 ,即 , 为 的样本个数。
输入:训练集 和 特征 ;
输出:特征 对训练集 的信息增益 。
① 计算数据集 的熵 。(也称经验熵)
② 计算特征 对数据集 的条件熵 。(也称经验条件熵)
③ 计算信息增益。
例 : 下表由15个样本组成的贷款申请训练数据。包括4个特征:
年龄:青年、中年、老年;
工作:是、否;
房子:是、否;
信贷:非常好、好、一般。
ID | 年龄 | 有工作 | 有自己的房子 | 信贷情况 | 类别 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 一般 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 一般 | 是 |
5 | 青年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 一般 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 非常好 | 是 |
10 | 中年 | 否 | 是 | 非常好 | 是 |
11 | 老年 | 否 | 是 | 非常好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 非常好 | 是 |
15 | 老年 | 否 | 否 | 一般 | 否 |
解:计算熵 。
然后计算各特征对数据集 的信息增益。分别以 表示年龄、有工作、有房子、信贷 个特征。
①
这里 分别是 中 (年龄)取值为青年、中年、老年的样本子集。
②
③
④
由于 的信息增益最大,所以选择 为最优特征。
2.信息增益比
以信息增益划分训练集的特征,容易偏向选择取值较多的特征。使用信息增益比可以对矫正这个问题。
信息增益比:
信息增益比 为信息增益 与训练集 关于特征 的值的熵 之比。
其中,, 为特征 的取值个数。
三、决策树的生成
1. ID3 算法
算法核心:用信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点,递归地构建决策树,直到信息增益都很小或没有特征可以选择为止。
输入:训练集 ,特征集 阈值 ;
输出:决策树 。
① 若 中所有实例属于同一类 ,则 为单结点树,并将类 作为该结点的类标记,返回 ;
② 若 ,则 为单节点树,并将 中实例数最大的类 作为该结点的类标记,返回 ;
③ 否则,按信息增益算法计算 中各特征对 的信息增益,选择信息增益最大的特征 ;
④ 如果 的信息增益小于阈值 ,则置 为单结点树,并将 中实例数最大的类 作为该结点的类标记,返回 ;
⑤ 否则,对 的每一可能值 ,依 将 分割为若干非空子集 ,将 中实例数最大的类作为标记,构建子结点,由节点及子结点构成树 ,返回 ;
⑥ 对第 个子结点,以 为训练集,以 为特征集,递归地调用步骤 ,得到子树 ,返回 。
例 :对例 中的数据,利用 算法建立决策树。
解:由于特征 (有自己的房子)信息增益最大,所以 作为根节点,
由于 有两个取值,所以将数据集 分为 (是)和 (否)。 只有同一类样本点,即允许贷款,所以是叶节点。
对 从 中选择新的特征。计算各特征信息增益:
选择特征 (有工作)作为结点的特征。
由于 两个取值,所以数据集 划分为两个子结点:一个对应“是”(有工作)的子结点,包含 个样本,属于同一类,即允许贷款,所以是叶结点;另一个对应“否”(无工作)的子结点,包含 个样本,也属于同一类,即不允许贷款,所以也是叶结点。
最终生成的决策树:
2. C4.5 算法
对 进行改进,用信息增益比来选择特征。
输入:训练集 ,特征集 阈值 ;
输出:决策树 。
① 若 中所有实例属于同一类 ,则 为单结点树,并将类 作为该结点的类标记,返回 ;
② 若 ,则 为单节点树,并将 中实例数最大的类 作为该结点的类标记,返回 ;
③ 否则,按信息增益算法计算 中各特征对 的信息增益,选择信息增益最大的特征 ;
④ 如果 的信息增益比小于阈值 ,则置 为单结点树,并将 中实例数最大的类 作为该结点的类标记,返回 ;
⑤ 否则,对 的每一可能值 ,依 将 分割为若干非空子集 ,将 中实例数最大的类作为标记,构建子结点,由节点及子结点构成树 ,返回 ;
⑥ 对第 个子结点,以 为训练集,以 为特征集,递归地调用步骤 ,得到子树 ,返回 。
3. ID3 的不足
① 不能处理连续值,比如长度、密度都是连续的,无法在 运用。
② 用信息增益选择特征容易偏向取值较多的特征。在相同条件下,取值较多的特征比取值较少的特征信息增益大。比如一个变量 个值,各位 ,另一个变量 个值,各为 ,其实它们都是完全不确定的变量,但取 个值比取 个值的信息增益大。
③ 不能处理缺失值。
④ 没考虑过拟合问题。
4. C4.5 对 ID3 的改进
1.信息增益比
对 进行改进,用信息增益比来选择特征。
2.连续值处理
连续特征的取值数目是无限的,不能直接根据连续特征的取值来对结点进行划分,需连续特征离散化。最简单的二分法。
① 将 个连续值从小到大排列。
给定样本集 和连续特征 ,特征 在 上有 个不同的取值,经从小到大排列,记为 。
② 取相邻两样本值的中位点(平均值),得到 个划分点。
特征 的第 个划分点记为 ,然后,就可像离散特征值一样来考察这些划分点。
③ 用信息增益最大的点作为最优的划分点进行样本集的划分。
④ 用信息增益比来选择特征,构建决策树。
注意:
- 与离散特征不同,若当前结点为连续特征,该特征还可作为后代结点的划分特征。
- 选择划分点用信息增益,选择特征用信息增益比。
例 :西瓜数据集上的两个连续特征 “密度”、"含糖率"。
编号 | 密度 | 含糖率 | 好瓜 |
---|---|---|---|
1 | 0.697 | 0.460 | 是 |
2 | 0.774 | 0.376 | 是 |
3 | 0.634 | 0.264 | 是 |
4 | 0.608 | 0.318 | 是 |
5 | 0.556 | 0.215 | 是 |
6 | 0.403 | 0.237 | 是 |
7 | 0.481 | 0.149 | 是 |
8 | 0.437 | 0.211 | 是 |
9 | 0.666 | 0.091 | 否 |
10 | 0.243 | 0.267 | 否 |
11 | 0.245 | 0.057 | 否 |
12 | 0.343 | 0.099 | 否 |
13 | 0.639 | 0.161 | 否 |
14 | 0.657 | 0.198 | 否 |
15 | 0.360 | 0.370 | 否 |
16 | 0.593 | 0.042 | 否 |
17 | 0.719 | 0.103 | 否 |
① 对连续特征 “密度”,将 个样本值从小到大排列。
② 取相邻两样本值的中位点,得到 个划分点。
③ 选取信息增益最大的点作为最优的划分点进行样本集的划分。
所以特征 “密度” 的信息增益为 ,对应划分点 。密度小于 的是坏瓜,大于 是好瓜。
特征 “含糖率” 的信息增益为 ,对应划分点 。
④ 用信息增益比来选择特征,构建决策树。
3.缺失值处理
主要解决两个问题:
① 如何在数据缺失的情况下进行划分特征选择。
② 给定划分特征,若样本在该特征上的值缺失,如何对样本进行划分。
给定训练集 和特征 ,令 表示 中在特征 上没有缺失值的样本子集。
对问题 ①:
我们可根据 来进行特征选择。假定特征 有 个可取值 ,
令 表示 中在特征 上取值为 的样本子集,
表示 中第 类的样本子集,
假定为每个样本 赋予一个权重 ,并定义
对特征 , 表示无缺失值样本所占的比例, 表示无缺失值样本中第 类所占的比例, 表示无缺失值样本中在属性 上取值 的样本所占的比例。显然,,。
此时信息增益:
对问题 ②:
若样本 的划分特征已知,则将 划入该特征对应的子结点,且样本权值在子结点中保持为 。
若样本 的划分特征未知,则将 划入所有子结点,且样本权值在各个子结点中调整为 ,这就让同一样本以不同的概率划入到不同的子结点中。
例 :西瓜数据集出现缺失值,仅有编号 完整。
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | — | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | — | 是 |
3 | 乌黑 | 蜷缩 | — | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | — | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | — | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | — | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | — | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | — | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | — | 否 |
12 | 浅白 | 蜷缩 | — | 模糊 | 平坦 | 软粘 | 否 |
13 | — | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | — | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | — | 浊响 | 稍糊 | 稍凹 | 硬滑 | 否 |
解:根节点包含样本集 中全部 个样例,各样例的权值为 。
以特征 “色泽” 为例,令该特征上无缺失值的样本子集为 ,包含的编号为 ,共 个,
的信息熵为
令 表示特征 “色泽” 的取值 “青绿”,“乌黑”,“浅白”,
因此,样本子集 上特征 “色泽” 的信息增益为
样本集 上特征 “色泽” 的信息增益为
同理
"纹理" 在所有特征中信息增益最大,用于对根结点进行划分。
划分结果使编号为 的样本进入 “纹理=清晰” 分支;
编号为 的样本进入 “纹理=稍糊” 分支;
编号为 的样本进入 “纹理=模糊” 分支,且样本在各子结点中的权重保持为1。
而编号为 的样本在特征 “纹理” 上出现缺失,因此它将同时进入三个分支汇总,权重在三个子结点中分别为 ,编号为 同理。
最终生成的决策树:
5. C4.5 的不足
① 生成的是多叉树。 决策树是二叉树,二叉树模型比多叉树运算效率高。
② 只能用于分类。 即可用于分类,也可用于回归。
③ 使用了熵模型,在计算时有大量的对数运算,如果是连续值还有大量排序运算。因此 用基尼系数代替熵模型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)