有人能准确地告诉我 LightGBM 或 XGBoost 实现的增强在真实场景中是如何工作的吗?就像我知道的那样,它是明智地分割树叶而不是水平,这将有助于全局平均,而不仅仅是分支的丢失,这将有助于它比水平明智的树更快地学习更低的错误率。
但是在我看到一些真实的例子之前我无法完全理解,我试图看很多文章和视频,但到处都是理论上的。如果有人可以分享一些小的工作示例或任何真正有用的文章。
非常感谢。
有人能准确地告诉我 LightGBM 或 XGBoost 实现的增强在真实场景中是如何工作的吗?就像我知道的那样,它是明智地分割树叶而不是水平,这将有助于全局平均,而不仅仅是分支的丢失,这将有助于它比水平明智的树更快地学习更低的错误率。
但是在我看到一些真实的例子之前我无法完全理解,我试图看很多文章和视频,但到处都是理论上的。如果有人可以分享一些小的工作示例或任何真正有用的文章。
非常感谢。
我认为您实际上要问的是“提升是如何工作的”。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/