虽然单个决策树(正如我们在上一节看到的那样)通过划分特征空间提供了一种可解释的数据建模方式,但它们有其局限。它们容易出现过拟合,这意味着它们对训练数据(包括其中的噪声)学习得过于充分,而在未见过的数据上表现不佳。它们也可能不稳定;训练数据中的微小变化会导致树结构明显不同。为解决这些问题,集成方法结合多个决策树以生成更准确的模型。两种突出且广泛使用的树集成技术是随机森林和梯度提升。两者都使用基本的树结构,但以不同的方式构建和组合它们。随机森林:对多个不同树的预测取平均随机森林基于创建大量决策树并汇总其输出的原理运作。其核心思想是,通过平均许多不同、单独不完善的树的预测结果,整体预测会变得更准确,且对训练数据的具体情况不那么敏感。随机森林中的“随机性”来自两个主要方面:数据随机性(自助聚合): 森林中的每棵树都使用原始训练数据的不同随机子集进行训练,这些子集是有放回地选取的。这个过程被称为自助聚合,或称bagging。这表示一些数据点可能在子集中出现多次,而另一些则可能根本不被包括。这确保了每棵树看到的数据版本略有不同,从而带来多样性。特征随机性: 在树的每个节点决定最佳划分时,算法不考虑所有可用特征,而是只考虑特征的一个随机子集。这进一步促进了树之间的多样性,阻止少数主导特征控制所有树的结构。digraph G { rankdir=TB; node [shape=record, style=rounded, fontname="Arial", fontsize=10]; edge [arrowhead=vee, arrowsize=0.7]; subgraph cluster_data { label="原始数据 (D)"; bgcolor="#e9ecef"; node [shape=box, style=filled, fillcolor="#a5d8ff"]; D [label="{(x1, y1), (x2, y2), ..., (xn, yn)}"]; } subgraph cluster_bootstrap { label="自助样本"; bgcolor="#e9ecef"; node [shape=box, style=filled, fillcolor="#bac8ff"]; B1 [label="D1 (从 D 采样)"]; B2 [label="D2 (从 D 采样)"]; Bk [label="Dk (从 D 采样)"]; } subgraph cluster_trees { label="决策树(划分时使用特征子集)"; bgcolor="#e9ecef"; node [shape=ellipse, style=filled, fillcolor="#96f2d7"]; T1 [label="树 1"]; T2 [label="树 2"]; Tk [label="树 k"]; } subgraph cluster_agg { label="聚合"; bgcolor="#e9ecef"; node [shape=diamond, style=filled, fillcolor="#ffec99"]; Agg [label="投票 / 平均"]; } Final [label="最终预测", shape=box, style=filled, fillcolor="#ffd8a8"]; D -> {B1, B2, Bk} [style=dashed, label="自助聚合"]; B1 -> T1 [label="在 D1 上训练"]; B2 -> T2 [label="在 D2 上训练"]; Bk -> Tk [label="在 Dk 上训练"]; {T1, T2, Tk} -> Agg; Agg -> Final; }随机森林过程示意图:数据通过自助采样生成多个样本,每个样本用于训练一个决策树,并在划分时考虑随机特征子集。预测结果被聚合。为了对新的数据点进行预测,随机森林会将输入通过森林中的每棵树。对于分类任务,最终预测通常是个别树获得最多票数的类别。对于回归任务,最终预测通常是所有树的预测结果的平均值。这种方法明显降低了方差,与单个决策树相比,而不会大幅增加偏差。随机森林以其在默认设置下的良好表现、对过拟合的抵抗力以及在预测中评估不同特征重要性的能力而闻名。从结构上看,随机森林只是树对象的一个集合(例如,列表或数组)。梯度提升:顺序误差校正梯度提升机(GBM),尤其是那些使用树作为基础学习器(梯度提升树)的,采用不同方法。与随机森林并行构建独立树不同,梯度提升是顺序构建树。每棵新树都试图纠正到目前为止所构建的树集成模型产生的误差。该过程通常按以下方式进行:初始化: 从一个简单的初始模型开始。对于回归任务,这可以只是目标变量的平均值。迭代: 重复指定数量的树:计算残差: 计算当前集成模型在训练数据上产生的误差(残差)。残差是实际目标值与预测值之间的差异。拟合新树: 训练一棵新的决策树(通常深度受限)来预测这些残差。这棵树会学习误差中的模式。更新集成模型: 将新训练的树添加到集成模型中。它的贡献通常会乘以一个称为“学习率”(eta, $ \eta $)的小因子。这种缩放通过进行更小的校正步长来防止过拟合。集成模型的预测更新为: $$ F_{m}(x) = F_{m-1}(x) + \eta \cdot h_m(x) $$ 其中 $F_m(x)$ 是 $m$ 棵树后的集成预测,$F_{m-1}(x)$ 是前一个集成模型的预测,$h_m(x)$ 是新树的预测(预测残差),且 $ \eta $ 是学习率。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10]; edge [arrowhead=vee, arrowsize=0.7]; Input [label="输入数据", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; M0 [label="初始模型\n(例如,平均值)", style=filled, fillcolor="#ffec99"]; Res1 [label="计算\n残差 1", shape=invhouse, style=filled, fillcolor="#ffc9c9"]; T1 [label="拟合树 1\n(针对残差 1)", style=filled, fillcolor="#96f2d7"]; M1 [label="集成模型 1\n(M0 + η*T1)", style=filled, fillcolor="#ffec99"]; Res2 [label="计算\n残差 2", shape=invhouse, style=filled, fillcolor="#ffc9c9"]; T2 [label="拟合树 2\n(针对残差 2)", style=filled, fillcolor="#96f2d7"]; M2 [label="集成模型 2\n(M1 + η*T2)", style=filled, fillcolor="#ffec99"]; Resk [label="...", shape=none]; Tk [label="...", shape=none]; Mk [label="最终集成模型\n(M_{k-1} + η*Tk)", style=filled, fillcolor="#ffd8a8"]; Input -> M0; Input -> Res1; M0 -> Res1; Res1 -> T1; M0 -> M1; T1 -> M1 [label=" η"]; Input -> Res2; M1 -> Res2; Res2 -> T2; M1 -> M2; T2 -> M2 [label=" η"]; M2 -> Resk; Resk -> Tk; Tk -> Mk [label=" η"]; }显示梯度提升顺序性质的图示。每棵新树都在当前集成模型的残差(误差)上进行训练,逐步提升整体预测性能。梯度提升通常能得到预测准确度很高的模型。然而,与随机森林相比,它需要更仔细地调整超参数(如树的数量、树深度和学习率)。如果控制不当,梯度提升模型也可能过拟合。顺序性质表示训练不如随机森林那样容易并行化。数据结构与性能随机森林和梯度提升都基本依赖决策树数据结构。集成模型本身通常存储为这些树结构的一个集合(例如,列表或数组)。对于梯度提升,还可能存储学习率或与每棵树相关的特定权重等附加信息。训练: 构建集成模型可能需要大量计算。随机森林得益于并行化,因为树可以独立构建。梯度提升本质上是顺序的,限制了跨树的并行化(尽管在单棵树的构建中可以并行化)。预测: 进行预测通常很快。对于随机森林,输入独立地遍历所有树,结果被聚合。对于梯度提升,输入顺序地遍历树(尽管在许多实现中,其结构允许高效的组合评估)。复杂度大致与集成模型中树的数量呈线性关系。理解这些集成方法显示了如何以巧妙的方式结合简单的树结构,产生强大且广泛使用的机器学习模型。它们有效减轻了单个决策树的缺点,为各种分类和回归任务提高了准确性和稳定性。