决策树(Decision Tree)基础知识
目录
- 一、回忆
- 1、*机器学习的三要素:
- 1)*函数族
- 2)*目标函数
- 2.1)*模型的其他复杂度参数
- 3)*优化算法
- 2、*前处理/后处理
- 1)前处理:特征工程
- 2)后处理:模型选择和模型评估
- 3、*机器学习开发流程
- 1)数据收集
- 2)特征探索分析
- 3)特征工程
- 4)模型训练
- 5)性能评估
- 二、决策树(Decision Tree)
- a、基本概念
- b、决策树的构建
- 1)初始化
- 2)选择一个合适的树结构
- 3)确定在每个非叶子节点上要使用的特征
- 4)在每个非叶子节点上选择合适的决策规则
- 5)停止划分条件
- 6)剪枝
- *拓展知识:熵 &信息增益
- 1、熵:系统不确定的度量
- 2、数据集的经验熵
- 3、条件熵
- 4、经验条件熵
- 5、信息增益
- 1)信息增益的定义
- 2)ID3算法
- 3)多叉树
- 4)图示说明
- 6、信息增益与决策树分裂
- 1)数据集概览
- 2)总体数据集的信息熵 H ( D ) H(\mathcal{D}) H(D)
- 3)根据特征划分后的信息熵
- 3.1)日志密度L
- 4)信息增益计算
- 5)决策树分裂
- 7、信息增益率
- 1)ID3算法的局限性
- 3)C4.5算法:信息增益率
- 4)总结
- c、决策树的损失函数
- 1)Gini指数
- 2)为什么不使用错误率?
- 3)Gini指数的优势
- 4)图示说明
- 2)错误率 vs. Gini指数
- 2.1)示例说明
- 2.2)决策树分裂效果
- 2.3)左子结点分析
- 左子结点分裂效果
- 2.4)右子结点分析
- 右子结点分裂效果
- 3)分裂后的平均效果
- 3.1)分裂后的平均错误率和熵
- 3.2)分裂前的情况
- 三、分类回归树(Classification And Regression Tree, CART )
- 1、基本概念
- 2、例:离散型特征
- 3、例:连续型特征
- 3.1)根据特征`width`的取值,对所有样本进行排序,得到可能的阈值为:6.25, 6.55, 6.75, 6.95。
- 3.2)根据特征`height`的取值,对所有样本进行排序,得到可能的阈值为:6.3, 8.05, 9.55。
- 4、划分停止条件
- 5、剪枝
- 1)剪枝过程
- 2)剪枝策略
- 3)验证集
- 4)Scikit-Learn中对剪枝的支持
- 四、决策树的优缺点
- 1、决策树模型的优点
- 2、决策树模型的缺点
- 五、DecisionTreeClassifier类
- 1、DecisionTreeClassifier的参数
- 2、DecisionTreeClassifier的属性
- 3、DecisionTreeClassifier的方法
(目录中带*注解的内容为通用部分,非本章节特定内容。)
一、回忆
1、*机器学习的三要素:
- 函数族 F \mathcal{F} F:这是一个函数的集合,其中的每个函数 f f f 都属于这个集合,即 f ∈ F f \in \mathcal{F} f∈F。
- 目标函数 J ( f ) J(f) J(f):这个函数用来衡量函数 f f f 的性能或质量。它是一个评价标准,帮助我们了解函数的好坏。
- 优化算法:我们的目标是找到一个函数 f ∗ f^* f∗,它在函数族 F \mathcal{F} F 中使得目标函数 J ( f ) J(f) J(f) 的值最小。用数学表达式表示就是 f ∗ = arg min f J ( f ) f^* = \arg\min_f J(f) f∗=argminfJ(f)。这意味着我们正在寻找一个函数,它在所有可能的函数中,目标函数的值是最小的。
这些概念是优化问题的基础,也是在优化问题中,我们通常会遇到以下几个关键概念。无论是在机器学习、工程优化还是其他领域,理解和应用这些概念都是至关重要的。
1)*函数族
在机器学习和统计学中,函数族是指一组具有相似形式或结构的函数。以下是一些常见的函数族:
- 线性模型: f ( x ) = w T x f(x) = \mathbf{w}^T x f(x)=wTx,其中 w \mathbf{w} w
是权重向量, x x x 是输入向量。这种模型假设输出是输入的线性组合。- 多项式:一种扩展的线性模型,可以捕捉输入变量之间的非线性关系。
- 核方法:由核函数决定,这种方法可以在高维空间中有效地处理数据,而不需要显式地计算高维特征。
- 决策树:分段常数函数,通过一系列的决策规则将输入空间分割成不同的区域,并为每个区域分配一个常数值。
- 神经网络:由网络结构决定,这是一种模仿人脑神经元连接方式的模型,能够学习和表示复杂的函数关系。
- 集成学习:多棵决策树的加权平均,这种方法通过结合多个模型的预测来提高整体的预测性能。
- 随机森林:一种集成学习方法,通过构建多棵决策树并进行投票或平均来提高预测的准确性和鲁棒性。
- GBDT(梯度提升决策树):另一种集成学习方法,通过逐步构建决策树来纠正前一个模型的错误。
- 概率图模型:利用条件独立假设简化概率计算,这种模型可以有效地表示和推理变量之间的概率关系。
函数族可以根据是否需要调整参数来分为两类:
- 参数模型:包括线性模型、多项式、神经网络、概率图模型。这些模型需要通过训练数据来调整模型参数。
- 非参数模型:包括核方法、决策树、集成学习。这些模型不依赖于固定的参数数量,而是根据数据的复杂性来调整模型的复杂度。
2)*目标函数
在机器学习中,目标函数是用来评估模型性能的函数,它通常由两部分组成:损失函数和正则项。目标函数的一般形式为:
J ( f ) = L ( f ) + λ R ( f ) J(f) = L(f) + \lambda R(f) J(f)=L(f)+λR(f)
其中, J ( f ) J(f) J(f) 是目标函数, L ( f ) L(f) L(f) 是损失函数, R ( f ) R(f) R(f) 是正则项, λ \lambda λ
是正则参数,用于平衡损失函数和正则项的影响。- 损失函数 L ( f ) L(f) L(f):衡量函数 f f f 与训练数据的拟合程度。常见的损失函数包括:
- 负对数似然损失:如 L2/L1 损失、交叉熵损失。
- 合页损失(SVM)、 ε \varepsilon ε 不敏感损失(SVR)。
- 聚类损失:如 K均值、谱聚类。
- 降维损失:如结构保持、重构。
- 正则项 R ( f ) R(f) R(f):衡量函数 f f f 自身的复杂程度,以防止过拟合。常见的正则项包括:
- L2 正则、L1 正则。
- K-Lipschitz 连续(WGAN)。
- 正则参数 λ \lambda λ:控制模型复杂度的参数。
- 当 λ \lambda λ 越小,模型可以更复杂,训练误差越小,但可能导致偏差小、方差大。
- 当 λ \lambda λ 越大,模型更简单,训练误差可能增大,但偏差大、方差小。
通过调整正则参数 λ \lambda λ,我们可以在模型的偏差和方差之间找到一个平衡点,以获得最佳的泛化能力。
2.1)*模型的其他复杂度参数
在机器学习中,模型的复杂度不仅由其基本结构决定,还受到一些关键参数的影响。以下是一些常见模型的复杂度参数:
- 线性模型:特征的数目。特征越多,模型的表达能力越强,但也可能增加过拟合的风险。
- 多项式:多项式阶数。阶数越高,模型能够捕捉的非线性关系越复杂,但同样可能导致过拟合。
- 核方法:核函数超参数(如 RBF
核的核函数宽度)。这些参数决定了模型在特征空间中的映射方式,影响模型的复杂度和泛化能力。- 决策树:
- 树的最大深度:控制树的复杂度,防止过拟合。
- 叶子结点数目:影响模型的精细程度。
- 叶子结点代表的训练样本数目:决定每个叶子结点需要多少样本来分裂。
- 神经网络:
- 网络的连接方式:全连接、局部连接等,影响信息的流动和模型的学习能力。
- 网络的层数:层数越多,模型的学习能力越强,但计算成本和过拟合风险也增加。
- 每层的神经元数目:影响模型的表达能力和计算复杂度。
这些参数的选择对于模型的性能至关重要,需要根据具体问题和数据集进行调整和优化。
3)*优化算法
优化算法是机器学习中用于寻找模型参数最优值的方法。目标是找到一个函数 f ∗ f^* f∗,使得目标函数 J ( f ) J(f) J(f)
最小化:f ∗ = arg min f J ( f ) f^* = \arg\min_f J(f) f∗=argfminJ(f)
以下是一些常见的优化算法:
- 梯度下降/上升:
- 梯度:计算损失函数的梯度,指导参数更新的方向。
- 批处理梯度下降:使用所有数据计算梯度。
- 随机梯度下降:每次使用一个样本计算梯度。
- 小批量梯度下降:每次使用一小部分样本计算梯度。
- 动量法:加速梯度下降,减少震荡。
- 学习率:控制每次更新的步长。
- 学习率的影响:学习率过大可能导致不收敛,过小则收敛速度慢。
- 自适应学习率:根据训练过程动态调整学习率。
- 坐标下降/上升:每次选择一个或一部分参数进行更新。
- K均值聚类:一种常用的聚类算法。
- EM(期望最大化):一种迭代算法,用于含有隐变量的概率模型。
- Lasso、SMO:用于解决正则化问题的优化算法。
这些算法各有优缺点,选择合适的优化算法可以显著提高模型的训练效率和性能。
2、*前处理/后处理
1)前处理:特征工程
(*特征工程的具体细节会在单独章节讲到) 大致流如下:
- 数据探索性分析
-特征编码
- 特征预处理
- 特征选择
- 特征工程与机器学习模型一起考虑
- 天下没有免费的午餐原则:
表明没有任何单一的机器学习算法能够在所有问题上都表现最好。这个原则强调了算法选择的相对性和问题依赖性。“没有免费的午餐”(No Free Lunch,NFL)原则是机器学习领域中的一个重要概念,它表明没有任何单一的机器学习算法能够在所有问题上都表现最好。这个原则强调了算法选择的相对性和问题依赖性
理解“没有免费的午餐”原则:
1.算法的局限性:不同的算法对不同类型的数据和问题有不同的适应性。例如,线性回归可能在线性可分的数据上表现良好,但在非线性问题上可能就不够有效。2.问题的特性:问题的复杂性、数据的分布、特征的数量和类型等都会影响算法的性能。一个算法可能在某些特定类型的问题上表现优异,但在其他问题上可能表现平平。
3.算法的权衡:在选择算法时,通常需要在准确性、效率、可解释性等方面做出权衡。没有一种算法能在所有方面都做到最优。
4.经验的重要性:在实际应用中,选择最适合特定问题的算法往往需要基于经验和实验。这意味着需要对数据和问题有足够的理解,以及对不同算法的性能有足够的了解。
5.组合方法:由于单一算法可能无法解决所有问题,研究者和实践者可能会采用集成学习等方法,将多个算法结合起来,以提高整体性能。
6. 持续学习:随着数据和问题的不断变化,算法也需要不断更新和调整。这意味着机器学习是一个持续学习和适应的过程。
总之,“没有免费的午餐”原则提醒我们,在机器学习中,没有一种万能的解决方案。我们需要根据具体问题的特点和需求,选择合适的算法,并可能需要结合多种方法来达到最佳效果。
2)后处理:模型选择和模型评估
(*详细内容会在单独章节展开讲解)
- 训练集、验证集、测试集划分
- 训练集和验证集
- 留出法
- 交叉验证
- 训练误差、验证误差、测试误差
- 统计学习理论
- 奥卡姆剃刀原理在模型选择和评估过程中,我们将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型参数和选择最佳模型,测试集则用于评估模型的最终性能。训练误差是我们在训练数据上得到的误差,验证误差是在验证数据上得到的误差,而测试误差则是在未见过的数据上得到的误差,它更能反映模型在实际应用中的表现。
统计学习理论为我们提供了理解模型性能的理论基础,其中奥卡姆剃刀原理强调在模型选择时应该倾向于更简单的模型,除非有充分的理由选择更复杂的模型。这是因为更简单的模型更不容易过拟合,同时也更容易理解和解释。
3、*机器学习开发流程
机器学习项目的开发过程可以概括为以下几个关键步骤:
1)数据收集
- 给定任务,分析可能的相关特征,收集数据。
2)特征探索分析
- 对收集到的数据进行分析,以发现有用的特征。
3)特征工程
- 将原始数据转换成算法制定的输入。
4)模型训练
- 确定机器学习算法(函数集合) F \mathcal{F} F。
- 模型训练:在给定超参数的情况下,确定模型参数。
- 模型选择:在验证集上评估模型预测性能。
5)性能评估
- 模型测试和评估。
- 模型应用。
在整个过程中,我们的目标是找到一个能够从输入数据 x x x 预测输出结果 y y y 的模型,即 y = f ( x ) y = f(x) y=f(x)。这需要我们不断地调整模型参数和特征,以提高模型的预测准确性和泛化能力。
以上就是对机器学习基础知识的回顾和复习,接下来我们将进入本章的正题,由分段常数函数族定义的决策树模型。
二、决策树(Decision Tree)
a、基本概念
决策树是一种多级分类器,特别适用于多类分类任务和多峰分布数据。
分级是指将一个复杂问题转化为若干个简单的分类问题来解决。
- 从根结点到叶子结点的有向边代表了 一条决策路径 一条决策路径 一条决策路径。
- 每个叶子结点对应一个分类器,判别结果为样本占比最高的类别。
- 决策树的路径是互斥并且完备的。
决策树可视化工具:
- dtreeviz 介绍
- dtreeviz GitHub
在决策树中,从根节点开始,根据特征的不同取值,数据被分配到不同的路径上。每个中间节点代表一个特征的测试,而叶子节点则代表最终的分类结果。例如,在图中,根据花萼长度(sepal length)和花萼宽度(sepal width)的不同,数据被分配到不同的路径上,最终在叶子节点上得到分类结果。
b、决策树的构建
决策树的构建过程是一个递归的划分过程,通过不断地将数据集划分为更小的子集,直到满足停止条件。以下是构建决策树的详细步骤:
1)初始化
构建根节点,将所有训练数据放在根节点,并根节点加入叶子节点列表;
若叶子节点列表为空,算法结束,返回生成的决策树;
否则从叶子节点列表中挑选1个叶子节点,
- 2.1:若该叶子节点的样本集合已足够纯净,计算该叶子节点的预测值,并将其从叶子节点列表中删除(不再划分);
- 2.2:否则,对该叶子节点进行进一步划分:
- (1)对每个特征的每个可能的划分方式,尝试将该节点的样本集合进行划分,计算划分后数据的纯净度和划分的分数;
- (2)从第(1)步所有的划分中,选择一个最优划分(分数最高),将训练数据划分成若干子集,每个子集为当前节点的子节点,并将这些子节点加入叶子节点列表,同时将当前节点从叶子节点列表中删除;
2)选择一个合适的树结构
- 二叉树、多叉树
3)确定在每个非叶子节点上要使用的特征
- 所有特征(训练性能更好)、随机选择特征子集(更快,测试性能可能也不差)
4)在每个非叶子节点上选择合适的决策规则
- 划分点的选择:精确搜索/穷举所有可能的划分点(训练性能更好)、近似搜索/直方图(更快,测试性能可能也不差)
- 划分点的评价准则:信息熵增益、信息熵增益率、Gini指数、带正则的Gini指数
5)停止划分条件
- 足够纯净、最大深度、最大叶子节点数目、节点的最小样本数目、…
6)剪枝
*拓展知识:熵 &信息增益
1、熵:系统不确定的度量
熵是衡量系统不确定性的一种度量。对于一个随机变量 Y Y Y,其可能的取值为 { 1 , 2 , . . . , C } \{1, 2, ..., C\} {1,2,...,C},熵的定义为:
H ( Y ) = − ∑ c = 1 C P ( Y = c ) log 2 ( P ( Y = c ) ) H(Y) = -\sum_{c=1}^{C} P(Y = c) \log_2(P(Y = c)) H(Y)=−c=1∑CP(Y=c)log2(P(Y=c))
2、数据集的经验熵
数据集 D \mathcal{D} D的经验熵表示数据的不确定性或不纯净度的度量,定义为:
H ( D ) = − ∑ c = 1 C N c N log 2 ( N c N ) H(\mathcal{D}) = -\sum_{c=1}^{C} \frac{N_c}{N} \log_2 \left(\frac{N_c}{N}\right) H(D)=−c=1∑CNNclog2(NNc)
其中, N N N是数据集 D \mathcal{D} D中的样本数目, N c = ∑ i = 1 N I ( y i = c ) N_c = \sum_{i=1}^{N} \mathbb{I}(y_i = c) Nc=∑i=1NI(yi=c)是第 c c c个类别的样本数目。
用样本的比例估计概率分布,相当于 P ( Y = c ) = π ^ c = N c N = ∑ i = 1 N I ( y i = c ) N P(Y = c) = \hat{\pi}_c = \frac{N_c}{N} = \frac{\sum_{i=1}^{N} \mathbb{I}(y_i = c)}{N} P(Y=c)=π^c=NNc=N∑i=1NI(yi=c)。
3、条件熵
条件熵是衡量在已知特征 X X X的取值后,随机变量 Y Y Y的不确定性。特征 X X X的取值为 { 1 , 2 , . . . , M } \{1, 2, ..., M\} {1,2,...,M},知道 X X X后, Y Y Y还有多少不确定,条件熵定义为:
H ( Y ∣ X ) = ∑ m = 1 M P ( X = m ) H ( Y ∣ X = m ) = ∑ m = 1 M P ( X = m ) ∑ c = 1 C P ( Y = c ∣ X = m ) log 2 ( P ( Y = c ∣ X = m ) ) H(Y|X) = \sum_{m=1}^{M} P(X = m) H(Y|X = m) = \sum_{m=1}^{M} P(X = m) \sum_{c=1}^{C} P(Y = c|X = m) \log_2(P(Y = c|X = m)) H(Y∣X)=m=1∑MP(X=m)H(Y∣X=m)=m=1∑MP(X=m)c=1∑CP(Y=c∣X=m)log2(P(Y=c∣X=m))
4、经验条件熵
经验条件熵是根据特征 X X X的取值,将数据划分为 M M M个子集 D m \mathcal{D}_m Dm。经验条件熵定义为:
H ( D ∣ X ) = ∑ m = 1 M ∣ D m ∣ ∣ D ∣ H ( D m ) H(\mathcal{D}|X) = \sum_{m=1}^{M} \frac{|\mathcal{D}_m|}{|\mathcal{D}|} H(\mathcal{D}_m) H(D∣X)=m=1∑M∣D∣∣Dm∣H(Dm)
其中, N m = ∣ D m ∣ = ∑ i = 1 N I ( x i = m ) N_m = |\mathcal{D}_m| = \sum_{i=1}^{N} \mathbb{I}(x_i = m) Nm=∣Dm∣=∑i=1NI(xi=m)表示第 m m m个子集的样本数目, N m , c = ∑ i = 1 N I ( x i = m , y i = c ) N_{m,c} = \sum_{i=1}^{N} \mathbb{I}(x_i = m, y_i = c) Nm,c=∑i=1NI(xi=m,yi=c)表示第 m m m个子集中第 c c c个类别的样本数目。
进一步展开经验条件熵的计算公式:
H ( D ∣ X ) = ∑ m = 1 M N m N ∑ c = 1 C − N m , c N m log 2 ( N m , c N m ) H(\mathcal{D}|X) = \sum_{m=1}^{M} \frac{N_m}{N} \sum_{c=1}^{C} -\frac{N_{m,c}}{N_m} \log_2 \left(\frac{N_{m,c}}{N_m}\right) H(D∣X)=m=1∑MNNmc=1∑C−NmNm,clog2(NmNm,c)
将数据集 D \mathcal{D} D按照特征 X X X取值分为 M M M个子集后,各子集的平均不纯净程度。
5、信息增益
1)信息增益的定义
特征 X X X对训练数据集 D \mathcal{D} D的信息增益 g ( D , X ) g(\mathcal{D}, X) g(D,X)定义为:
g ( D , X ) = H ( D ) − H ( D ∣ X ) g(\mathcal{D}, X) = H(\mathcal{D}) - H(\mathcal{D}|X) g(D,X)=H(D)−H(D∣X)
这表示将数据集 D \mathcal{D} D根据特征 X X X的取值划分为 M M M个子集后,各子集的平均不确定性减少量。
2)ID3算法
ID3算法选择信息增益最大的特征进行分裂(即对标签 Y Y Y提供信息最多的特征),倾向于选择取值多的特征进行分裂。
3)多叉树
在决策树中,多叉树是指每个节点可以有多于两个子节点的树结构。
4)图示说明
下图展示了在知道某特征前后数据集的经验信息熵的变化:
- 划分前:经验信息熵为1
- 划分后:经验信息熵为0
图中, x 1 x_1 x1和 x 2 x_2 x2表示特征,通过特征 x 1 x_1 x1的取值将数据集划分为两个子集,显著减少了不确定性,从而提高了模型的纯净度。
6、信息增益与决策树分裂
1)数据集概览
下表展示了一个包含日志密度(L)、好友密度(F)、是否使用真实头像(H)和账号是否真实(R)的数据集:
日志密度L | 好友密度F | 是否使用真实头像H | 账号是否真实R |
---|---|---|---|
s | s | no | no |
s | l | yes | yes |
l | m | yes | yes |
m | m | yes | yes |
l | m | yes | yes |
m | l | no | yes |
m | s | no | no |
l | m | no | yes |
m | s | no | yes |
s | s | yes | no |
2)总体数据集的信息熵 H ( D ) H(\mathcal{D}) H(D)
计算得到数据集 D \mathcal{D} D的信息熵为:
H ( D ) = − 7 10 log 2 7 10 − 3 10 log 2 3 10 = 0.879 H(\mathcal{D}) = -\frac{7}{10}\log_2\frac{7}{10} - \frac{3}{10}\log_2\frac{3}{10} = 0.879 H(D)=−107log2107−103log2103=0.879
3)根据特征划分后的信息熵
3.1)日志密度L
根据日志密度L划分后的信息熵 H ( D ∣ L ) H(\mathcal{D}|L) H(D∣L)计算如下:
H ( D ∣ L ) = 3 10 × H ( D s ) + 4 10 × H ( D m ) + 3 10 × H ( D l ) H(\mathcal{D}|L) = \frac{3}{10} \times H(\mathcal{D}_s) + \frac{4}{10} \times H(\mathcal{D}_m) + \frac{3}{10} \times H(\mathcal{D}_l) H(D∣L)=103×H(Ds)+104×H(Dm)+103×H(Dl)
具体计算为:
= 3 10 × ( − 1 3 log 2 1 3 − 2 3 log 2 2 3 ) + 4 10 × ( − 3 4 log 2 3 4 − 1 4 log 2 1 4 ) + 3 10 × ( − 3 3 log 2 3 3 − 0 3 log 2 0 3 ) = \frac{3}{10} \times \left(-\frac{1}{3}\log_2\frac{1}{3} - \frac{2}{3}\log_2\frac{2}{3}\right) + \frac{4}{10} \times \left(-\frac{3}{4}\log_2\frac{3}{4} - \frac{1}{4}\log_2\frac{1}{4}\right) + \frac{3}{10} \times \left(-\frac{3}{3}\log_2\frac{3}{3} - \frac{0}{3}\log_2\frac{0}{3}\right) =103×(−31log231−32log232)+104×(−43log243−41log241)+103×(−33log233−30log230)
= 0.603 = 0.603 =0.603
4)信息增益计算
- 根据日志密度L的信息增益 g ( D , L ) g(\mathcal{D}, L) g(D,L):
g ( D , L ) = H ( D ) − H ( D ∣ L ) = 0.276 g(\mathcal{D}, L) = H(\mathcal{D}) - H(\mathcal{D}|L) = 0.276 g(D,L)=H(D)−H(D∣L)=0.276 - 根据好友密度F的信息增益 g ( D , F ) g(\mathcal{D}, F) g(D,F):
g ( D , F ) = 0.553 g(\mathcal{D}, F) = 0.553 g(D,F)=0.553 - 根据是否使用真实头像H的信息增益 g ( D , H ) g(\mathcal{D}, H) g(D,H):
g ( D , H ) = 0.033 g(\mathcal{D}, H) = 0.033 g(D,H)=0.033
5)决策树分裂
因为好友密度F具有最大的信息增益(或最小熵),所以第一次分裂选择F为分裂属性。分裂后的结果如下表所示:
日志密度L | 是否使用真实头像H | 账号是否真实R |
---|---|---|
s | no | no |
m | no | no |
m | no | yes |
s | yes | no |
对应的决策树结构图如下:
7、信息增益率
1)ID3算法的局限性
ID3算法选择信息增益最大的特征进行分裂,倾向于选择取值多的特征。例如,如果一个特征(如ID号)取值非常多,ID3算法可能会分裂出很多子节点,但这些分裂对分类可能没有实际意义。
3)C4.5算法:信息增益率
C4.5算法改进了ID3算法,选择信息增益率最大的特征进行分裂。特征 X X X对训练集 D \mathcal{D} D的信息增益比 g R ( D , X ) g_R(\mathcal{D}, X) gR(D,X)定义为:
g R ( D , X ) = g ( D , X ) H X ( D ) g_R(\mathcal{D}, X) = \frac{g(\mathcal{D}, X)}{H_X(\mathcal{D})} gR(D,X)=HX(D)g(D,X)
其中, g ( D , X ) g(\mathcal{D}, X) g(D,X)是特征 X X X的信息增益, H X ( D ) H_X(\mathcal{D}) HX(D)是特征 X X X的熵。通过计算信息增益率,C4.5算法对信息增益乘以一个加权系数,希望在增加信息的同时,不要以分割太细为代价。
4)总结
信息增益率是C4.5算法中用于选择分裂特征的关键指标,它平衡了信息增益和特征取值的数量,从而避免了ID3算法中可能出现的过分裂问题。
c、决策树的损失函数
决策树中使用的损失函数取决于任务的类型:
分类任务:通常使用Gini指数作为损失函数。Gini指数衡量的是数据集的不纯度,值越小表示数据集越纯。
回归任务:通常使用L2损失(平方损失)作为损失函数。L2损失衡量的是预测值与真实值之间差的平方和,值越小表示模型的预测越准确。
L2正则在线性回归模型章节已经讲过,下面我们主要来讲应用在分类任务中的Gini指数。
1)Gini指数
Gini指数是一种衡量数据集不纯度的指标,它无需使用对数函数,因此计算速度更快。对于一个数据集 D \mathcal{D} D,其Gini指数定义为:
H ( D ) = ∑ c = 1 C π ^ c ( 1 − π ^ c ) H(\mathcal{D}) = \sum_{c=1}^{C} \hat{\pi}_c (1 - \hat{\pi}_c) H(D)=c=1∑Cπ^c(1−π^c)
其中, π ^ c = N c N = ∑ i = 1 N I ( y i = c ) N \hat{\pi}_c = \frac{N_c}{N} = \frac{\sum_{i=1}^{N} \mathbb{I}(y_i = c)}{N} π^c=NNc=N∑i=1NI(yi=c)是第 c c c类样本在数据集中的比例。
2)为什么不使用错误率?
错误率定义为:
Err ( D ) = 1 − max c { π ^ c } \text{Err}(\mathcal{D}) = 1 - \max_{c} \{\hat{\pi}_c\} Err(D)=1−cmax{π^c}
错误率曲线将数据集分为两个区间,在每个区间内是直线。如果划分后的子节点和父节点在同一条直线上,则划分后错误率不会下降,从而无法进一步分裂节点。
3)Gini指数的优势
与错误率曲线不同,Gini指数的曲线也分为两个区间,但在每个区间内是向上凸起的。这样,划分后子节点的熵的平均值会比分裂前的熵小,从而可以继续分裂节点,直到达到分裂停止标准。
4)图示说明
下图展示了两类分类的不纯度度量,包括Gini指数、熵和错误率随类别概率变化的曲线:
2)错误率 vs. Gini指数
2.1)示例说明
假设父节点包含10个样本,其中正样本有7个,负样本有3个。我们可以计算错误率和Gini指数如下:
-
样本中正类( c = 1 c=1 c=1)和负类( c = 0 c=0 c=0)的比例分别为 π ^ 1 = 0.3 \hat{\pi}_1 = 0.3 π^1=0.3和 π ^ 0 = 0.7 \hat{\pi}_0 = 0.7 π^0=0.7。
-
错误率(Error Rate)计算为:
Err ( D ) = 1 − max { π ^ c } = 1 − 0.7 = 0.3 \text{Err}(\mathcal{D}) = 1 - \max\{\hat{\pi}_c\} = 1 - 0.7 = 0.3 Err(D)=1−max{π^c}=1−0.7=0.3 -
Gini指数(Gini Index)计算为:
H ( D ) = ∑ c = 1 C π ^ c ( 1 − π ^ c ) = 0.7 × 0.3 × 2 = 0.41 H(\mathcal{D}) = \sum_{c=1}^{C} \hat{\pi}_c (1 - \hat{\pi}_c) = 0.7 \times 0.3 \times 2 = 0.41 H(D)=c=1∑Cπ^c(1−π^c)=0.7×0.3×2=0.41
2.2)决策树分裂效果
如果我们根据特征 H H H的值将数据集分裂为两个子集,我们可以计算每个子集的不纯度度量:
-
子集1( H = no H = \text{no} H=no):
- 错误率: E ( D no ) = 2 5 E(\mathcal{D}_{\text{no}}) = \frac{2}{5} E(Dno)=52
- 样本数:5
- 类别分布: [ 3 / 5 , 2 / 5 ] [3/5, 2/5] [3/5,2/5]
- Gini指数: H ( D no ) = 0.48 H(\mathcal{D}_{\text{no}}) = 0.48 H(Dno)=0.48
-
子集2( H = yes H = \text{yes} H=yes):
- 错误率: E ( D yes ) = 1 5 E(\mathcal{D}_{\text{yes}}) = \frac{1}{5} E(Dyes)=51
- 样本数:5
- 类别分布: [ 4 / 5 , 1 / 5 ] [4/5, 1/5] [4/5,1/5]
- Gini指数: H ( D yes ) = 0.32 H(\mathcal{D}_{\text{yes}}) = 0.32 H(Dyes)=0.32
通过比较错误率和Gini指数,我们可以看到Gini指数在决策树分裂中提供了一个更加平滑的度量,有助于更好地评估分裂效果。在本例中,尽管子集2的错误率较低,但子集1的Gini指数较低,表明子集1的不纯度较低。因此,Gini指数可以帮助我们更全面地评估决策树的分裂效果。
2.3)左子结点分析
左子结点包含5个样本,其中正样本3个,负样本2个。计算如下:
- 正负样本比例分别为 π ^ 0 = 3 / 5 \hat{\pi}_0 = 3/5 π^0=3/5 和 π ^ 1 = 2 / 5 \hat{\pi}_1 = 2/5 π^1=2/5。
- 错误率计算为 Err L ( D ) = 1 − max { π ^ c } = 1 − 3 / 5 = 2 / 5 \text{Err}_L(\mathcal{D}) = 1 - \max\{\hat{\pi}_c\} = 1 - 3/5 = 2/5 ErrL(D)=1−max{π^c}=1−3/5=2/5。
- Gini指数计算为 H L ( D ) = ∑ c = 1 C π ^ c ( 1 − π ^ c ) = 3 / 5 × 2 / 5 × 2 = 12 / 25 H_L(\mathcal{D}) = \sum_{c=1}^{C} \hat{\pi}_c (1 - \hat{\pi}_c) = 3/5 \times 2/5 \times 2 = 12/25 HL(D)=∑c=1Cπ^c(1−π^c)=3/5×2/5×2=12/25。
左子结点分裂效果
- 初始错误率 E ( D ) = 3 / 10 E(\mathcal{D}) = 3/10 E(D)=3/10,样本数10,分布 [ 0.7 , 0.3 ] [0.7, 0.3] [0.7,0.3]。
- 分裂后:
- 子集1( H = no H = \text{no} H=no):错误率 E ( D no ) = 2 / 5 E(\mathcal{D}_{\text{no}}) = 2/5 E(Dno)=2/5,样本数5,分布 [ 3 / 5 , 2 / 5 ] [3/5, 2/5] [3/5,2/5],Gini指数 H ( D no ) = 0.48 H(\mathcal{D}_{\text{no}}) = 0.48 H(Dno)=0.48。
- 子集2( H = yes H = \text{yes} H=yes):错误率 E ( D yes ) = 1 / 5 E(\mathcal{D}_{\text{yes}}) = 1/5 E(Dyes)=1/5,样本数5,分布 [ 4 / 5 , 1 / 5 ] [4/5, 1/5] [4/5,1/5],Gini指数 H ( D yes ) = 0.32 H(\mathcal{D}_{\text{yes}}) = 0.32 H(Dyes)=0.32。
2.4)右子结点分析
右子结点包含5个样本,其中正样本4个,负样本1个。计算如下:
- 正负样本比例分别为 π ^ 0 = 4 / 5 \hat{\pi}_0 = 4/5 π^0=4/5 和 π ^ 1 = 1 / 5 \hat{\pi}_1 = 1/5 π^1=1/5。
- 错误率计算为 Err R ( D ) = 1 − max { π ^ c } = 1 − 4 / 5 = 1 / 5 \text{Err}_R(\mathcal{D}) = 1 - \max\{\hat{\pi}_c\} = 1 - 4/5 = 1/5 ErrR(D)=1−max{π^c}=1−4/5=1/5。
- Gini指数计算为 H R ( D ) = ∑ c = 1 C π ^ c ( 1 − π ^ c ) = 4 / 5 × 1 / 5 × 2 = 8 / 25 H_R(\mathcal{D}) = \sum_{c=1}^{C} \hat{\pi}_c (1 - \hat{\pi}_c) = 4/5 \times 1/5 \times 2 = 8/25 HR(D)=∑c=1Cπ^c(1−π^c)=4/5×1/5×2=8/25。
右子结点分裂效果
- 初始Gini指数 H ( D ) = 0.41 H(\mathcal{D}) = 0.41 H(D)=0.41,样本数10,分布 [ 0.7 , 0.3 ] [0.7, 0.3] [0.7,0.3]。
- 分裂后:
- 子集1( H = no H = \text{no} H=no):Gini指数 H ( D no ) = 0.48 H(\mathcal{D}_{\text{no}}) = 0.48 H(Dno)=0.48,样本数5,分布 [ 3 / 5 , 2 / 5 ] [3/5, 2/5] [3/5,2/5]。
- 子集2( H = yes H = \text{yes} H=yes):Gini指数 H ( D yes ) = 0.32 H(\mathcal{D}_{\text{yes}}) = 0.32 H(Dyes)=0.32,样本数5,分布 [ 4 / 5 , 1 / 5 ] [4/5, 1/5] [4/5,1/5]。
通过比较左子结点和右子结点的分裂效果,我们可以看到Gini指数在评估分裂质量时提供了一个更细致的视角。尽管错误率在右子结点上更低,但Gini指数在两个子结点上都显示出较低的不纯度,表明Gini指数是一个有效的分裂评估指标。
3)分裂后的平均效果
3.1)分裂后的平均错误率和熵
在进行数据集分裂后,我们可以计算平均错误率和平均熵来评估分裂的效果:
-
平均错误率:
Err ( D ∣ X ) = 5 10 Err L ( D ) + 5 10 Err R ( D ) = 0.3 \text{Err}(\mathcal{D}|X) = \frac{5}{10} \text{Err}_L(\mathcal{D}) + \frac{5}{10} \text{Err}_R(\mathcal{D}) = 0.3 Err(D∣X)=105ErrL(D)+105ErrR(D)=0.3 -
平均熵:
H ( D ∣ X ) = 5 10 H L ( D ) + 5 10 H R ( D ) = 0.4 H(\mathcal{D}|X) = \frac{5}{10} H_L(\mathcal{D}) + \frac{5}{10} H_R(\mathcal{D}) = 0.4 H(D∣X)=105HL(D)+105HR(D)=0.4
3.2)分裂前的情况
-
错误率:
Err ( D ) = 1 − max c { π ^ c } = 1 − 0.7 = 0.3 \text{Err}(\mathcal{D}) = 1 - \max_{c}\{\hat{\pi}_c\} = 1 - 0.7 = 0.3 Err(D)=1−cmax{π^c}=1−0.7=0.3 -
熵:
H ( D ) = ∑ c = 1 C π ^ c ( 1 − π ^ c ) = 0.7 × 0.3 × 2 = 0.41 H(\mathcal{D}) = \sum_{c=1}^{C} \hat{\pi}_c (1 - \hat{\pi}_c) = 0.7 \times 0.3 \times 2 = 0.41 H(D)=c=1∑Cπ^c(1−π^c)=0.7×0.3×2=0.41
从上面的计算可以看出,虽然分裂前后的错误率没有变化,但熵有所减少。这意味着尽管分类错误的比例没有改变,数据集的不纯度(或不确定性)有所降低,这是决策树分裂的一个积极效果。
三、分类回归树(Classification And Regression Tree, CART )
1、基本概念
ID3和C4.5根据特征取值,生成的树为多叉树。
CART(Classification And Regression Tree)采用二分递归划分的方法:将当前样本集合划分为两个子集,分别为左右两个子节点,使得生成的每个非叶子节点都有两个分支,从而形成二叉树。
-
离散型特征:左右分支的组合较多(亦可将离散型特征编码成连续型特征)。
-
连续型特征:设特征 X X X在 D \mathcal{D} D中出现了 M M M个不同的取值,将这些值从小到大排序,记作 a 1 , a 2 , . . . , a M a_1, a_2, ..., a_M a1,a2,...,aM,则共有 M − 1 M - 1 M−1个候选划分点依次为:
a 1 + a 2 2 , a 2 + a 3 2 , . . . , a M − 1 + a M 2 \frac{a_1 + a_2}{2}, \frac{a_2 + a_3}{2}, ..., \frac{a_{M-1} + a_M}{2} 2a1+a2,2a2+a3,...,2aM−1+aM -
对于大数据集,训练数据中特征的取值数目 M M M可能会很多,要考虑所有 M − 1 M - 1 M−1个候选点开销太大,可考虑将特征分成多个区间,采用直方图方式快速寻找近似的最佳划分点(XGBoost、LightGBM)。
2、例:离散型特征
根据日志密度 L L L,候选分裂方式有3种(左右分支可交换为6种=8种减去空集和全集):
日志密度 L L L | 好友密度 F F F | 是否使用真实头像 H H H | 账号是否真实 R R R |
---|---|---|---|
s | s | no | no |
l | l | yes | yes |
l | m | yes | yes |
m | m | yes | yes |
l | m | yes | yes |
m | l | no | yes |
m | s | no | no |
l | m | no | yes |
m | s | no | yes |
s | s | yes | no |
1. 左侧分支 L = s L = s L=s,右侧分支 R = { l , m } R = \{l, m\} R={l,m}:
- N L = 3 N_L = 3 NL=3, N R = 7 N_R = 7 NR=7, H ( D L ) = 4 9 H(\mathcal{D}_L) = \frac{4}{9} H(DL)=94, H ( D R ) = 12 49 H(\mathcal{D}_R) = \frac{12}{49} H(DR)=4912
- H ( D ) = 3 10 × 4 9 + 7 10 × 12 49 = 64 210 H(\mathcal{D}) = \frac{3}{10} \times \frac{4}{9} + \frac{7}{10} \times \frac{12}{49} = \frac{64}{210} H(D)=103×94+107×4912=21064
2. 左侧分支 L = l L = l L=l,右侧分支 R = { s , m } R = \{s, m\} R={s,m}
- N L = 3 N_L = 3 NL=3, N R = 7 N_R = 7 NR=7, H ( D L ) = 0 H(\mathcal{D}_L) = 0 H(DL)=0, H ( D R ) = 24 49 H(\mathcal{D}_R) = \frac{24}{49} H(DR)=4924
- H ( D ) = 3 10 × 0 + 7 10 × 24 35 = 12 210 H(\mathcal{D}) = \frac{3}{10} \times 0 + \frac{7}{10} \times \frac{24}{35} = \frac{12}{210} H(D)=103×0+107×3524=21012
3. 左侧分支 L = m L = m L=m,右侧分支 R = { s , l } R = \{s, l\} R={s,l}
- N L = 4 N_L = 4 NL=4, N R = 6 N_R = 6 NR=6, H ( D L ) = 3 8 H(\mathcal{D}_L) = \frac{3}{8} H(DL)=83, H ( D R ) = 4 9 H(\mathcal{D}_R) = \frac{4}{9} H(DR)=94
- H ( D ) = 4 10 × 3 8 + 6 10 × 4 9 = 5 12 H(\mathcal{D}) = \frac{4}{10} \times \frac{3}{8} + \frac{6}{10} \times \frac{4}{9} = \frac{5}{12} H(D)=104×83+106×94=125
3、例:连续型特征
3.1)根据特征width
的取值,对所有样本进行排序,得到可能的阈值为:6.25, 6.55, 6.75, 6.95。
width | height | Class |
---|---|---|
7.0 | 9.5 | Orange |
6.9 | 6.0 | Orange |
6.6 | 6.6 | Orange |
6.5 | 6.6 | Lemon |
6.0 | 6.6 | Lemon |
6.9 | 9.6 | Lemon |
对每个可能的阈值,计算划分后的Gini指数:
-
H width > 6.25 ( D ) = H width > 6.95 ( D ) = 1 6 × ( 0 ) + 5 6 × ( 2 5 × 3 5 × 2 ) = 2 5 H_{\text{width}>6.25}(\mathcal{D}) = H_{\text{width}>6.95}(\mathcal{D}) = \frac{1}{6} \times (0) + \frac{5}{6} \times \left(\frac{2}{5} \times \frac{3}{5} \times 2\right) = \frac{2}{5} Hwidth>6.25(D)=Hwidth>6.95(D)=61×(0)+65×(52×53×2)=52
-
H width > 6.55 ( D ) = 2 6 × ( 0 ) + 4 6 × ( 1 4 × 3 4 × 2 ) = 1 4 H_{\text{width}>6.55}(\mathcal{D}) = \frac{2}{6} \times (0) + \frac{4}{6} \times \left(\frac{1}{4} \times \frac{3}{4} \times 2\right) = \frac{1}{4} Hwidth>6.55(D)=62×(0)+64×(41×43×2)=41
-
H width > 6.75 ( D ) = 3 6 × ( 1 3 × 2 3 × 2 ) + 3 6 × ( 2 3 × 1 3 × 2 ) = 4 9 H_{\text{width}>6.75}(\mathcal{D}) = \frac{3}{6} \times \left(\frac{1}{3} \times \frac{2}{3} \times 2\right) + \frac{3}{6} \times \left(\frac{2}{3} \times \frac{1}{3} \times 2\right) = \frac{4}{9} Hwidth>6.75(D)=63×(31×32×2)+63×(32×31×2)=94
通过计算不同阈值下的Gini指数,我们可以选择Gini指数最小的阈值作为最佳划分点,从而实现样本的最优分类。
3.2)根据特征height
的取值,对所有样本进行排序,得到可能的阈值为:6.3, 8.05, 9.55。
width | height | Class |
---|---|---|
6.9 | 6.0 | Orange |
6.0 | 6.6 | Lemon |
6.5 | 6.6 | Lemon |
6.6 | 6.6 | Orange |
7.0 | 9.5 | Orange |
6.9 | 9.6 | Lemon |
对每个可能的阈值,计算划分后的Gini指数:
-
H height > 9.55 ( D ) = H height > 6.3 ( D ) = 1 6 × ( 0 ) + 5 6 × ( 2 5 × 3 5 × 2 ) = 2 5 H_{\text{height}>9.55}(\mathcal{D}) = H_{\text{height}>6.3}(\mathcal{D}) = \frac{1}{6} \times (0) + \frac{5}{6} \times \left(\frac{2}{5} \times \frac{3}{5} \times 2\right) = \frac{2}{5} Hheight>9.55(D)=Hheight>6.3(D)=61×(0)+65×(52×53×2)=52
-
H height > 8.05 ( D ) = 4 6 × ( 2 4 × 2 4 × 2 ) + 2 6 × ( 1 2 × 1 2 × 2 ) = 1 2 H_{\text{height}>8.05}(\mathcal{D}) = \frac{4}{6} \times \left(\frac{2}{4} \times \frac{2}{4} \times 2\right) + \frac{2}{6} \times \left(\frac{1}{2} \times \frac{1}{2} \times 2\right) = \frac{1}{2} Hheight>8.05(D)=64×(42×42×2)+62×(21×21×2)=21
最佳决策规则为width > 6.55
,划分后的Gini指数为 1 4 \frac{1}{4} 41。
根据这个规则,我们可以得到以下分类结果:
- 左侧分支(
width ≤ 6.55
):2个Lemons - 右侧分支(
width > 6.55
):1个Lemon, 3个Oranges
4、划分停止条件
建树过程是一个自顶向下的递归过程。在递归过程中,我们需要设定一些停止条件来避免过拟合和提高模型的泛化能力。
递归的停止条件包括:
- 划分带来的损失的减小太小:当进一步划分不能显著提高模型的性能时,停止划分。
- 树的深度超过了最大深度:限制树的最大深度,防止树过于复杂。
- 叶子结点数目超过了最大数目:限制叶子结点的最大数量,控制模型复杂度。
- 左/右分支的样本分布足够纯净:当分支中的样本已经足够纯净,即大部分样本属于同一类别时,停止划分。
- 左/右分支中样本数目足够少:当分支中的样本数量少于某个阈值时,停止划分,以避免模型过拟合。
通过这些停止条件,我们可以有效地控制决策树的生长,避免过拟合,提高模型的泛化能力。
5、剪枝
分类回归树算法容易过拟合,通过剪枝去除部分分支,降低模型复杂度。
剪枝:给定一个完全树,自底向上进行剪枝,直到根节点。
剪枝准则:
C α ( T ) = ∑ t = 1 ∣ T ∣ ∣ D t ∣ H ( D t ) + α ∣ T ∣ = C ( T ) + α ∣ T ∣ C_{\alpha}(T) = \sum_{t=1}^{|T|} |\mathcal{D}_t| H(\mathcal{D}_t) + \alpha |T| = C(T) + \alpha |T| Cα(T)=t=1∑∣T∣∣Dt∣H(Dt)+α∣T∣=C(T)+α∣T∣
- 其中, ∣ D t ∣ |\mathcal{D}_t| ∣Dt∣ 是叶子结点 t t t的样本数目, H ( D t ) H(\mathcal{D}_t) H(Dt) 是叶子结点 t t t的不纯净度, α \alpha α 是正则因子, ∣ T ∣ |T| ∣T∣ 是叶子结点数目。
决策树划分得越细致,叶子结点的样本越纯净,但此时叶子结点越多。所以最佳模型是这两方面的折中。
当 α \alpha α从0开始增大,树的一些分支被剪掉,得到不同 α \alpha α对应的树。
1)剪枝过程
剪枝前费用: T T T表示绿色虚线框中的子树
C A ( T ) = C ( T ) + α ∣ T ∣ C_A(T) = C(T) + \alpha |T| CA(T)=C(T)+α∣T∣
剪枝后的费用:子树 T T T变成了一个叶子结点 t t t
C B ( t ) = C ( t ) + α C_B(t) = C(t) + \alpha CB(t)=C(t)+α
当 C A ( T ) = C B ( t ) C_A(T) = C_B(t) CA(T)=CB(t)时,得到
α eff = C ( t ) − C ( T ) ∣ T ∣ − 1 \alpha_{\text{eff}} = \frac{C(t) - C(T)}{|T| - 1} αeff=∣T∣−1C(t)−C(T)
某个结点是否要被剪枝的 α \alpha α的临界点。
当 α > α eff \alpha > \alpha_{\text{eff}} α>αeff时,剪枝后的费用 C B ( t ) C_B(t) CB(t)更小。进行剪枝会得到更优的决策树。
α \alpha α不同时,得到的剪枝策略不同。
最佳的 α \alpha α通过验证集上的性能得到。
蓝色虚线框内未剪枝部分费用不变,故而在此忽略
2)剪枝策略
基于当前决策树结构,计算树中每个中间结点的 α eff \alpha_{\text{eff}} αeff。
选择 α eff \alpha_{\text{eff}} αeff最小的中间结点,对其进行剪枝,得到新的决策树。
迭代地进行剪枝,直到达到停止条件(如只有2层)。
3)验证集
对一系列子树,计算其在验证集上的性能。
验证集上性能最好的剪枝树胜出。
子树 T 0 T_0 T0在验证集上的性能,子树 T 1 T_1 T1在验证集上的性能,输出在验证数据集中的预测误差,子树 T 2 T_2 T2在验证集上的性能,子树 T n T_n Tn在验证集上的性能。
4)Scikit-Learn中对剪枝的支持
为了了解 α eff \alpha_{\text{eff}} αeff的哪些值可能是合适的,Scikit-learn中的决策树模型提供函数cost_complexity_pruning_path()
,返回在修剪过程中每一步 α \alpha α的有效性ccp_alpha
( α eff \alpha_{\text{eff}} αeff)和相应的总叶子结点的不纯净度。
再根据验证集上的性能寻找最佳 α eff \alpha_{\text{eff}} αeff。
以下是在Scikit-learn中实现剪枝的代码示例:
path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas, impurities = path.ccp_alphas, path.impurities
clfs = []for ccp_alpha in ccp_alphas:clf = DecisionTreeClassifier(random_state=0, ccp_alpha=ccp_alpha)clf.fit(X_train, y_train)clfs.append(clf)train_scores = [clf.score(X_train, y_train) for clf in clfs]
test_scores = [clf.score(X_test, y_test) for clf in clfs]
图中展示了训练集和测试集上的准确率与α值的关系。可以看到,随着α值的增加,模型的复杂度降低,测试集上的准确率先是保持稳定,然后逐渐下降。最佳 α eff \alpha_{\text{eff}} αeff即为测试集准确率最高的点对应的α值。
四、决策树的优缺点
1、决策树模型的优点
决策树是一种非常直观且易于理解的模型,它具有以下几个显著优点:
- 容易解释:决策树的结构清晰,易于解释和展示,使得非专业人士也能理解和使用。
- 对特征预处理要求少:
- (理论上)能处理离散值和连续值混合的输入(实际需根据具体工具包的要求)
- 对特征的单调变换不敏感(只与数据的排序有关)
- 能自动进行特征选择
- 可扩展到大数据规模:决策树可以处理大规模数据集,且在大数据环境下表现良好。
2、决策树模型的缺点
尽管决策树有许多优点,但它也有一些缺点:
- 正确率不高:建树过程过于贪心,可能导致过拟合。
- 可作为Boosting的弱学习器(深度不太深)
- 模型不稳定(方差大):输入数据小的变化会带来树结构的变化。
- Bagging & 随机森林
- 当特征数目相对样本数目太多时,容易过拟合:在特征数量远大于样本数量的情况下,决策树容易过拟合训练数据。
这些缺点可以通过集成学习方法(如随机森林、Boosting等)来缓解,提高模型的泛化能力和稳定性。
五、DecisionTreeClassifier类
DecisionTreeClassifier
是Scikit-learn库中用于分类任务的决策树模型。其构造函数如下:
class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)
决策树算法特有的参数:
criterion
、splitter
、max_features
max_depth
、max_leaf_nodes
min_samples_split
、min_samples_leaf
min_weight_fraction_leaf
、min_impurity_decrease
min_impurity_split
、ccp_alpha
1、DecisionTreeClassifier的参数
参数 | 说明 | 备注 |
---|---|---|
criterion | 权衡划分质量的指标'gini' (默认):Gini指数'entropy' :熵 | |
splitter | 划分方式:'best' (默认):在特征的所有划分点中找出最优值'random' :在一些随机划分点中找最优分裂点 | 'best' 适合样本量不大的时候,如果样本数据量非常大,推荐'random' 。 |
max_features | 寻找最佳分裂点时,考虑的特征数目None (默认):考虑所有的特征;"log2" :最多考虑 log 2 D \log_2 D log2D个特征;"sqrt" /"auto" :最多考虑 D \sqrt{D} D个特征。整数:考虑的特征的绝对数目。 浮点数:考虑特征数目的百分比,即(百分比 × D \times D ×D)取整后的特征数。其中 D D D为样本总特征数。 | 如果样本特征数不多,如小于50,用默认的"None" 即可。如果特征数非常多,可以控制分裂时考虑的最大特征数,以控制决策树的生成时间。 |
max_depth | 树的最大深度。None (默认),在建树时不限制树的深度,直到每个叶子结点都是纯净的或叶子结点的样本数目小于min_samples_split 。 | 数据少或者特征少的时候可以默认值。如果模型样本量多,特征也多的情况下,推荐限制最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。 |
max_leaf_nodes | 最大叶子节点数目。 以最好优先( best-first )的方式生成树时,用该参数限制叶子结点数目。None (默认):不限制叶子结点数目。 | 如果不为None ,则忽略max_depth 。 |
min_samples_split | 对中间结点进行分裂的最小样本数。 整数:样本绝对数目 浮点数:样本百分比 默认值为2 | 如果样本量数量级非常大,则推荐增大该参数。如10万样本,min_samples_split=10 。 |
min_samples_leaf | 叶子节点包含的最小样本数。 整数:样本绝对数目 浮点数:样本百分比 默认值为1 | 如果某叶子节点数目小于该参数,则会和兄弟节点一起被剪枝。min_samples_split 约为min_samples_leaf 的2倍。 |
min_weight_fraction_leaf | 叶子结点所有样本权重和的最小值。 默认值为0,不考虑权重约束。当没有设置 sample_weight 时,每个样本的权重相等。 | 如果某叶子结点样本权重和小于该参数,则会和兄弟结点一起被剪枝。 |
min_impurity_decrease | 结点划分最小不纯度下降量。如果结点划分带来的不纯度下降小于这个阈值,则该结点不再划分,为叶子结点。 | 不纯度下降(可带样本权重): N m N ( impurity − N left N m H ( D L ) − N right N m H ( D R ) ) \frac{N_m}{N}\left(\text{impurity} - \frac{N_{\text{left}}}{N_m} H(\mathcal{D}_L) - \frac{N_{\text{right}}}{N_m} H(\mathcal{D}_R)\right) NNm(impurity−NmNleftH(DL)−NmNrightH(DR)) |
class_weight | 每个类别的权重:{class_label: weight}。如果不给定,所有类别的权重均1。"balanced" 模式:自动调整权重。n_samples / (n_classes * np.bincount(y)) | 还可以设置样本权重(fit函数) |
random_state | 随机种子 | |
ccp_alpha | 后剪枝中结点有效性的阈值。 |
2、DecisionTreeClassifier的属性
DecisionTreeClassifier
提供了一些有用的属性,可以帮助我们了解模型的结构和特征的重要性。以下是这些属性的详细说明:
属性 | 说明 | 备注 |
---|---|---|
classes_ | 类别标签 | 模型训练后,所有可能的类别标签。 |
n_classes_ | 类别数目 | 模型训练后,类别的总数。 |
feature_importances_ | 特征重要性 | 每个特征对模型预测的贡献程度,可根据特征重要性做特征选择。 |
max_features_ | max_features 的值 | 实际用于模型训练的特征数目的最大值。 |
n_features_ | 训练模型(fit)的特征数目 | 模型训练时使用的特征总数。 |
n_outputs_ | 训练模型(fit)的输出的数目 | 模型训练时目标变量的数目。 |
tree_ | 树 | 训练后的决策树模型本身,可以用于可视化和分析。 |
这些属性为我们提供了模型的详细信息,有助于我们更好地理解和解释模型的行为。
3、DecisionTreeClassifier的方法
DecisionTreeClassifier
提供了一系列的实用方法,用于模型训练、预测和评估。以下是这些方法的详细说明:
方法 | 说明 |
---|---|
apply(X[, check_input]) | 返回每个样本对应的叶子结点索引。 |
fit(X, y[, sample_weight]) | 模型训练。参数X , y 为训练数据,也可以通过sample_weight 设置每个样本的权重。 |
predict(X) | 返回X 对应的预测值(类别标签)。 |
predict_log_proba(X) | 返回X 对应的预测值(每个类别对应的概率的log值)。 |
predict_proba(X) | 返回X 对应的预测值(每个类别对应的概率)。 |
score(X, y[, sample_weight]) | 评估模型预测性能,返回模型预测的正确率。 |
decision_path(X[, check_input]) | 返回每个样本对应的树的决策路径。 |
这些方法使得DecisionTreeClassifier
不仅能够进行分类任务,还能够提供模型内部的详细信息,如特征重要性、决策路径等,有助于模型的解释和优化。
相关文章:
决策树(Decision Tree)基础知识
目录 一、回忆1、*机器学习的三要素:1)*函数族2)*目标函数2.1)*模型的其他复杂度参数 3)*优化算法 2、*前处理/后处理1)前处理:特征工程2)后处理:模型选择和模型评估 3、…...
跨域-告别CORS烦恼
跨域-告别CORS烦恼 文章目录 跨域-告别CORS烦恼[toc]1-参考网址2-思路整理1-核心问题2-个人思考3-脑洞打开4-个人思考-修正版1-个人思考2-脑洞打开 3-知识整理1-什么是跨域一、同源策略简介什么是源什么是同源是否是同源的判断哪些操作不受同源策略限制跨域如何跨域 二、CORS 简…...
浅论数据库聚合:合理使用LambdaQueryWrapper和XML
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库聚合替代内存计算(关键优化)二、批量处理优化四、区域特殊处理解耦五、防御性编程增强 前言 技术认知点:使用 XM…...
css实现元素垂直居中显示的7种方式
文章目录 * [【一】知道居中元素的宽高](https://blog.csdn.net/weixin_41305441/article/details/89886846#_1) [absolute 负margin](https://blog.csdn.net/weixin_41305441/article/details/89886846#absolute__margin_2) [absolute margin auto](https://blog.csdn.net…...
Nerf流程
一.数据处理: 在输入数据时,并没有给出相机的内参与外参,需要在数据处理得出相机的内外惨数,作者使用COLMAP得到相机参数后,转成NeRF可以读取的格式即可以用于模型训练。 旋转矩阵的第一列到第三列分别表示了相机坐标系…...
Spring Cloud Alibaba学习 5- Seata入门使用
Spring Cloud Alibaba学习 5- Seata入门使用 Seata是Spring Cloud Alibaba中用于分布式事务管理的解决方案 一. Seata的基本概念 1. Seata的三大角色 1> TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。TC作…...
Select 下拉菜单选项分组
使用<select>元素创建下拉菜单,并使用 <optgroup> 元素对选项进行分组。<optgroup> 元素允许你将相关的 <option> 元素分组在一起,并为每个分组添加一个标签。 <form action"#" method"post"><la…...
【无人机与无人车协同避障】
无人机与无人车协同避障的关键在于点云数据的采集、传输、解析及实时应用,以下是技术实现的分步解析: 1. 点云数据采集(无人机端) 传感器选择: LiDAR:通过激光雷达获取高精度3D点云(精度达厘米…...
AI视频领域的DeepSeek—阿里万相2.1图生视频
让我们一同深入探索万相 2.1 ,本文不仅介绍其文生图和文生视频的使用秘籍,还将手把手教你如何利用它实现图生视频。 如下为生成的视频效果(我录制的GIF动图) 如下为输入的图片 目录 1.阿里巴巴全面开源旗下视频生成模型万相2.1模…...
飞机大战lua迷你世界脚本
-- 迷你世界飞机大战 v1.2 -- 星空露珠工作室制作 -- 最后更新:2024年1月 ----------------------------- -- 迷你世界API适配配置 ----------------------------- local UI { BASE_ID 7477478487091949474-22856, -- UI界面ID ELEMENTS { BG 1, -- 背景 BTN_LE…...
Android15请求动态申请存储权限完整示例
效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...
Java 导出大数据到 Excel 表格
背景 之前的项目一直是用XSSFWorkbook来做 Excel 导出,在遇到大数据导出时,经常会遇到 OOM。在 Apache Poi 3.8 之后的版本提供的 SXSSFWorkbook 可以优雅的解决这个问题。 原理 SXSSFWorkbook 被称为流式 API,主要是因为它采用了流式写入…...
GCC RISCV 后端 -- GCC Passes 注释
在前面文章提到,当GCC 前端完成对C源代码解析完成后,就会使用 处理过程(Passes)机制,通过一系列的处理过程,将 GENERIC IR 表示的C程序 转步转换成 目标机器的汇编语言。过程描述如下图所示: 此…...
稚晖君级硬核:智元公司开源机器人通信框架AimRT入驻GitCode平台
在科技的浪潮中,机器人技术正以前所未有的速度发展。它们不再只是科幻小说中的概念,而是逐渐融入到我们的日常生活中,从工厂的自动化生产线到家庭的智能助手,机器人的身影无处不在。然而,随着机器人应用的日益复杂&…...
STM32L051系列单片机低功耗应用
STM32L051单片机支持多种低功耗模式,包括 Sleep(睡眠)、Stop(停止) 和 Standby(待机) 模式。不同模式的功耗和唤醒方式不同。 一、低功耗相关介绍 1.1 低功耗模式概览 模式功耗唤醒源时钟状态…...
【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现
基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM(Influence Region Map)通过建模障碍物的影响区域,量化环境中的安全风险,为RRT算法提供启发式引导。RRT(Rapidly-exploring Random…...
【JAVA架构师成长之路】【JVM实战】第1集:生产环境CPU飙高排查实战
课程标题:生产环境CPU飙高排查实战——从现象到根因的15分钟攻防战 目标:掌握CPU飙高问题的系统性排查方法,熟练使用工具定位代码或资源瓶颈 0-1分钟:问题引入与核心影响 线上服务器CPU突然飙升至90%以上,导致服务响应延迟激增,用户投诉激增。CPU飙高可能由死循环、线程…...
android edittext 防止输入多个小数点或负号
有些英文系统的输入法,或者定制输入法。使用xml限制不了输入多个小数点和多个负号。所以代码来控制。 一、通过XML设置限制 <EditTextandroid:id="@+id/editTextNumber"android:layout_width="wrap_content"android:layout_height="wrap_conten…...
Spring MVC 页面重定向返回后通过nginx代理 丢失端口号问题处理
Spring MVC页面重定向通过Nginx代理后出现端口丢失问题,通常由以下原因及解决方案构成: ## 一、Nginx配置问题(核心原因) 1. Host头传递不完整 Nginx默认未将原始请求的端口信息传递给后端,导致应用生成重定向…...
DeepSeek V3 源码:从入门到放弃!
从入门到放弃 花了几天时间,看懂了DeepSeek V3 源码的逻辑。源码的逻辑是不难的,但为什么模型结构需要这样设计,为什么参数需要这样设置呢?知其然,但不知其所以然。除了模型结构以外,模型的训练数据、训练…...
基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践
近年来,随着国产AI芯片的日益崛起,基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片,并保障算力安全,是目前亟需解决的问题。对此,京…...
LINUX网络基础 [一] - 初识网络,理解网络协议
目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型(理论标准) …...
Linux 开发工具
linux中,常见的软件安装方式---下载 yum/apt.rpm安装包安装源码安装 yum 查看软件包 通过yumlist命令可以罗列出当前⼀共有哪些软件包.由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包.例如: # Centos $ yum list | grep lrzsz lr…...
SpringBoot 全局异常处理
文章目录 异常处理全局异常处理(推荐)局部异常处理高级技巧设置返回状态码处理404异常异常处理 全局异常处理(推荐) 创建一个全局异常处理类,使用 @RestControllerAdvice 注解标记。 在方法上使用 @ExceptionHandler 声明当前方法可处理的异常类型。当系统发生异常时,…...
EA - 开源工程的编译
文章目录 EA - 开源工程的编译概述笔记环境备注x86版本EABase_x86EAAssert_x86EAThread_x86修改 eathread_atomic_standalone_msvc.h原始修改后 EAStdC_x86EASTL_x86EAMain_x86EATest_x86备注备注END EA - 开源工程的编译 概述 EA开源了‘命令与征服’的游戏源码 尝试编译. 首…...
springboot3 WebClient
1 介绍 在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官…...
【Python项目】基于深度学习的车辆特征分析系统
【Python项目】基于深度学习的车辆特征分析系统 技术简介:采用Python技术、MySQL数据库、卷积神经网络(CNN)等实现。 系统简介:该系统基于深度学习技术,特别是卷积神经网络(CNN),用…...
爬虫不“刑”教程
在大数据时代,信息的获取至关重要,而网络爬虫正是帮助我们从互联网上获取海量数据的重要工具。无论是数据分析、人工智能训练数据,还是商业情报收集,爬虫技术都能发挥重要作用。本篇文章将全面解析 Python 爬虫的各个方面…...
深入解析 supervision 库:功能、用法与应用案例
1. 引言 在计算机视觉任务中,数据的后处理和可视化是至关重要的环节,尤其是在目标检测、分割、跟踪等任务中。supervision 是一个专门为这些任务提供高效数据处理和可视化支持的 Python 库。本文将深入介绍 supervision 的功能、使用方法,并…...
【橘子golang】从golang来谈闭包
一、简介 闭包(Closure)是一种编程概念,它允许函数捕获并记住其创建时的上下文环境(包括变量)。闭包通常用于函数式编程语言,但在许多现代编程语言中也有支持,包括 Go ,Js等支持函数…...
盛铂科技PDROUxxxx系列锁相介质振荡器(点频源):高精度信号源
——超低相位噪声、宽频覆盖、灵活集成,赋能下一代射频系统 核心价值:以突破性技术解决行业痛点 在雷达、卫星通信、高速数据采集等高端射频系统中,信号源的相位噪声、频率稳定度及集成灵活性直接决定系统性能上限。盛铂科技PDROUxxxx系列锁…...
Linux | Vim 鼠标不能右键粘贴、跨系统复制粘贴
注:本文为 “ Vim 中鼠标右键粘贴、跨系统复制粘贴问题解决方案” 相关文章合辑。 未整理去重。 Linux 入门:vim 鼠标不能右键粘贴、跨系统复制粘贴 foryouslgme 发布时间 2016 - 09 - 28 10:24:16 Vim 基础 命令模式(command - mode&…...
仿12306项目(4)
基本预定车票功能的开发 对于乘客购票来说,需要有每一个车次的余票信息,展示给乘客,供乘客选择,因此首个功能是余票的初始化,之后是余票查询,这两个都是控台端。对于会员端的购票,需要有余票查询…...
调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)
文章目录 调研:如何实现智能分析助手(Agent)(AutoCoder、FastGPT、AutoGen、DataCopilot)一、交互流程二、数据流程三、架构分类四、开源产品4.1 AutoCoder(知识库变体)4.2 FastGPT(…...
爬虫逆向:脱壳工具Youpk的使用详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Youpk 简介1.1 Youpk介绍1.2 Youpk支持场景1.3 Youpk基本流程1.4 使用 Youpk 脱壳步骤1.5 常用的脱壳工具对比2. Youpk 的安装与使用2.1 安装 Youpk2.2 使用 Youpk 脱壳3. 脱壳后的 Dex 文件分析3.1 使用 JADX 反编译…...
Java 大视界 -- Java 大数据在智能政务公共服务资源优化配置中的应用(118)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
Java停车平台高并发抢锁技术方案设计 - 慧停宝开源停车管理平台
Java停车平台高并发抢锁技术方案设计 一、业务场景特征 瞬时流量峰值 早晚高峰时段(07:30-09:00, 17:30-19:00)请求量激增10倍热门商圈停车场每秒并发请求可达5000 QPS 资源竞争特性 单个车位被多人同时抢占(超卖风险)用户操作链…...
【论文笔记】Attentive Eraser
标题:Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source:https://arxiv.org/pdf/2412.12974 收录:AAAI 25 作者单位:浙工商,字节&#…...
Android Flow操作符分类
Flow操作符分类...
Cursor + IDEA 双开极速交互
相信很多开发者朋友应该和我一样吧,都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码,然后在IDEA中进行调试和优化 在这个双开模式的开发过程中,我就遇到一个说大不大说小不小的问题: 得在两个编辑器之间来回切换查…...
图像识别-手写数字识别项目
训练模型: 实现神经网络实例 准备数据 导入torchvision.transforms模块,它提供了许多常用的数据预处理操作,如裁剪、旋转、归一化等。 从torch.utils.data模块导入DataLoader类,用于加载数据集并提供批量处理功能。 导入tensorboa…...
推荐几款优秀的PDF转电子画册的软件
当然可以!以下是几款优秀的PDF转电子画册的软件推荐,内容简洁易懂,这些软件都具有易用性和互动性,适合不同需求的用户使用。 ❶ FLBOOK|在线创作平台 支持PDF直接导入生成仿真翻页电子书。提供15主题模板与字体库&a…...
bert模型笔记
1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型,Base和Large。Uncased是意味着输入的词都会转变成小写,cased是意味着输入的词会保存其大写(在命名实体识别等项目上需要)。Multilingual是支持多语言的࿰…...
利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南
在地理信息分析与处理的工作中,ArcGIS Pro 是一款功能强大的 GIS 软件,它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在,就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度,这一技能在城市规划、…...
数据库系统概论(一)详细介绍数据库与基本概念
数据库系统概论(一)介绍数据库与基本概念 前言一、什么数据库1.数据库的基本概念2.数据库的特点 二、数据库的基本概念1. 数据2. 数据库3.数据库管理系统4.数据库系统 三、数据管理技术的产生和发展四、数据库系统的特点1.数据结构化2.数据共享性3.数据冗…...
数字IC后端实现教程| Clock Gating相关clock tree案例解析
今天小编给大家分享几个跟时钟树综合,clock tree相关的典型问题。 数字IC后端设计实现之分段长clock tree经典案例 Q1:星主好,下面的图是通过duplicate icg来解setup违例的示意图。我没看懂这个 duplicate操作在cts阶段是怎么实现的,用什么…...
build gcc
1,下载源码 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-4.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.2.1.tar.gz git clone --mirror https://github…...
软考架构师笔记-计算机网络
1.9 计算机网络 OSI/RM 七层模型 物理层 二进制传输(中继器、集线器) (typedef) 数据链路层 传送以帧为单位的信息(网桥、交换机、网卡) 网络层 分组传输和路由选择(三层交换机、路由器)ARP/RARP/IGMP/ICMP/IP 传输层 端到端的连接(TCP/UDP)在前向纠错系统中,当接…...
ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包
用linuxdeployqt打包太麻烦,每次程序编译都要用linuxdeployqt打包一次,而且每次都要很长时间,通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件(只要没有增加新模块,只要用一次就可以) …...
Spark(6)vm与centos虚拟机
(一)克隆虚拟机 vm软件提供了克隆的功能,它可以允许我们从一台虚拟机上快速克隆出其他的一模一样的主机。 具体的操作步骤如下: 关闭hadoop100这台虚拟机。在它身上右键,并选择管理 → 克隆 命令 在随后的设置中&#…...