提升示例

数据挖掘 机器学习 xgboost 助推 lightgbm 梯度提升决策树
2022-02-17 10:15:32

有人能准确地告诉我 LightGBM 或 XGBoost 实现的增强在真实场景中是如何工作的吗?就像我知道的那样,它是明智地分割树叶而不是水平,这将有助于全局平均,而不仅仅是分支的丢失,这将有助于它比水平明智的树更快地学习更低的错误率。

但是在我看到一些真实的例子之前我无法完全理解,我试图看很多文章和视频,但到处都是理论上的。如果有人可以分享一些小的工作示例或任何真正有用的文章。

非常感谢。

3个回答

我认为您实际上要问的是“提升是如何工作的”。LightGBM 或 XGBoost 是增强算法的实现。

我喜欢 Bühlmann 和 Hothorn 的文章。它们很好地概述了增强选项。

P. Bühlmann, T. Hothorn (2007),“提升算法:正则化、预测和模型拟合”,统计科学 22(4),p。477-505。

本质上,您尝试在进行提升时重复“解释”残差。当你这样做时,你会一点一点地接近一个解决方案,即使每次解释残差的尝试都是“弱”的。

您可能还会有这样的好处,即通过反复尝试解释残差,提升可能会发现数据中有趣的方面(您尝试学习缓慢)。这适用于基于树的模型和一些随机元素(“随机”梯度提升),例如通过省略一些解释变量或训练集中的部分行。

在这里,您也与随机森林有某种相似之处,其中“装袋”和随机化是关键。在基于树的提升中,生长“浅层”决策树(通常“只有”四到八次左右)以重复解释残差并实现对某些数据的良好拟合。

我在 R 中从上面链接的论文(来自第 3.3 节第 483 页,Bühlman/Horthon)中实现了“线性”提升,您可以在此处找到代码

主要步骤是(重复):

  • 从当前估计器中获取残差
  • 拟合残差并预测
  • 更新损失

您可以尝试用浅树替换下面代码中“拟合”部分中的线性模型,看看会发生什么。


# Boosting (p. 483, Sec. 3.3, L2-Boosting)

for (n in seq(1:maxiter)){
  
  # I) Get residual
  if(n==1){f=f0} # initialize in first step  
  u=y-f          # get residual from estimation 
  
  # II) Fit residual / predict, I use ridge (alpha=0)
  reg = glmnet(x,u,alpha=0, lambda=2)       
  g = predict(reg, newx=x, type="link") 
  
  # III) Update f
  f=f+nu*g
  # Print feedback
  cat(paste0("Step: ", n," SSR: ", sum(u^2), "\n" ))
  
  # Save SSR/iter to list
  ssrlist[[n]] <- sum(u^2)
  bstep[[n]] <- n
  # Early stopping rule
  if(sum(u^2)<es){break}
}

请参阅此链接,以通过已制定的示例了解提升。

https://xgboost.readthedocs.io/en/latest/tutorials/model.html

Light GBM 之前的决策树算法(无论是像 Random Forest 这样的 Bagging 还是像 LightGBM 这样的 Boosting)遵循级别明智的树生长。在级别明智的树增长中,当您找到要拆分的最佳节点时,您会增加树的级别。有时,第二次拆分可能不会导致最佳结果和不必要的树生长以保持对称树。请参考下图: 在此处输入图像描述

在 LightGBM 中,逐叶树的生长会找到最大程度地减少损失的叶子,并且只分裂该叶子而不打扰同一级别的其余叶子。这导致了一个不对称的树,随后的分裂很可能只发生在树的一侧。

与逐层增长策略相比,逐叶树增长策略倾向于实现更低的损失,但它也倾向于过度拟合,尤其是小数据集。如此小的数据集,水平增长就像一个正则化来限制树的复杂性,而叶增长往往是贪婪的。 在此处输入图像描述

来源:https ://deep-and-shallow.com/2020/02/21/the-gradient-boosters-iii-lightgbm/