Python 中的提升算法

本文介绍了提升算法,特别是AdaBoost,这是一种强大的机器学习方法,用于增强决策树和回归树的预测能力。AdaBoost是一种元算法,通过组合多个弱学习器(如决策树桩)来创建一个强学习器。文章详细解释了提升算法的工作原理,包括权重调整和错误率影响,展示了从头开始用Python实现AdaBoost的过程,并与sklearn库的AdaBoostClassifier进行了比较。
摘要由CSDN通过智能技术生成

什么是提升

我们将使用称为 *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 算法的直观了解。

说明了boosing算法。 不同的基本算法均建立在加权数据集上,其中数据集中单个实例的权重取决于先前基本分类器为这些实例所做的结果。 如果他们对实例进行了错误分类,则该实例的权重将在下一个模型中增加,而如果分类正确,则权重不变。 最终决策是通过基本分类器的加权投票实现的,其中权重取决于模型的错误分类率。 如果一个模型的分类准确率很高,它会得到很高的权重,而如果分类准确率很差,它就会得到低权重。

这里不同的基分类器每个都建立在加权数据集上,其中数据集中单个实例的权重取决于先前基分类器为这些实例所做的结果。如果他们对实例进行了错误分类,则该实例的权重将在下一个模型中增加,而如果分类正确,则权重保持不变。最终决策是通过基本分类器的加权投票来实现的,其中权重取决于模型的错误分类率。如果一个模型的分类准确率很高,它就会得到很高的权重,而如果分类准确率很差,它就会得到低权重。

提升伪代码

将所有权重初始化为 瓦=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  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值