adaboost算法_5分钟看懂Adaboost(附Python代码实现和解释)

集成学习是一类非常有效的算法,通过将多个不同的方法组合在一起产生一个更加强大的方法。集成学习的思路包括两种,一种是bagging,一种是boosting。本文描述的是boosting中最基本的方法,即AdaBoost。

0785e725145a45378c428d6bfcbdcafe

AdaBoost,全称是“Adaptive Boosting”,由Freund和Schapire在1995年首次提出,并在1996发布了一篇新的论文证明其在实际数据集中的效果。这篇博客主要解释AdaBoost的算法详情以及实现。它可以理解为是首个“boosting”方式的集成算法。是一个关注二分类的集成算法。

70feb7801ff3483bb94d7501b529393f
  • 一、算法的总体情况
  • 1.1、sign函数
  • 1.2、弱分类器f(x)
  • 二、AdaBoost的求解
  • 三、AdaBoost的Python实现

一、算法的总体情况

AdaBoost的目标是建立如下的最终的分类器:

d299d49f33c94a72b6b34ccdfb2e40da

其中,假设我们输入的训练数据总共有n个,用(x​1​​,y1​​),⋯,(xn​​,yn​​)表示,其中x1是一个多维向量,而其对应的y={-1,1}。

1.1、sign函数

这里的sign

sign函数是符号函数。判断实数的正负号。即如果输入是正数,那么输出为1;输入为负数,那么输出为-1;如果输入是0的话,那么输出为0。因此,AdaBoost的目标是判断{−1,1}的二分类判别算法。其函数图像如下所示:

d478a185c12444abb8bf6cce9e8df34e

1.2、弱分类器f(x)

模型中的fm​​(x)是弱分类器。这里假设一个AdaBoost是由M个弱分类器家全球和得到。每一个弱分类器f_m(x)都给出一个预测结果,然后根据其对应的权重θm​​加权求和。因此,我们可以看到,AdaBoost的目标其实就是求出每个弱分类器的模型参数,以及其对应的权重。

二、AdaBoost的求解

前面可以看到AdaBoost的模型本身非常简单。那么,如何求解这个模型中弱分类器的权重及其参数呢?其步骤如下:

首先,根据前面所述,有n个数据,我们初始化每个数据的权重都是一样的:

5a5997c315fc43589aba7890cdf3be85

接下来,我们对每一个弱分类器(1,⋯,M)都进行如下操作:

1) 训练一个弱分类器,使得其分类误差最小,此时计算该分类器的误差计算如下公式:

e46abd60933f4a66a969762ccc44ab02

​这个公式的含义就是模型的误差等于每一个错分的样本权重之和。

当该模型是第一个弱分类器(即第一次迭代的时候),该公式中的含义就是计算当前弱分类器分错的样本个数,除以总的样本数量,得到该弱分类器的误差(因为,此时每个样本的误差都是1/n)。同时注意,在后面的迭代中,每个错分的样本的权重是不同的,这里的m表示第m次迭代时候,该样本的权重。

2)根据当前弱分类器的误差,计算该分类器的权重:

415f7ddcd3b846d5b86b298fd43a7c95

该公式的含义就是,当该弱分类器的准确率(1-前面的误差)大于0.5,那么这个权重就是正值(因为此时ϵm​​<0.5,那么对数内部就是大于1,那么结果就是正数了)。否则该权重为负值。也就是说,只要这个分类器的准确率结果不是0.5(这个时候就相当于随机猜测了),它总会给最终的分类器提供一些信息。

3)最后,我们根据模型权重更新数据的权重:

6e18e57f2d9f412090ab498c4147debe

这里的Zm​​是正规化系数,确保所有的数据权重总和为1。

解释一下这个公式的含义,指数内部−θm​​yi​​fm​​(xi​​)这个乘积的含义是如果弱分类器m的分类结果和真实的结果一致,那么结果是−θm​​,是一个负值,那么exp[−θm​​yi​​fm​​(xi​​)]结果小于1。也就是说该数据集的样本权重降低。否则该数据样本的权重增高。因此,通过这种计算就可以让那些容易分错的样本的权重升高,容易分对的样本权重降低。继续迭代就会导致对难分的样本能分对的模型的权重上涨。最终,达到一个强分类器的目的。

三、AdaBoost的Python实现

根据上述原理,AdaBoost的实现就很容易了。这里的主要目标是训练好每个弱分类器的同时,计算好分类器的权重。

# 载入数据# 训练数据的特征和标签x_train, y_train = ...# 预测数据的特征y_train = ...# 定义分类器数量M = 100models = getModel(100)# 计算数据数量n_train = x_train.shape[0]# 初始化数据权重w = np.ones(n_train) / n_train# 初始化模型权重theta = np.zeros(n_train)# 循环迭代for m in range(M): # 训练一个弱分类器 models[m].fit(x_train,y_train) # 计算弱分类器误差 pred_train = models[m].predict(x_train) miss = [int(x) for x in (pred_train != y_train)] error = np.dot(w, miss) # 计算弱分类器的权重 theta[m] = 0.5 * np.log((1-error)/error) # 更新数据权重 for i in n_train: w[i] = w[i]*np.exp(-theta[m]*y_train[i]*pred_train[i]) # 正规化权重 for i in n_train: w[i] /= np.sum(w[i])# 最终的预测predict = np.dot(theta, [model[m].predict(x_test) for m in range(M)])

就像下图的盲人摸象一样,每一个子分类器完成一点,综合起来达到一个最优的效果。

eb5959493b9b49a6bb95512099971d5a

参考文献:

https://towardsdatascience.com/boosting-algorithm-adaboost-b6737a9ee60c

https://towardsdatascience.com/boosting-and-adaboost-clearly-explained-856e21152d3e

https://github.com/jaimeps/adaboost-implementation/blob/master/adaboost.py

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值