标准梯度提升算法迭代地将新树拟合到模型当前预测的伪残差上。然而,这种方法容易出现过拟合,特别是当单个树被允许生长得较深或进行很多次提升迭代时。为了解决这个问题,引入随机性是提高机器学习模型稳定性和泛化能力的一种常见策略。类似的概念也可以有效地应用于梯度提升,这种变体通常被称为随机梯度提升 (SGB),由 Friedman 首次提出。SGB 不使用整个训练数据集来计算伪残差并拟合每个新的基础学习器 (树),而是在每次迭代中通过对数据进行抽样来引入随机性。这种修改主要有两个目的:通过降低方差来改善泛化能力,并且可能加快计算速度。在 GBM 框架中,抽样有两种主要的实现方式:行抽样这是与术语“随机梯度提升”最常见的关联形式。在拟合每棵新树 $h_m(x)$ 之前,会不放回地随机选择一部分训练实例(行)。假设所选比例是 $\eta_{subsample}$(在 Scikit-learn 等库中通常由名为 subsample 的参数控制)。仅使用 $N \times \eta_{subsample}$ 样本的这个子集来:基于当前的集成模型 $F_{m-1}(x)$,计算所选实例的伪残差。仅使用这些选定的实例及其对应的伪残差,拟合新的决策树 $h_m(x)$。未选择实例的伪残差不直接用于拟合第 $m$ 棵树。影响:正则化: 每棵树都看到数据的一个略微不同的子集,这使得整个模型不太可能完美地记住训练集的噪声或异常值。这降低了最终模型的方差。计算: 在较小的数据集上拟合树在计算上更快。与收缩的配合: 抽样通常与小的学习率(收缩)配合使用效果良好。抽样引入的随机性有助于稳定学习过程,尤其当单个树的贡献很小时。subsample 参数的常见范围是 0.5 到 0.8 之间。将 subsample 设置为 1.0 会恢复原始的确定性 GBM 算法用于行选择。使用小于 1.0 的值会引入随机性。比例过小可能会阻碍学习过程,增加偏差或需要显著更多的树。digraph SGB_Row_Subsampling { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10]; edge [fontname="Arial", fontsize=9]; subgraph cluster_0 { label = "完整训练数据 (N个样本)"; bgcolor="#e9ecef"; D [label="样本 1\n样本 2\n...\n样本 N", shape=note]; } subgraph cluster_1 { label = "第 m 次迭代"; bgcolor="#a5d8ff"; Res [label="计算第 m 次抽样\n的伪残差"]; Fit [label="在第 m 次抽样上\n拟合树 h_m(x)"]; Sub [label="选择随机子样本\n(N * η_subsample 行)"]; D -> Sub [style=invis]; // Position alignment Sub -> Res; Res -> Fit; } subgraph cluster_2 { label = "第 m+1 次迭代"; bgcolor="#a5d8ff"; Res_1 [label="计算第 m+1 次抽样\n的伪残差"]; Fit_1 [label="在第 m+1 次抽样上\n拟合树 h_{m+1}(x)"]; Sub_1 [label="选择随机子样本\n(不同子集)"]; D -> Sub_1 [style=invis]; // Position alignment Sub_1 -> Res_1; Res_1 -> Fit_1; } Sub -> Sub_1 [style=invis, weight=100]; // Ensure layout flow Start [label="开始", shape=ellipse, style=filled, fillcolor="#ced4da"]; Start -> Sub [label=" 为 F_0 使用\n完整数据"]; Fit -> Fit_1 [label=" 将 ν * h_m(x)\n添加到集成模型 F_m", constraint=false]; Fit_1 -> Stop [label=" ...", constraint=false]; Stop [label="最终模型 F_M(x)", shape=ellipse, style=filled, fillcolor="#ced4da"]; }随机梯度提升中的行抽样。在每次迭代 (m, m+1, ...) 中,都使用训练实例的一个不同随机子集来计算残差并拟合下一棵树。列抽样 (特征抽样)除了对行进行抽样,我们在构建每棵树时还可以对特征(列)进行抽样。这类似于随机森林中常用的特征抽样。在每个节点找到最佳分割之前(或有时,每棵树只执行一次),会考虑一个随机的特征子集。在 Scikit-learn 的 GradientBoostingClassifier 和 GradientBoostingRegressor 中,这由 max_features 参数控制。影响:正则化: 防止模型过于依赖少数可能占主导地位的特征。鼓励树之间的多样性并提高模型的稳健性。计算: 减少了每个节点寻找最佳分割的搜索空间,这可以显著加快训练速度,尤其对于具有许多特征的数据集。max_features 参数通常可以设置为:一个整数:精确使用该数量的特征。一个浮点数 (比例):使用 max_features * n_features 个特征。特定字符串:例如 'sqrt' 或 'log2'。使用 max_features=None 或 max_features=n_features 意味着所有特征都会被考虑,禁用列抽样。组合抽样方法行抽样和列抽样并非相互排斥;它们可以一起使用。将它们组合提供了一个强大的正则化机制,并且可以进一步提高计算效率。例如,将 subsample 设置为 0.8 且 max_features 设置为 0.8 意味着每棵树都使用 80% 的行构建,并在寻找分割时考虑 80% 的特征。这些方法将确定性 GBM 转换为随机算法。虽然在优化过程中引入随机性可能看起来反直觉,但它通常使模型对未见过的数据表现出更好的泛化能力,这通过防止过拟合并在提升过程中考察更多不同类型的基础学习器来实现。subsample 和 max_features 都成为模型开发过程中重要的超参数,需要调整,以及学习率 (learning_rate) 和树复杂度参数 (max_depth, min_samples_split 等)。这些参数之间的关系很重要;例如,较低的抽样率可能需要更多的提升迭代 (n_estimators) 或对学习率进行调整。