“完全开发的决策树”和“浅层决策树”有什么区别?

数据挖掘 scikit-学习 决策树 集成建模
2021-09-21 10:25:46

在阅读scikit-learn 文档上的Ensemble 方法时,它说

bagging 方法最适用于强大和复杂的模型(例如,完全开发的决策树),而 boosting 方法通常最适用于弱模型(例如,浅层决策树)。

但是在谷歌上搜索它总是返回有关Decision Tree.

  1. 我想知道文档中提到的两棵树的详细信息,它们的fully developed含义shallow是什么。

更新:

  1. 关于为什么bagging最适合使用fully developed以及为什么boosting最适合使用shallow.

    首先,我认为complex models (e.g., fully developed decision trees)意味着这样的数据集具有复杂的格式,称为fully developed decision trees.

    在我阅读了 20 多次以上引用和 rapaio 的回答后,我认为我糟糕的英语导致我走错了路(误解)。我也误shallow认为shadow,这让我困惑了很长时间......现在我明白了fully developed和的含义shallow

    我认为这句话是说bagging最适合算法复杂的模型(已经训练过)。并且boosting只需要简单的模型。两者都bagging需要boostingmany estimators,如n_estimators=100scikit-learn 示例中所示。

    如果n_estimators=100

    • bagging需要 100 个fully developed decision trees估算器(模型)
    • boosting需要 100 个shallow decision trees估算器(模型)

    我的想法对吗?希望我的更新可以帮助非母语人士。

  2. e.g.意味着例如,因此还有其他模型可以用于 bagging 和 boosting。如何将模型更改为svm或其他?或者他们都需要一个树基模型?

1个回答

[稍后编辑-改写所有内容]

树的种类

是一棵小树(大多数情况下它的深度很小)。一棵成熟的树是一棵大树(大多数情况下它的深度很大)。

假设您有一组看起来像非线性结构的训练数据。

具有 2 个回归树的合成样本。 红线代表深度为 3 的树,蓝线代表深度为 10 的树

偏差方差分解作为一种查看学习误差的方法

考虑到偏差方差分解,我们知道学习误差有 3 个组成部分:

Err=Bias2+Var+ϵ

偏差是拟合模型在无法表示真实函数时产生的误差;它通常与欠拟合有关。

Var是拟合模型由于采样数据而产生的误差,它描述了如果训练数据发生变化,模型的不稳定程度;它通常与过度拟合有关。

ϵ是包围真实函数的不可约误差;这是学不来的

模型复杂度

考虑到我们的浅树,我们可以说模型具有低方差,因为改变样本不会对模型造成太大的改变。它需要太多更改的数据点才能被认为是不稳定的。同时我们可以说它有很大的偏差,因为它真的不能代表真正模型的正弦函数。我们也可以说它的复杂度很低。它可以用 3 个常数和 3 个区域来描述。

因此,完全成长的树具有低偏差。它非常复杂,因为它只能使用许多区域和这些区域上的许多常数来描述。这就是它具有低偏差的原因。模型的复杂性也会影响高方差。至少在某些区域,以不同方式采样的单个点可以改变拟合树的形状。

作为一般经验法则,当模型具有低偏差时,它也具有高方差,而当它具有低方差时,它具有高偏差。这并非总是如此,但它经常发生。直觉上是一个正确的想法。原因是,当您靠近样本中的点时,您会学习模式,但也会从样本中学习错误,当您远离样本时,您反而非常稳定,因为您没有合并样本中的错误。

我们如何使用这些树来构建合奏?

装袋

bagging 背后的统计模型基于 bootstrapping,这是一种用于评估统计数据误差的统计程序。假设您有一个样本并且您想要评估统计估计的误差,自举过程允许您近似估计量的分布。但是树只是样本“将空间分割成区域并用平均值预测,一个统计量”的简单函数。因此,如果从 bootstrap 样本构建多棵树并对其进行平均,则可以将这些树视为 iid,并且相同的原理可以减少方差。因为 bagging 允许在不影响太多偏差的情况下减少方差。为什么需要全深度树?嗯,这是一个简单的原因,乍一看可能并不那么明显。它需要具有高方差的分类器来减少它。此过程不影响偏差。如果基础模型具有低方差高偏差,则套袋将略微减少已经很小的方差并且不会产生任何偏差。

提升

如何提升?许多人将提升与模型平均进行比较,但这种比较是有缺陷的。提升的想法是集成是一个迭代过程。确实,分类的最终规则看起来像是一些弱模型的加权平均值,但关键是这些模型是迭代构建的。与 bagging 及其工作方式无关。任何k 树是使用从所有先前学习的信息构建的 k1树木。所以我们最初有一个适合数据的弱分类器,其中所有点都具有相同的重要性。这种重要性可以通过 adaboost 中的权重或梯度提升中的残差来改变,这并不重要。下一个弱分类器不会以相同的方式处理所有点,但那些先前分类正确的重要性小于那些分类错误的重要性。结果是模型丰富了它的复杂性,它能够重现更复杂的表面。这是因为它减少了偏差,因为它可以更接近数据。背后也有类似的直觉:如果分类器的偏差已经很低,那么当我提升它时会发生什么?可能是一个难以忍受的过度拟合,仅此而已。

哪一个更好?

没有明确的赢家。它过于依赖数据集和其他参数。例如装袋不会受伤。可能没用 ut 通常不会影响性能。Boosting 会导致过拟合。那是因为您最终可能会离数据太近。

很多文献都说,当不可约误差很高时,bagging 会好很多,boosting 不会进步太多。

我们可以减少方差和偏差吗?

纯粹的 bootstrap 和 bagging 方法只有一个目的。要么减少方差要么减少偏差。然而,现代实现改变了这些方法的工作方式。采样可用于提升,它似乎也有助于减少方差。有一些装袋程序需要一些想法,例如 Breiman 发布的迭代装袋(或自适应装袋)。所以,答案是肯定的,是可能的。

我们可以使用除树之外的其他学习器吗?

当然。通常你会看到使用这种方法的提升。我也阅读了一些关于 bagging svm 或其他学习者的论文。我尝试自己打包一些 svm,但没有取得多大成功。树是首选方式,但是,出于一个非常简单的原因,它们易于构建、易于适应且易于控制其效果。我个人的观点是,并不是所有关于树木集合的说法。

PS:关于弱分类器数量的最后说明:这完全取决于数据集的复杂性和学习器的复杂性。没有食谱。通常,其中 20 个就足以获取大部分信息,而额外的仅用于微调。