什么是提升
我们将使用称为 *Boosting* 的算法结束树章节。除了随机森林,*Boosting* 是另一种增强经典决策和回归树模型预测能力的强大方法。Boosting 算法本身严格来说既不能学习也不能预测任何东西,因为它是建立在其他(弱)算法之上的。Boosting 算法被称为“元算法”。Boosting 方法(以及 bootstrapping 方法)原则上可以应用于任何分类或回归算法,但结果证明树模型特别适合。事实证明,提升树的准确性与随机森林相当,甚至常常优于后者(参见例如 Caruana 和 Niculescu-Mizil (2008)(*监督学习算法的实证比较*))。哈斯蒂等人。(2009) 将提升决策树称为“世界上最好的现成分类器”(Hastie 等人,2006 p.340)。Boosting 背后的奥秘在原则上与随机森林模型相同 * - 一组比随机猜测稍好一些的弱学习器可以组合起来做出比一个强学习器更好的预测 - *。但是,这些弱学习器的创建过程是不同的。Boosting 背后的奥秘在原则上与随机森林模型相同 * - 一组比随机猜测稍好一些的弱学习器可以组合起来做出比一个强学习器更好的预测 - *。但是,这些弱学习器的创建过程是不同的。Boosting 背后的奥秘在原则上与随机森林模型相同 * - 一组比随机猜测稍好一些的弱学习器可以组合起来做出比一个强学习器更好的预测 - *。但是,这些弱学习器的创建过程是不同的。
回顾一下,在创建我们的随机森林模型期间,我们使用了 Bagging 的概念。在 Bagging 期间,我们种植了许多 *M* 棵树,其中每棵树都建立在原始数据集的随机样本(允许重新采样)上,其中随机样本的长度与原始数据集的长度相同,但仅包含总数的一个随机抽取的子集特征空间。在我们创建了这些模型之后,我们让他们以多数票来做出我们的最终决定。精髓是每个树模型的创建都独立于其他树模型的结果。也就是说,树模型的“形状”仅受基础数据的“形状”影响,而基础数据的“形状”仅受偶然性(*采样和重采样*)的影响。n吨H* 树依赖于先前创建的返回结果 (n吨H-1) 树模型。
因此,与我们并行创建树模型集合的随机森林方法不同,我们现在按顺序创建集合,其中实际树的设置受到所有先前树模型的输出的影响,通过改变权重的数据集,树模型是建立在。关键是,通过实现这些权重,我们引入了某种学习,其中 *n吨H* 提升模型中的树部分取决于预测 *n吨H-1* 模型已作出。因此,我们在引导过程中或多或少地用“引导”创建替换了单个数据集的“随机引导”创建。最著名的提升算法称为 *AdaBoost*(自适应提升),由 Freund 和 Schapire (1996) 开发。以下讨论基于 AdaBoost Boosting 算法。下图提供了对 boosting 算法的直观了解。
这里不同的基分类器每个都建立在加权数据集上,其中数据集中单个实例的权重取决于先前基分类器为这些实例所做的结果。如果他们对实例进行了错误分类,则该实例的权重将在下一个模型中增加,而如果分类正确,则权重保持不变。最终决策是通过基本分类器的加权投票来实现的,其中权重取决于模型的错误分类率。如果一个模型的分类准确率很高,它就会得到很高的权重,而如果分类准确率很差,它就会得到低权重。
提升伪代码
将所有权重初始化为 瓦=1n 在哪里 n 是数据集中的实例数
- 尽管 吨 < 吨 (吨==要培养的模型数量)做:
- 创建模型并得到假设 H吨(Xn) 对于所有数据点 Xn 在数据集中
- 计算误差 ε 对所有数据点求和的训练集 Xn 在训练集中:
ε吨 = ∑n=1N瓦n(吨)*一世(是n≠H吨(Xn))∑n=1N瓦n(吨)
在哪里 一世(C○nd) 返回 1 如果 一世(C○nd) == 真,否则为 0
- 计算 α 和:
α吨 = 日志(1-ε吨ε吨)
- 更新权重 N 接下来的训练实例(吨+1) 模型:
瓦n(吨+1) = 瓦n(吨)*电子Xp(α吨*一世(是n≠H吨(Xn)))
- 之后 吨 迭代,计算最终输出:
F(X) = 秒一世Gn(∑吨吨α吨*H吨(X))
使用 Python 从头开始提升
在之前关于分类树、回归树 和随机森林模型的章节中,我们一直拖着整个“从头开始的树代码”。我想我们现在已经理解了如何在 Python 中从头开始构建树模型(用于回归或分类)的概念,如果没有,只需转到前面的一章并使用代码!由于 Boosting 概念的威力和神秘性更多地在于弱学习器的组合,因为在创建这些弱学习器时,我们将使用sklearn 的 DecisionTreeClassifier 来创建单个弱学习器,但将从头开始编写实际的 boosting 过程。
为了使 sklearn DecisionTreeClassifier 成为*弱*分类器,我们将设置 *max_depth* 参数 == 1 以创建称为 *decision Stump* 的东西,它在原则上(如上所述)没有别的东西作为只有一层的决策树,即也就是说,根节点直接以叶节点结束,因此数据集只分裂一次。与往常一样,我们将使用香农熵作为分割标准。
正如您可能看到的,即使我们在这里不使用我们的自编码决策树算法,我们在实际的树构建算法中唯一必须改变的是我们引入了一个最大深度参数,该参数在第一次分裂后停止生长树 -代码中的这种细微变化实际上不值得拖到这里 - 作为数据集,我们使用UCI 蘑菇数据集, 就像我们在之前的随机森林章节中所做的那样。
让我们首先创建一个决策树桩并测量该决策树桩的准确性,以了解该模型的预测“好”或更“坏”。
"""
创建一个决策树桩
"""
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib import style
style 。使用( 'fivethirtyeight' )
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import cross_validate
import scipy.stats