正则化是一种弱小的技术,经过防止过拟合来提高模型性能。本文将探求各种XGBoost中的正则化方法及其长处。
为什么正则化在XGBoost中很关键?
XGBoost是一种以其在各种机器学习义务中的效率和性能而知名的弱小算法。像任何其余复杂模型一样,它或许会过拟合,特意是在解决噪声数据或过多特色时。XGBoost中的正则化有助于经过以下形式缓解这一疑问:
上方咱们引见在XGBoost中成功正则化的方法
增加预计器的数量可以防止模型变得过于复杂。两个关键超超参数包括:
设置较低的树的数量可以协助防止模型学习训练数据中的噪声。n_estimators的高值会造成过拟合,而低值或许造成欠拟合。
这种技术在验证集上的性能中止改善时中止训练环节,防止过拟合。
上图为没有早停的模型目的
上方的模型中,即使损失不再降低,训练也会继续。相比之下,经常使用early_stopping_rounds=10,当延续10轮损失没有改善时,训练就会中止。
# 初始化带有早停的XGBoost回归器 model = xgb.XGBRegressor(n_estimators=1000, learning_rate=0.1, max_depth=5)# 经常使用早停训练模型 model.fit(X_train, y_train,eval_set=[(X_test, y_test)],early_stopping_rounds=10,verbose=True)
简化每棵树的结构也可以协助正则化模型。关键参数包括:
在叶节点上进后退一步分区所需的最小损失增加。较高的值会造成更激进的模型。
上方是XGBoost的目的函数。假设参与gamma,叶节点的数量(T)就会增加。gamma处罚T并协助防止树变得过于复杂。
Gamma是一个后剪枝参数。以下复杂公式示意在每次决裂时计算的增益。第一、第二和第三项区分是左子节点、右子节点和父节点的相似度分数。Gamma(最后一项)是增益的阈值。
在上方的例子中,每个节点内的值代表不蕴含gamma项的增益。当gamma设置为时,最底部的分支被删除,由于它不满足阈值规范,这样树就变得更便捷了。
那么疑问来了:gamma的最佳值是多少?答案在于超参数调优。
# 失掉树的详细转储,包括统计消息 tree_dump = model.get_booster().get_dump(dump_format='text', with_stats=True)# 打印树的转储以检查详细消息,包括每个节点的增益 for tree in tree_dump:print(tree)
上方的代码将显示一切决策树的转储。经过观察一切节点的增益,咱们可以尝试不同的gamma值。
import xgboost as xgb # Gamma的成功 model = xgb.XGBRegressor(n_estimators=3, random_state=42, gamma = 25000)
然而有一点,gamma值过高会造成欠拟合,由于它增加了树的深度,而gamma值过低会造成过拟合。
限度树的最大深度。较低的值可以防止模型学习过于详细的形式。这是一个预剪枝参数。
思索题1:当咱们有gamma时,为什么还要求max_depth?(答案在最后)
要解释这个参数就要先了解什么是cover。
当咱们启动树转储时,咱们会看到一切节点的cover值。Cover是hessians的总和,而hessian是损失函数相关于预测值的二阶导数。
咱们以一个便捷的损失为例,关于均方损失函数的回归疑问,hessian的值为1。所以在这种状况下,cover基本上是每个节点中的数据点数量。因 此min_child_weight是每个节点中应该存在的最小数据点数量。它对每个节点设置以下条件:cover > min_child_weight。
xgboost中回归疑问的min_
import xgboost as xgb# min_child_weight的例子 model = xgb.XGBRegressor(n_estimators=100, learning_rate=0.1, max_depth=5, min_child_weight=10, gamma=1, random_state=42)
关于分类疑问,了解这一点有点辣手,然而便捷来说分类中min_child_weight的一句话形容是:它为数据点的关键性设置了一个阈值。
所以咱们只需记住min_child_weight是一个预剪枝参数。参与min_child_weight会增加过拟合。
采样触及在数据的子集上训练模型,这可以经过引入随机性来增加过拟合。
用于训练每棵树的训练数据的百分比。较低的值可以防止过拟合。子采样使每个决策树成为数据子集的专家,遵照"群众的智慧"准则。依据数据的不同,0.5到0.8的范围通常会给出良好的结果。
于训练每棵树的特色的百分比。这也可以用来引入随机性并防止过拟合。colsample有以下三种类型,它们的值范围从0到1。这些按引入随机性的参与顺序 陈列如下。假定咱们的数据中有10个特色,一切这些超参数的值都设置为0.5:
import xgboost as xgb# subsample和colsample的例子 model = xgb.XGBRegressor(n_estimators=100, subsample=0.8,max_depth=5, colsample_bytree=0.5,colsample_bylevel=0.5, colsample_bynode=0.5)
收缩增加了每棵独自树的影响,使模型愈加持重:
增加每棵树的影响。较低的值象征着模型构建更多的树,但不太或许过拟合。0.3是许多模型的适合学习率。
L2(岭)和L1(Lasso)正则化项,处罚大系数。
当增益小于gamma时,该节点就会被剪枝。当lambda参与时,过拟合增加,欠拟合参与。Lambda与gamma一同用于正则化。
思索题2:当咱们有gamma时,为什么还要求lambda?
import xgboost as xgb # reg_lambda是lambda的超参数,reg_alpha是alpha的超参数 model = xgb.XGBRegressor(n_estimators=3, learning_rate=0.3, reg_lambda=100, reg_alpha=100, gamma=10000)
1、XGBoost中即使有了gamma参数,咱们依然要求max_depth参数。
在XGBoost中,gamma和max_depth只管都用于控制树的成长,但它们的上班形式和目的略有不同:
1.不同的控制粒度:
2.计算效率:
3.模型可解释性:
4.解决不同类型的数据:
5.互补作用:
总之,gamma和max_depth在控制树的成长方面起着互补的作用。gamma关注决裂的品质,而max_depth确保树不会变得过于复杂。同时经常使用这两个参数,可以更好地平衡模型的性能、复杂度和可解释性。
2、为什么在XGBoost中即使有了gamma参数,咱们依然要求lambda参数。
在XGBoost中,gamma和lambda只管都用于正则化,但它们的上班形式和目的是不同的:
gamma和lambda在XGBoost中起着互补的作用。gamma关键控制树的结构,而lambda关键控制叶子节点的权重和树的输入。同时经常使用这两个参数,可以更片面、更灵敏地控制模型的复杂度,从而在不同层面上防止过拟合,提高模型的泛化才干。这种多层面的正则化战略是XGBoost弱小性能的关键起因之一。