提升算法详细说明

塔瓦什·阿格瓦尔

在上一篇文章中 随机森林详细解释 我们讨论了使用“装袋”技术创建决策树集合的随机森林。在本文中,我们将讨论Boosting技术,并研究一些流行的算法,例如:

  • 自适应升压或AdaBoost
  • 梯度提升

它使用增强技术来创建整体。

助推简介

Boosting的基本思想是将很多弱学习者组合成一个强学习者,其中弱学习者所指的模型要比随机预测的模型要好一些。

简而言之,它是指一种技术,其中我们以顺序的方式训练一堆个体模型,并且每个个体模型都从先前模型所犯的错误中学习。

Boosting算法的基本思想是:

  1. 创建一个仅在不太频繁的数据点上产生高错误,而在更频繁的数据点上产生低错误的集合。
  2. 针对专门由集合中其他模型错误预测的数据点构建一系列模型(使用弱学习算法)。这样一来,模型系列会不断减少平均误差,因此我们将拥有一个具有极高准确性的合奏。

提升是通过弱学习算法生成强模型/学习者的一种方法。

注意: SVM,回归和其他技术是用于创建模型的算法。

Boosting算法可用于分类模型和回归模型。

弱学习算法

弱学习算法将产生一个比随机猜测略胜一筹的模型。任何具有例如60-70%正确几率的模型都被认为是由弱学习算法生成的模型。

考虑一个假设的示例,其中我正在使用决策树算法来生成模型。假设深度为6,我期望其精度为80%或更高。

但是由于计算限制,我只能训练深度为2的树,并且能够达到70%的精度。我仅将树规范化为深度2以控制计算资源。我生产的模型只获得了70%的准确性。

在这种情况下,由于将深度正则化为2,所以我的算法的行为就像一个弱学习算法,比随机猜测要好,但尚未准备好在生产中使用。

在这里,我们的目标是使用弱学习算法并生成可用于生产的模型。让我们看看一种称为AdaBoost算法的增强算法。

AdaBoost算法

AdaBoost代表自适应增强。在这里,我们以这样的方式生成模型的集合:模型\(M_1 \)正确预测了很少的数据点,模型\(M_2 \)正确预测了几个数据点,依此类推。让我们了解分类设置中的AdaBoost算法。

在给定训练集T和分布D的情况下,算法A生成模型M.

$$ A(T,D)= M $$

最初,所有数据点的分布都是统一的。即所有数据点的概率相同。但是随着我们的前进,模型\(M_1 \)错误预测的数据点的概率将在分布中上移。

用数学术语来说,AdaBoost算法提高了错误分类的点的概率,并抑制了正确分类的点的概率。

注意: 这样做的目的是确保模型更加注意未正确分类的数据点。

对于每个新模型,数据点的分布都会发生变化(即分配给每个数据点的权重)。并且定义了需要最小化的目标函数。

$$ \ text {目标函数} = ^ {min} _hE_D [L(h(x_i),y_i)] = ^ {min} _h \ sum ^ n_ {i = 1} p_D(x_i).L(h(x_i ),y_i)$$

其中\(p_D(x_i)\)表示当前迭代的分布。在目标函数中,我们确保具有高概率分布的数据点的损失较低。

现在我们已经定义了一个目标函数,我们需要回答两个问题:

  • 确定如何更改分布函数以生成整体中的下一个模型。
  • 计算赋予每个模型的权重以获得最终合奏

为下一次迭代创建一个新的发行版

我们知道,在下一次迭代中需要提高未正确预测的点。因此,我们将迭代的新分布概率定义为:

$$ p_ {d(t + 1)}(x_i)= {p_ {d(t + 1)}(x_i).e ^ {-\ alpha _t y_i h_t(x_i)} \ over z_t} $$

哪里,

$$ z_t = \ sum ^ n_ {i = 1} p_ {d(t)}(x_i).e ^ {-\ alpha _t y_i h_t(x_i)} $$

\(\ alpha \)始终为正数,该值控制集合中模型的权重。

请注意,这里我们选择\(e ^ {-x} \)在下一次迭代中查找分布。这样做的原因是当我们拥有:

  1. 对于来自模型的错误预测,我们需要在下一个模型中重视该数据点。 \\(y_i h_t(x_i)\)将为负数,\(e ^ {-\ alpha _t y_i h_t(x_i)} \)将产生巨大的正值。因此,增加了下一个模型中数据点的重要性。
  2. 为了从模型中获得正确的预测,我们无需考虑下一个模型中的数据点。 \\(y_i h_t(x_i)\)将为正数,\(e ^ {-\ alpha _t y_i h_t(x_i)} \)将得到接近零的值。因此,下一个模型将不考虑数据点。

注意: 将第一分布的概率定义为1 / n,其中n是数据点的数量。

到现在为止还挺好。现在,我们知道如何创建单个发行版,但是如何将它们组合起来以创建最终集合呢?

赋予每个模型权重以获得最终合奏

为了创建最终合奏,我们基于权重将模型连接起来。权重\(\ alpha_t \)表示为:

$$ \ alpha_t = {1 \ over 2} ln({1- \ epsilon_t \ over \ epsilon_t})$$

哪里,

$$ \ epsilon_t = \ sum_ {i:h_ {t(x_i \ ne h_i)}} p_ {D(t)}(x_i)$$

表示算法\(h_t \)在分类中出错的概率。

\(\ alpha_t \)表达式的选择是为了确保我们的单个模型优于随机猜测(概率超过50%),如\(ln({1- \ epsilon_t \ over \ epsilon_t})\ )将始终大于1。

    AdaBoost倾向于提高错误分类点的概率,异常值被错误分类的可能性很高,它将不断增加与异常值相关的概率。因此,建议删除异常值。

    下面的示例演示了AdaBoost算法的python实现。

    # Importing packages
    from sklearn.ensemble import AdaBoostClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import load_iris
    
    # Loading dataset
    data = load_iris()
    
    X = data.data
    y = data.target
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
    
    # Training model
    adaClassifier = AdaBoostClassifier(n_estimators = 100, random_state = 0)
    adaClassifier.fit(X_train, y_train)
    
    adaClassifier.predict(X_test)
    
    adaClassifier.score(X_test, y_test)

    梯度提升

    如前所述,Boosting模型的关键是从以前的错误中学习。让我们了解回归设置中的“梯度增强”。

    假设我们有n个数据点,我们正在寻找函数\(F(x_i)\),该函数产生的输出几乎等于\(y_i \)。但是在实际情况下,预测输出\(y_ {pi} \)与实际输出\(y_i \)之间会有差异。这种差异称为残差\(y_i-y_ {pi} \)。

    现在在Gradient Boosting中,我们在数据点上训练另一个模型\(M_1 \),目标变量为\(y_i-y_ {i} ^ 0 \)或\(y_i-F_0(x_i)\)。

    而且我们会继续训练高达\(F_t \)模型的模型。 \(F_t \)模型的目标变量表示为:

    $$ y-[F_0 + F_1 + F_2 + F_3 +。 。 。 。 。 。 。 。 。 。 。 + F_ {t-2} + F_ {t-1}] $$

    梯度提升在每次迭代中包括两个步骤:

    1. 找到残差并在残差上拟合新模型:要找到我们需要对模型进行的更改,我们找到损失函数的梯度下降。
    2. 将新模型添加到旧模型,然后继续下一个迭代

    注意: 根据问题,我们可以在此处使用任何损失函数。要记住的唯一一点是损失函数应该是可微的。我们可以使用的损失函数很少:

    • 二次成本
    • 交叉熵成本
    • 指数成本
    • 赫林格距离
    • Kullback–Leibler分歧
    • 广义Kullback–Leibler散度
    • Itakura–Saito距离

    用简单的话说,在每次迭代中,我们添加一个增量模型,该模型适合在当前目标值下评估的损失函数的负梯度。该增量模型可以是线性回归模型,决策树或任何其他模型。当我们看到梯度非常接近零时,我们将停止迭代。

    下面的示例演示了Gradient Boosting算法的python实现。

    # Importing packages
    from sklearn.ensemble import GradientBoostingRegressor
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import load_boston
    from sklearn.metrics import r2_score
    
    # Loading dataset
    data = load_boston()
    
    X = data.data
    y = data.target
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
    
    # Training model
    gradientRegressor = GradientBoostingRegressor(n_estimators = 100, random_state = 0)
    gradientRegressor.fit(X_train, y_train)
    
    r2_score(y_test, gradientRegressor.predict(X_test))

      概要

      在这篇文章中,我们了解了AdaBoost和Gradient Boosting算法。让我们总结一下每个陈述的算法中涉及的步骤。

      我们为AdaBoost算法采取的步骤总结如下:

      1. 将分布的概率初始化为1 / n,其中n是数据点的数量
      2. 对于t = 0到T,重复以下操作(T是迭代或模型的总数)
        • 使用相应的概率在训练数据上拟合算法\(h_t \)
        • 计算\(\ epsilon_t = \ sum_ {i:h_ {t(x_i \ ne h_i)}} p_ {D(t)}(x_i)\)
        • 计算\(\ alpha_t = {1 \ over 2} ln({1- \ epsilon_t \ over \ epsilon_t})\)
        • 更新\(p_ {d(t + 1)}(x_i)= {p_ {d(t + 1)}(x_i).e ^ {-\ alpha _t y_i h_t(x_i)} \ over z_t} \)其中,\(z_t = \ sum ^ n_ {i = 1} p_ {d(t)}(x_i).e ^ {-\ alpha _t y_i h_t(x_i)} \) 
      3. 最终模型:\(H = \ sum_ {t = 1} ^ T \ alpha_t h_t \) 

        我们对梯度增强算法采取的步骤的总结:

        1. 初始化粗略的初始函数\\(F_0 \)
        2. 对于t = 0到T-1(其中T是迭代次数或模型数)
          • 计算损失函数\(L(y_i,F_t(x_i))\)
          • 计算所有数据点的新目标值,负梯度\(-\ frac {\ partial L(y,F_t)} {\ partial F_t} \)
          • 在这些新的目标值上拟合模型\(H_ {t + 1} \)
          • 计算下一个函数\(F_ {t + 1} = F_t + \ lambda_t h_ {t + 1} \),其中\(\ lambda \)表示学习率。
        3. 最终模型是\\(F_T \)

          除了XGBoost,CatBoost和LightGBM之外,我们几乎没有其他增强算法,我们将在后续文章中介绍它们。

          作者信息

          塔瓦什·阿格瓦尔

          网站: http://tavishaggarwal.com

          塔瓦什·阿格瓦尔是一名数据科学家 在海得拉巴工作,在解决电子商务,金融,医疗保健等不同领域的实际业务问题方面拥有丰富的经验。 他对技术充满热情,并且热爱团队合作。