尽管像 max_depth 和 min_child_weight 这样的参数用于控制单棵树的复杂度,但另一种有效的正则化方法是在树的构建过程中引入随机性。这种被称为随机梯度提升的技术,让每个新的学习器在数据的不同子样本上进行训练。这样做可以降低模型的方差及其过拟合的趋势,这与随机森林等算法中的装袋法(bagging)运作方式很相似。这种随机性主要通过两种方式注入:通过对训练实例(行)进行抽样,以及通过对特征(列)进行抽样。行抽样以提高模型泛化能力行抽样是指在总训练数据的一个子集上训练每棵树。这由 Scikit-Learn 和 XGBoost 中的 subsample 超参数,或 LightGBM 中的 bagging_fraction 参数控制。在每次提升迭代开始时,会不放回地选择训练数据的一个随机子集。序列中的下一棵树仅针对这个子集来修正错误。这可以防止任何单棵树受到特定训练实例(例如异常值)的过度影响,这些实例可能主导梯度计算。subsample 的典型值在 0.5 到 0.8 之间。值为 1.0 意味着所有训练数据都用于每棵树,这相当于没有这种形式正则化的标准梯度提升。值为 0.7 意味着每棵树在随机选择的 70% 训练数据上进行训练。减小 subsample 值会增加随机性,并能提供更强的正则化效果。然而,将其设置得过低可能导致欠拟合,因为每棵树都是基于过少的信息构建的。这还可能增加训练时间,因为模型可能需要更多的树 (n_estimators) 才能收敛。列抽样以使特征多样化除了行抽样,我们还可以在构建每棵树时对列(特征)进行抽样。这项技术对于具有许多特征的数据集特别有效,因为其中一些特征可能高度相关。它促使模型考虑更广泛的特征,而不是反复依赖少数几个主导特征。对此最常用的超参数是 colsample_bytree。该参数指定在构建每棵树时随机抽样列的比例。例如,如果在拥有 100 个特征的数据集中将 colsample_bytree 设置为 0.8,那么每棵新树都将使用随机选择的 80 个特征子集进行构建。其他相关参数提供更细致的控制:colsample_bylevel:控制树的每个级别抽样的列的比例。colsample_by_node:控制树内每个分裂抽样的列的比例。使用 colsample_bytree 促使模型构建一组更多样化的弱学习器,这能提高最终集成模型的整体稳健性。下图说明了行抽样和列抽样如何一起运作。对于每棵新树,都会使用行和列的不同的子集进行训练。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Helvetica"]; data [label="完整训练数据\n(N 个样本, P 个特征)", fillcolor="#e9ecef"]; subgraph cluster_0 { label = "第 m 次迭代"; style="dashed"; bgcolor="#f8f9fa"; tree_m [label="用于第 m 棵树的数据\n(subsample * N 个样本,\ncolsample_bytree * P 个特征)", fillcolor="#a5d8ff"]; } subgraph cluster_1 { label = "第 m+1 次迭代"; style="dashed"; bgcolor="#f8f9fa"; tree_m1 [label="用于第 m+1 棵树的数据\n(不同的 subsample * N 个样本,\n不同的 colsample_bytree * P 个特征)", fillcolor="#b2f2bb"]; } data -> tree_m [label="抽样"]; data -> tree_m1 [label="抽样"]; }提升序列中的每棵树都在原始数据行和列的独有随机抽样子集上进行训练。实际操作实际上,行抽样和列抽样会一起使用。将 subsample 和 colsample_bytree 都设置为小于 1.0 的值是正则化 XGBoost、LightGBM 及其他梯度提升模型的标准做法。以下是初始化 XGBoost 模型时设置这些参数的方式:import xgboost as xgb # 使用抽样初始化 XGBoost 回归器 xgb_model = xgb.XGBRegressor( n_estimators=500, learning_rate=0.05, max_depth=4, subsample=0.8, # 使用 80% 的数据训练每棵树 colsample_bytree=0.8, # 使用 80% 的特征训练每棵树 random_state=42 ) # 接下来你会用你的数据拟合这个模型 # xgb_model.fit(X_train, y_train)这些参数的最优值取决于数据集。一个常见做法是,从 0.7 到 0.9 之间的值开始,然后使用网格搜索或随机搜索等搜索技术(我们将在后面介绍),以找到在验证集上产生最佳性能的组合。通过引入这种结构化的随机性,您可以构建功能强大且对未见过的数据具有良好泛化能力的模型。