机器学习之决策树(一)
一、何为决策树
决策树(Decision Tree)是一种直观且易于理解的机器学习算法,它通过模拟人类决策过程来解决分类和回归问题。作为一种监督学习算法,决策树具有可解释性强、不需要特征归一化、能处理混合类型数据等优点,广泛应用于医疗诊断、金融风控、客户分类等领域。
本文将从决策树的基本原理出发,详细介绍其工作机制,并通过 Python 代码实现一个完整的决策树模型案例,帮助读者快速掌握这一经典算法。
下面通过一个简单的例子来阐述它的执行流程。假设根据大量数据(含 几个指标:纹理,根蒂,触感,色泽)构建了一棵“可预测西瓜的好坏”的决策树(如下图所示)。

如上决策树分类图所示:从根节点(绿框)开始,对实例的某一特征(纹理、根蒂、色泽)进行测试,根据测试结果将实例分配到其内部节点(蓝框),此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶节点(橙框),最后将实例分到叶节点的类中。
1、决策树的组成
决策树由结点和有向边组成。结点有两种类型:内部结点(圆)和叶结点(矩形)。其中,内部结点表示一个特征(属性);叶结点表示一个类别。而有向边则对应其所属内部结点的可选项(属性的取值范围)。

在用决策树进行分类时,首先从根结点出发,对实例在该结点的对应属性进行测试,接着会根据测试结果,将实例分配到其子结点;然后,在子结点继续执行这一流程,如此递归地对实例进行测试并分配,直至到达叶结点;最终,该实例将被分类到叶结点所指示的结果中。
在决策树中,若把每个内部结点视为一个条件,每对结点之间的有向边视为一个选项,则从根结点到叶结点的每一条路径都可以看做是一个规则,而叶结点则对应着在指定规则下的结论。这样的规则具有互斥性和完备性,从根结点到叶结点的每一条路径代表了一类实例,并且这个实例只能在这条路径上。从这个角度来看,决策树相当于是一个 if-then 的规则集合,因此它具
有非常好的可解释性(白盒模型),这也是为什么说它是机器学习算法中最“友好”的一个原因。
2、决策树的构造
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
1) 选择最佳特征:构建根节点,将所有训练数据都放在根节点,根据某种指标(如信息增益、信息增益比、基尼系数等)选择最能区分数据的特征作为当前节点的分割标准。
2)数据分割:根据选择的特征将数据集分割成子集,每个子集对应特征的一个取值。如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到对应的叶节点中去;如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。
3)递归构建子树:对子集重复上述过程,构建子树,直到满足停止条件(如达到最大树深度、叶节点数据量小于最小样本数等)。
4)生成叶节点:当无法进一步分割时(基本正确分类或没有合适特征),生成叶节点并赋予分类或回归结果。最后每个子集被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
决策树的本质是从训练集中归纳出一套分类规则,使其尽量符合以下要求:
1. 具有较好的泛化能力;
2. 在 1 的基础上尽量不出现过拟合现象。
二、熵
1、熵的作用
熵(Entropy)是表示随机变量不确定性的度量。说简单点就是物体内部的混乱程度。比如下边的两幅图中,从 图1 到 图2 表示了熵增的过程。对于决策树的某个结点而言,它在对样本数据进行分类后,我们当然希望分类后的结果能使得整个样本集在各自的类别中尽可能有序,即希望某个特征在被用于分类后,能最大程度地降低样本数据的熵

2、熵的定义
熵定义为信息的期望值,如果待分类的事物可能划分在多个类之中,则符号
的信息定义为:
![]()
其中,
是选择该分类的概率。
为了计算熵,我们需要计算所有类别所有可能值所包含的信息期望值,通过下式得到:
![]()
其中,n为分类数目,熵越大,随机变量的不确定性就越大。
验证(熵越大,随机变量的不确定性就越大):
当随机变量只取两个值,例如1,0时,即X的分布为
![]()
熵为
![]()
这时,熵
随着概率p变化的曲线如下图所示:

当p=0或p=1时
,随机变量完全没有不确定性。当p=0.5时,
,熵取值最大,随机变量的不确定性最大。
3、熵的计算
例如,现在有两个集合:𝐴 = { 1,2 } , 𝐵 = { 1,2,3,4,5,6 } ,若以这两个集合为取值空间,则可分别计算其熵。
对于集合 𝐴 ,先计算其分布列为

于是可得到其熵为:

对于集合 𝐵 ,计算其分布列为:
于是可得到其熵为:
结果显示,𝐴 集合的熵值要低一些,从两个集合的内容也能很轻易看出: 𝐴 集合只有两种类别,相对稳定;而 𝐵 集合中的类别过多,显得混乱。从另一个角度看:若视集合 𝐴 为“抛 1 次硬币的结果”;视集合 𝐵 为“掷 1 次骰子的结果”,则显然掷骰子的不确定性比投硬币的不确定性要高。
4、条件熵
条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,随机变量X给定的条件下随机变量Y的条件熵 (conditional entropy) H(Y|X),定义X给定条件下Y的条件概率分布的熵对X的数学期望:![]()
其中,![]()
例:在给定属性A的条件下,数据集D的条件熵表示在属性 A上分裂后,数据集的不确定性。假设性A有v个可能的取值,将数据集D分成 n个子集
其中
是A取第i个值时的数据子集,则属性A 的条件熵定义为:
![]()
当熵和条件熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵和条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
三、划分选择
从前面的讨论可以知道,决策树学习的关键在于:如何选择最优划分属性。一般而言,随着划分过程的不断进行,我们自然希望决策树各分支结点所包含的样本尽可能属于同一类别,即结点的 “纯度” (purity) 越来越高。下面介绍几类较为主流的评选算法。
1、信息增益( ID3 算法选用的评估标准)
信息增益:信息增益是相对于特征而言的,表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。所以,特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即:g(D,X)=H(D)−H(D∣X)
一般地,熵H(D)与条件熵H(D|A)之差成为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
信息增益值的大小相对于训练数据集而言的,并没有绝对意义,在分类问题困难时,也就是说在训练数据集经验熵大的时候,信息增益值会偏大,反之信息增益值会偏小,使用信息增益比可以对这个问题进行校正,这是特征选择的另一个标准。
2、信息增益率( C4.5 算法选用的评估标准)
信息增益比:特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)与训练数据集D的关于特征A的值的熵
之比,即:
![]()
其中,
,n是特征A取值的个数。
例:
假设有一个数据集 D,包括以下实例:

我们要计算在属性“天气”上进行分裂的信息增益。
1.计算数据集D的熵:总共6个实例,其中3个玩游戏(是),3个不玩游戏(否)。
概率
,![]()
熵 ![]()
2. 计算在“天气”属性上分裂后的条件熵
:
“天气”属性有三个取值:阳光、阴天、雨天。
计算每个子集的熵:

3、基尼系数( CART 算法选用的评估标准)
基尼指数(Gini Index)通过度量数据集的不纯度(或不一致性),来决定如何分裂节点。具体来说,基尼系数用于衡量一个节点的纯度程度,数值范围在0到0.5之间,其中0表示节点纯度最高(即节点内的样本全属于同一类),0.5表示节点纯度最低(即节点内的样本均匀分布在各类中)。
基尼指数:分类问题中,假设有 K 个类,样本点属于第 k 类的概率为pk,则概率分布的基尼指数定义为
![]()
对于二类分类问题,若样本点属于第 1 个类的概率为p,则概率分布的基尼指数为
![]()
对于给定的样本集合 D,其基尼指数为
![]()
这里,Ck是 D 中属于第 k 类的样本子集,K 是类的个数。
如果样本集合 D 根据特征 A 是否取某一可能值 a 被分割成D1和D2两部分,即
![]()
则在特征 A 的条件下,集合 D 的基尼指数定义为
![]()
基尼指数 Gini(D) 表示集合 D 的不确定性,基尼指数 Gini(D, A) 表示经 A = a 分割后集合 D 的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似
四、特征选择
在特征选择过程中,基尼系数用于评估每一个特征的分裂效果。具体步骤如下:
1.计算初始节点的基尼系数: 计算当前节点(即父节点)的基尼系数![]()
2.计算特征的基尼系数:对于每一个候选特征,基于该特征的不同取值将数据集D划分为若干子集
并计算这些子集的加权基尼系数。假设第J个特征有m个取值,计算该特征的基尼系数:
![]()

选择最优特征:选择基尼系数最小的特征作为当前节点的分裂特征,即选取能够最大程度减少不纯度的特征。
例:
基尼系数在决策树中的作用是通过衡量节点纯度,帮助选择最优的分裂特征,从而构建更有效的分类模型。使用基尼系数能够在较大程度上减少数据的不纯度,提高分类的准确性。
五、常用决策树算法
1.ID3(Iterative Dichotomiser 3)
特点:
• ID3 是基于信息增益(Information Gain)作为特征选择的标准来构建决策树的。
• 主要用于分类问题。
• 只能处理离散特征,不能直接处理数值型数据。
• 不支持剪枝,容易过拟合。
• 构建的树通常是二叉树或多叉树。
计算过程:
1. 计算数据集的总熵。
2. 对每个特征,计算信息增益。
3. 选择信息增益最大的特征作为节点。
4. 根据选定的特征分割数据集,重复以上步骤,直至所有特征被使用,或数据不再可分
2. C4.5
特点:
• C4.5 是 ID3 算法的改进版本,使用信息增益比(Gain Ratio)来选择特征。
• 可以处理离散和连续特征。
• 引入了树的剪枝技术,减少过拟合。
• 结果通常是多叉树,而非二叉树。
计算过程:
1. 使用信息增益比而非信息增益作为特征选择的标准。
2. 对于连续特征,找到一个“最优”切分点将数据分为两部分,以最大化信息增益比。
3. 递归构建决策树。
4. 构建完整树后,应用剪枝技术,剪去那些对最终预测准确性贡献不大的分支。
3. CART(Classification and Regression Tree)
特点:
• CART 是一种既可以用于分类也可以用于回归的决策树算法。
• 使用基尼指数(Gini Index)作为分类任务的特征选择标准;使用最小二乘偏差(Least Squares Deviation)作为回归任务的标准。
• 始终构建二叉树。
• 内置有剪枝机制,使用成本复杂度剪枝(Cost Complexity Pruning)来防止过拟合。
计算过程:
1. 对于分类任务,选择基尼指数最小的特征进行分割。
2. 对于回归任务,选择使得结果变量的平方误差最小化的特征进行分割。
3. 递归分割直至满足停止条件(如节点大小、树深度等)。
4. 应用剪枝策略,通过设定不同的参数优化模型的泛化能力。
六、决策树的剪枝
1.为什么需要剪枝
决策树容易在训练数据上过拟合,尤其是当树变得特别深或复杂时。过拟合的树可能在训练数据上表现得很好,但在新的、未见过的数据上表现不佳。剪枝有助于减少这种过拟合,从而提高模型的泛化能力。剪枝通过去除决策树中的某些分支来实现,这些分支可能代表过度拟合训练数据的噪声或异常值。
2.剪枝的类型
决策树剪枝主要有两种类型:
1. 预剪枝(Pre-pruning):在决策树完全形成之前停止树的进一步生长。预剪枝的方法包括限制树的最大深度、限制节点中的最小样本数、或者当信息增益低于某个阈值时停止分裂。
2. 后剪枝(Post-pruning):首先构建决策树,让它成长到最大深度,然后开始移除那些对最终决策不产生重要影响的叶节点。常见的后剪枝技术包括成本复杂度剪枝(Cost Complexity Pruning,简称CCP)。
成本复杂度剪枝(CCP)
成本复杂度剪枝是一种常用的后剪枝方法,它通过引入“复杂度参数”(通常表示为α)来平衡树的大小和模型的拟合度。具体步骤如下:
• 计算每个节点的错误率:在树的每个节点计算错误分类的代价。
• 计算每个节点的“净增益”:这是通过将节点的错误率与树的复杂度(如树的深度或节点数)结合起来计算的。
• 选择合适的α:通过交叉验证或其他方法选择一个最优的α值。
• 剪枝:对于每个内部节点,如果移除该节点(及其所有子节点)并将其替换为叶节点能减少复杂度调整后的总错误率,则执行这一剪枝操作。
可以看出,剪枝的生效仅仅只是通过提高信息度量(或信息增益比)对训练数据进行更好的拟合。通过正则化对拟合损失和模型复杂度进行权衡,从而实现剪枝。在生产系统中剪枝模型可以有效的选择出准确率更高的模型。
式(1)或(4)定义的损失函数的极小化等价于正则化的极大似然估计。因此,利用损失函数的原则进行剪枝就是利用正则化的极大似然估计进行模型选择。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)