决策树- 基本知识
● 示例:用于分类的决策树
● 决策树 —— 思想
■ 以流程图般的结构表示特征和标签/值之间的映射
● 组件(此刻稍微简化了一些)
■ (内部)节点 —— 对单一特征的测试
■ 分支 —— 测试的结果;对应于一个特征值或值的范围
■ 叶子 —— 标签(分类)或实值(回归)
● 对于未知数据的应用
● 同一数据集,不同的决策树
■ 一般来说,有多个树与一个数据集相匹配
决策树 —— 多样性(预览)
● 不同的分支因子
● 不同的深度
■ 叶子可以有多于一个的标签或实值
■ 基于数据集或选择所需(➜ 剪枝)
■ 最终输出:多数标签(分类)或值的平均(回归)
训练决策树
构建决策树
● 符号
■ —— 到达节点t的记录集
■ —— 根节点处的所有记录集
● 一般程序
■ 如果 或
中的所有记录具有相同的类或值 ➜ t是叶节点
■ 否则,选择测试(特征+条件)来将 分割成更小的子集(即,子树)
■ 递归地将程序应用到每个子树
举例构建决策树
不同的标签 ➜ 分割记录集 这里:选择特征“年龄”和阈值“50” (这个选择过程是DTL的核心,将在后面定义)
如何分割? —— 名称属性
● 二元分割
■ 将所有d值分割成两个子集, 没有排名,顺序...
■ 可能的分割
● 多路分割
■ 每个值产生一个子树
■ 原则上,可以将其任意分割成2 ≤ s ≤ d个子树,但可能的分割数量会爆炸性增长
如何分割? —— 序数属性
● 二元分割
■ 将所有d值分割成两个子集
■ 分割必须保持值的自然顺序
■ d-1 可能的分割
● 多路分割
■ 每个值产生一个子树
注意:将“教育”视为名义特征还是序数特征取决于解释和用户的设计选择。
如何分割? —— 数值
寻找最佳分割
● 全局最优
■ 最佳分割 = 导致决策树具有最高准确度的分割
■ 问题:找到最优树是NP完全问题 ➜ 对于大型数据集不实用
● 贪婪方法
■ 快速(更快)的启发式方法,但不能保证最优结果
■ 基本方法:选择使子树的不纯度最小化的分割(相对于类标签)
● 一般程序
■ 分割前计算节点 的不纯度
■ 对于每个可能的考虑的分割,计算分割
的不纯度 (结果子节点的不纯度的加权平均)
■ 选择不纯度 最低的分割
■ 如果 —(不一定总是这样)执行分割
节点的不纯度(分类)
● 基尼指数 :
● 熵 :
= 在 t 节点中,类别 c 的相关频繁度
● 例子
■ 0 x YES, 6 x NO
■ 基尼指数 :
■ 熵 :
■ 2. 4 x YES, 2 x NO
■ 基尼指数 :
■ 熵 :
● 二分类问题中的基尼指数 vs. 熵
● 所有子节点的不纯度值之和,按每个子节点的记录数量加权。
● 假设节点t分割成k个子节点
■ — 是第 i 个子节点的记录数量
■ — 是节点 t 的记录数量
■ — 是节点的不纯度(例如,基尼,熵)
● 信息增益 IG
■ 和
之间的差异
■ 选择使 最小化的分割=最大化
的分割
■ 必要条件:
信息增益 IG 越大,表示分割的效果越好,因为我们通过分割得到了更纯的子节点。
分割的不纯度(回归)
残差平方和(RSS)
-
外部求和
:这表示我们对所有 K 个区域或组进行迭代。
-
内部求和
:这表示我们对属于第 k 个区域或组 Rk 的所有数据点进行迭代。
-
:这是第 i 个观测值的实际响应。
-
:这是第 k 个区域或组 Rk 中所有观测值的平均响应。
-
:这是第 i 个观测值的实际响应与其所在区域或组的平均响应之间的差异的平方。
整个公式的目的是计算所有区域或组中的所有观测值与其所在区域或组的平均响应之间的差异的平方和。这是一个衡量模型拟合数据的好坏的指标,特别是在决策树和其他分区方法中。
简而言之,这个公式计算了每个数据点的响应与其所在组的平均响应之间的差异,并对所有这些差异进行了平方和累加,以得到整体的RSS。RSS越小,表示模型的拟合效果越好。
决策树 —— 优点 & 缺点
● 优点
■ 训练和测试成本低
■ 易于解释(如果树不是太大)
■ 可以处理分类和数值数据
● 缺点
■ 对训练数据中的小变化敏感 (层次结构:早期的错误会向下传播)
■ 贪婪方法不能保证最优树
■ 每个决定只涉及一个特征
■ 不考虑特征之间的交互
决策树 —— 特征之间的交互

过拟合
决策树 —— 欠拟合 & 过拟合
过拟合: 训练得分增加, 测试得分减少
"最佳点"
欠拟合: 训练和测试 得分(非常)低
决策树 —— 过拟合
● 决策树算法总是可以 完美分割训练数据*
■ 继续分割(即,增加树的高度) 直到每个叶子只包含一个数据样本
■ 一个数据样本 ➜ 100% 纯净
● 解决方案:限制决策树的大小/高度 ➜ 剪枝
■ 预剪枝:提前停止分割节点
■ 后剪枝:构建完整树,但如果有益则删除叶子/分割
■ … 多种方法的组合
*假设没有具有不同目标标签/值的重复数据点
预剪枝:最大深度
● 定义树的最大深度/高度
■ 如果达到最大深度就停止分割
● 示例:最大深度 = 3
预剪枝:最小样本数
● 定义每个节点必须有的最小样本数
■ 如果节点少于最小样本数就停止分割
● 示例:最小样本数 = 16 ➜ 从决策树中移除分割(并继续检查下一个分割)
后剪枝:使用验证来剪除叶子/分割
树集成
● 目标是解决(单一)决策树的局限性
■ 高方差 — 即,对训练数据中的小变化敏感
■ 通常没有其他方法那么准确
● 对策:树集成 — 构建许多决策树并结合它们的预测
■ Bagging
■ 随机森林
■ Boosting
集成方法的基本权衡: 更高的准确性,更低的方差 vs. 较低的可解释性,更长的训练时间
强预测器
● 强预测器是指在模型中具有很高预测能力的特征或模型。
-
在特征的上下文中:强预测器是指那些与目标变量高度相关的特征。这些特征在分割数据或进行预测时可以产生高信息增益。例如,在预测房价的任务中,房屋的面积可能是一个强预测器,因为它与房价高度相关。
-
在模型的上下文中:强预测器可以指一个模型,该模型在某个特定任务上的预测性能非常好。例如,深度神经网络在图像分类任务上可能被认为是一个强预测器,因为它通常能够达到很高的准确率。
强预测器与弱预测器相对。弱预测器是指那些预测能力仅比随机猜测略好的特征或模型。在集成学习中,多个弱预测器可以被组合起来形成一个强预测器,从而提高整体的预测性能。
Bagging — Bootstrap聚合
● Bagging — 基本思想(不仅限于决策树)
■ 使用不同的训练数据训练许多模型(分类器/回归器)
■ 结合每个模型的预测作为最终预测
■ 提高准确性并降低方差
● 从哪里获得更多的训练数据? ➜ Bootstrap采样
■ 从单一训练数据集 中重复抽样
■ Bootstrap样本 从
中均匀抽样并替换
■ 在每个bootstrap数据集 上训练一个模型
● 局限性
■ 假设原始数据集 有一个或多个强预测器 — 产生具有(非常)高信息增益的特征分割
- 这意味着在原始数据集D中,存在一个或多个特征,这些特征在用于分割数据时可以产生非常高的信息增益。信息增益是一个指标,用于衡量通过使用某个特征进行分割后,数据的不纯度减少了多少。高信息增益意味着分割后的子集比分割前的数据集更“纯净”。
- 强预测器通常指的是那些能够很好地区分不同类别的特征。
■ Bootstrap样本 也可能具有那些强预测器
- Bootstrap样本是通过从原始数据集D中随机抽取样本(允许重复抽样)得到的。因为Bootstrap样本Di是从原始数据集D中抽取的,所以它也可能包含那些强预测器。
- 这意味着,当我们在Bootstrap样本Di上构建模型(例如,在随机森林算法中构建决策树)时,这些强预测器也可能被选为分割特征,从而产生高信息增益。
➜ 后果
■ 大多数bagged树会在顶部使用强预测器 ➜ 只有有限的方差减少!
- 当原始数据集中存在一个或多个强预测器时,这些预测器在分割数据时会产生高信息增益。因此,大多数通过Bootstrap样本生成的bagged树在其顶部节点(即树的开始部分)都可能会选择这些强预测器作为分割特征。
- 结果是,这些树在结构上可能会非常相似,因为它们都首先选择了相同的强预测器进行分割。这限制了树之间的多样性,从而导致方差减少的效果有限。
■ 大多数bagged树看起来会非常相似 ➜ 只有有限的方差减少!
- 由于上述原因,大多数bagged树在结构上可能会非常相似。这意味着,尽管我们通过Bootstrap方法生成了多个不同的样本,但得到的树可能仍然非常相似。
- 当树的多样性受到限制时,bagging的主要优势(即通过平均多个模型的预测来减少方差)可能会受到影响。
■ bagged树的预测将高度相关 ➜ 只有有限的方差减少!
- 由于大多数bagged树在结构上都非常相似,它们的预测结果也可能高度相关。
- 当多个模型的预测高度相关时,将它们的预测结果进行平均可能不会显著减少方差。这是因为高度相关的预测不会为最终的集成预测提供足够的多样性。
随机森林


随机森林 —— 优点 & 缺点(与决策树相比)
Boosting
● 像bagging一样,boosting结合了多个树(一般来说,是多个模型)
● 那么关键的区别是什么呢?
● 训练:
■ Bagging:树独立训练 (可以并行进行)
■ Boosting:树按顺序训练; (最后一棵树的准确性会影响下一棵树的训练)
● 预测:
■ Bagging:所有树在最终预测中都有相同的权重
■ Boosting:树在最终预测中有不同的权重 (取决于它们各自的准确性)
Boosting & 弱学习器
● 到目前为止,讨论的所有模型都是强学习器
■ 目标:在给定的分类或回归任务上表现得尽可能好
● 弱学习器
■ 目标:表现得(稍微)好过随机猜测
■ 非常常见的弱学习器:决策树桩 (例如,高度为1的决策树,即,只有一个分割)
■ 非常简单的模型 ➜ 训练非常快
● Boosting:将许多弱分类器组合成一个强学习器
■ 基本思想:后续模型试图改进前一个模型的错误
AdaBoost — 自适应Boosting(用于决策树)
● AdaBoost
■ 可用于许多分类/回归算法以提高性能
■ 与决策树非常常见的组合
● 基本训练算法
■ 在 上训练一个弱学习器(例如,决策树桩)
■ 识别所有分类错误的样本
■ 计算学习器的错误率以量化其权重
■ 采样,使得分类错误的样本 比分类正确的样本更可能被选中
■ 重复...
AdaBoost训练 — 逐步示例(在第m次迭代中)
● 步骤1:
■ 1a)在采样数据集 上训练决策树桩
(最初的数据集D在开始时)
首先,我们使用整个数据集D(在开始时, 就是D)来训练决策树桩
。决策树桩是一个简单的决策树,它基于单一特征进行分割。在这个例子中,我们可以选择“Education”作为分割特征,因为它似乎与“Credit Approval”有关。
■ 1b)识别D中所有分类错误的训练样本
根据给定的数据和“Education”特征的分类结果:
- “Bachelor”类别:3次“No”,并且都是正确的。
- “Master, PhD”类别:5次“Yes”和1次“No”,其中有一个是不正确的。
从数据中,我们可以看到:
- 对于“Bachelor”类别,所有的“No”预测都是正确的。
- 对于“Master, PhD”类别,大多数样本的“Credit Approval”是“Yes”,但有一个样本(55岁,学历为“Master”)的“Credit Approval”是“No”。这意味着这个“No”是被误分类的。
因此,被误分类的样本是:
- 55岁的样本,学历为“Master”,信用批准为“No”。
这就是在Step 1中,我们训练决策树桩后,从数据集D中识别出的被误分类的样本。
● 步骤2
■ 2a)计算总错误 :
;
: 0,如果
被正确分类 ; 1,如果
被错误分类
■ 2b)计算 的“权重”
:
;
● 步骤3
■ 3a)更新样本权重
e=2.718, ,
增加, 相反
减少
■ 3b)标准化样本权重
● 步骤4
■ 4a)基于样本权重生成新的 (分类错误的样本更有可能被选中)
从第一个数据集中,我们可以看到第6个样本的权重为0.492,远高于其他样本。这意味着这个样本在上一次迭代中被误分类。
当我们基于这些权重生成新的数据集 时,权重较高的样本更有可能被选中。这就是为什么在“New input for Step 1”中,第6个样本(55岁,学历为“Master”,年收入为85k,信用批准为“No”)被重复选中了四次。
■ 4b)使用新的 ,转到步骤1并继续
现在,我们有了一个新的数据集 ,其中包含了重复的第6个样本。我们将使用这个新的数据集回到Step 1,并继续AdaBoost算法的下一次迭代。
在Step 1中,我们将再次训练一个决策树桩,并尝试更好地分类这些样本,特别是那些在上一次迭代中被误分类的样本。因为第6个样本现在在数据集中出现了四次,所以模型会更加关注这个样本,从而提高其分类准确性。
AdaBoost训练 — 基本算法
● 初始化:数据集D,|D|=N,初始样本权重
● 对于m = 1到M:
■ 根据采样权重w从D中生 成
■ 在 上训练决策树桩
弱学习者
■ 将 应用于D中的所有样本并识别分类错误的样本
■ 计算总错误
■ 计算权重
■ 更新样本权重
● 结束
为什么这样做会有帮助呢?
-
关注难分类的样本:AdaBoost通过增加被误分类样本的权重,使模型更加关注这些样本。这鼓励模型在下一次迭代中更好地分类这些样本。
-
增加模型的多样性:每次迭代都会产生一个不同的模型,因为每次迭代都是在不同的权重分布下训练的。这种多样性使得集成的模型更加健壮。
-
弱学习器的组合:AdaBoost使用的是弱学习器(通常是决策树桩)。单独看,这些学习器可能并不准确,但当它们组合在一起时,它们的性能会显著提高。
举个例子:想象一个老师正在教一个班级。某些学生可能在某些主题上遇到困难。如果老师注意到这一点,并在下一堂课上为这些学生提供额外的关注和帮助,那么这些学生在这个主题上的理解可能会得到改善。AdaBoost的原理与此类似:它为那些在前一个模型中被误分类的样本提供额外的关注,以帮助下一个模型更好地分类它们。
AdaBoost预测
● 假设有8个boosted决策树桩 ;
■ 每棵树都有一个“权重”
■ 让h1,h3,h8说“是”;所有其他树说“否”
在给定的例子中:
- 决策树桩 h1、h3 和 h8 预测为“Yes”。
- 所有其他的决策树桩(h2、h4、h5、h6 和 h7)预测为“No”。
为了得到最终的预测,我们需要考虑每个决策树桩的预测和它的权重。
- 对于预测为“Yes”的决策树桩,我们将它们的权重加起来:0.34+1.20+0.97=2.510.34+1.20+0.97=2.51。
- 对于预测为“No”的决策树桩,我们也将它们的权重加起来:0.14+0.58+0.09+0.62+0.45=1.880.14+0.58+0.09+0.62+0.45=1.88。
由于预测为“Yes”的决策树桩的总权重(2.51)大于预测为“No”的决策树桩的总权重(1.88),所以最终的预测是“Yes”。
这就是AdaBoost的工作原理。它不仅仅是简单地对所有决策树桩的预测进行平均或投票,而是根据每个决策树桩的性能为它们分配权重,并根据这些权重来确定最终的预测。
梯度提升树
● 梯度提升
■ 主要应用于回归算法以提高性能
■ 与决策树(用于回归)非常常见的组合
● 基本训练算法
■ 从一个初始预测开始(例如,所有值的平均值)
■ 计算残差=真实值与当前预测之间的误差
■ 训练决策树桩来预测残差
■ 根据预测的残差更新预测
■ 重复...
GB训练 — 逐步示例(在第m次迭代中)
● 步骤1:假设 m=1,
■ 1a)计算残差
这一步是计算每个样本的残差。残差是真实值 和前一次迭代的模型预测
之间的差异。在给定的表格中,这些残差已经为我们计算出来了,列在“rm(x)”列中。
例如,对于第一个样本(23岁,学历为Master),真实的信用限额是1,400,而前一次迭代的模型预测是1,000,所以残差是400。
■ 1b)将决策树桩 拟合到残差
这一步是基于残差来训练一个决策树桩。决策树桩是一个简单的决策树,它只基于一个特征进行分割。在这个例子中,我们选择“Annual Income”作为分割特征。
给定的分割点是:
- <67.5 AnnualIncome <67.5k
- <55 AnnualIncome<55k:平均残差是-300
- ≥55 AnnualIncome≥55k:平均残差是-266
- ≥67.5 AnnualIncome≥67.5k
- <80 AnnualIncome<80k:平均残差是350
- ≥80 AnnualIncome≥80k:平均残差是350
这些分割点和对应的平均残差值是基于训练数据计算出来的,目的是找到一个模型来尽可能好地拟合这些残差。
● 步骤2:
■ 2a)计算所有训练样本的预测残差
这一步是使用新训练的模型 hm 来预测每个样本的残差。在给定的表格中,这些预测的残差已经为我们计算出来了,列在“hm(x)”列中。
例如,对于第一个样本(23岁,学历为Master),新模型的预测残差是350。
■ 2b)计算新的预测 (这里:
)
这一步是更新每个样本的预测。新的预测是前一次迭代的预测加上新模型的预测残差乘以一个学习率 η。
例如,对于第一个样本,前一次迭代的预测是1,000,新模型的预测残差是350,学习率是0.1,所以新的预测是:
fm(x)=1,000+0.1×350=1,035
在给定的表格中,这些新的预测已经为我们计算出来了,列在“fm(x)”列中。
■ 2c)设置m = m+1,转到步骤1
这一步是简单地增加迭代次数 m 并返回到Step 1,开始下一次迭代。
注意:长期趋势
● 残差 趋向于 0
● 预测值 更接近真实值
● 在步骤1和2之后,对于m+1的输出
包括构建新的决策树桩
梯度提升训练 — 基本算法 初始化:
● 数据集D,,
● 对于m = 1到M:
■ 计算残差(误差)
■ 用作目标 在D上训练决策树桩
■ 预测所有训练样本的残差
■ 计算新的预测
● 结束
● 输出:M个决策树桩h1,h2,…,hM
总之,梯度提升的目标是通过迭代地更新模型的预测来优化模型的性能。在每次迭代中,它都会训练一个新的模型来尝试更好地拟合前一次迭代的残差,并使用这个新模型来更新每个样本的预测。
梯度提升训练 — 对于x0和x1的收敛
梯度提升预测
Boosting方法 — 优点 & 缺点(与决策树相比)
● 优点
■ 高准确性 — 通常是最先进的
● 缺点
■ 较难解释(可以说比随机森林还要难)
■ 训练和预测较慢 ➜ 顺序处理 ➜ 不可并行化
总结
● 决策树
■ 直观的分类和回归模型 ➜ 可解释!
■ 可以处理分类和数值数据(尽管在实践中有点棘手)
■ 通常结果不错但不是最好
● 树集成
■ 目标是解决单个决策树的局限性(特别是高方差)
■ 独立模型的集成:Bagging,随机森林
■ 依赖模型的集成:AdaBoost,梯度提升树
■ 在许多应用场景中是最先进的
-
Bagging (Bootstrap Aggregating):
- 原理:通过从原始数据集中随机抽取(允许重复)样本来生成多个训练集,并为每个训练集训练一个独立的模型。最后,对所有模型的预测结果进行平均(回归)或投票(分类)。
- 目的:减少模型的方差。
- 特点:所有模型都是独立地并行训练的。
-
Random Forest:
- 原理:是Bagging的一个扩展,但在构建每棵树时,它在每个节点随机选择一个特征子集进行分割,而不是使用所有特征。
- 目的:除了减少方差外,还增加了模型的多样性,从而进一步提高了模型的性能。
- 特点:特征的随机选择使得每棵树都不同,增加了集成的多样性。
-
Boosting:
- 原理:不同于Bagging和Random Forest的并行训练,Boosting是一种串行方法。它从一个基模型开始,然后根据前一个模型的错误调整样本的权重,并训练下一个模型。这个过程重复进行,直到达到预定的模型数量或模型的性能不再提高。
- 目的:减少偏差和方差。
- 特点:模型是串行训练的,每个模型都试图纠正前一个模型的错误。
例子: 假设我们有一个数据集,其中有一些数据点是线性可分的,而另一些数据点是噪声。我们想要对这些数据点进行分类。
- 使用单一决策树可能会过拟合,尤其是对噪声数据点。
- 使用Bagging,我们可以生成多个这样的决策树,并对它们的预测结果进行平均或投票,从而减少过拟合。
- 使用Random Forest,每棵树都会在不同的特征子集上进行分割,这进一步增加了模型的多样性,并提高了预测性能。
- 使用Boosting,第一个模型可能会对某些噪声数据点进行错误分类。但是,下一个模型会增加这些数据点的权重,并试图正确分类它们。经过多次迭代,Boosting可能会得到一个在大多数数据点上都表现很好的模型,包括那些噪声数据点。
梯度提升树(Gradient Boosted Trees,GBT)和AdaBoost都是集成学习方法,它们都使用多个弱学习器(通常是决策树)来构建一个强学习器。但是,它们的工作原理和目标有所不同。以下是它们之间的主要区别和对比,基于您之前的问题:
-
工作原理与目标:
- 梯度提升树:GBT的核心思想是迭代地拟合前一次迭代的残差。每次迭代都会训练一个新的决策树来尝试更好地拟合这些残差。
- AdaBoost:AdaBoost的核心思想是增加被误分类样本的权重。每次迭代都会训练一个新的决策树来尝试更好地分类那些在前一个模型中被误分类的样本。
-
权重与预测更新:
- 梯度提升树:GBT在每次迭代中都会更新每个样本的预测值,这是通过拟合残差并将其加到前一个模型的预测上来实现的。
- AdaBoost:AdaBoost在每次迭代中都会更新每个样本的权重,这是基于前一个模型的误分类率来实现的。预测是基于所有决策树的加权多数投票。
-
残差与权重:
- 梯度提升树:GBT的关键是计算并拟合残差,这些残差是真实值与前一次迭代的预测之间的差异。
- AdaBoost:AdaBoost的关键是计算并更新样本权重,这些权重是基于前一个模型的误分类来调整的。
-
预测的组合:
- 梯度提升树:GBT的最终预测是所有决策树预测的加权和。
- AdaBoost:AdaBoost的最终预测是基于所有决策树的加权多数投票。
-
应用领域:
- 梯度提升树:GBT可以用于回归和分类问题。
- AdaBoost:AdaBoost主要用于分类问题,但也可以用于回归。