Boosting方法的基本思路

  • 前言
  • Boosting方法的基本思路
  • Adaboost算法
  • 案例

前言

在前面的学习中,我们探讨了一系列简单而实用的回归和分类模型,同时也探讨了如何使用集成学习家族中的Bagging思想去优化最终的模型。Bagging思想的实质是:通过Bootstrap 的方式对全样本数据集进行抽样得到抽样子集,对不同的子集使用同一种基本模型进行拟合,然后投票得出最终的预测。我们也从前面的探讨知道:Bagging主要通过降低方差的方式减少预测误差。那么,本章介绍的Boosting是与Bagging截然不同的思想,Boosting方法是使用同一组数据集进行反复学习,得到一系列简单模型,然后组合这些模型构成一个预测性能十分强大的机器学习模型。显然,Boosting思想提高最终的预测效果是通过不断减少偏差的形式,与Bagging有着本质的不同。在Boosting这一大类方法中,笔者主要介绍两类常用的Boosting方式:Adaptive Boosting 和 Gradient Boosting 以及它们的变体Xgboost、LightGBM以及Catboost。

Boosting方法的基本思路

介绍两个例子:
第一个例子:不知道大家有没有做过错题本,我们将每次测验的错的题目记录在错题本上,不停的翻阅,直到我们完全掌握(也就是能够在考试中能够举一反三)。
第二个例子:对于一个复杂任务来说,将多个专家的判断进行适当的综合所作出的判断,要比其中任何一个专家单独判断要好。实际上这是一种“三个臭皮匠顶个诸葛亮的道理”。
这两个例子都说明Boosting的道理,也就是不错地重复学习达到最终的要求。
Boosting的提出与发展离不开Valiant和 Kearns的努力,历史上正是Valiant和 Kearns提出了"强可学习"和"弱可学习"的概念。那什么是"强可学习"和"弱可学习"呢?在概率近似正确PAC学习的框架下:

  • 弱学习:识别错误率小于1/2(即准确率仅比随机猜测略高的学习算法)
  • 强学习:识别准确率很高并能在多项式时间内完成的学习算法

非常有趣的是,在PAC 学习的框架下,强可学习和弱可学习是等价的,也就是说一个概念是强可学习的充分必要条件是这个概念是弱可学习的。这样一来,问题便是:在学习中,如果已经发现了弱可学习算法,能否将他提升至强可学习算法。因为,弱可学习算法比强可学习算法容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基本分类器),然后通过一定的形式去组合这些弱分类器构成一个强分类器。大多数的Boosting方法都是通过改变训练数据集的概率分布(训练数据不同样本的权值),针对不同概率分布的数据调用弱分类算法学习一系列的弱分类器。
对于Boosting方法来说,有两个问题需要给出答案:第一个是每一轮学习应该如何改变数据的概率分布,第二个是如何将各个弱分类器组合起来。关于这两个问题,不同的Boosting算法会有不同的答案,我们接下来介绍一种最经典的Boosting算法----Adaboost,我们需要理解Adaboost是怎么处理这两个问题以及为什么这么处理的。

Adaboost算法

Adaboost的基本原理

对于Adaboost来说,解决上述的两个问题的方式是:1. 提高那些被前一轮分类器错误分类的样本的权重,而降低那些被正确分类的样本的权重。这样一来,那些在上一轮分类器中没有得到正确分类的样本,由于其权重的增大而在后一轮的训练中“备受关注”。2. 各个弱分类器的组合是通过采取加权多数表决的方式,具体来说,加大分类错误率低的弱分类器的权重,因为这些分类器能更好地完成分类任务,而减小分类错误率较大的弱分类器的权重,使其在表决中起较小的作用。
现在,我们来具体介绍Adaboost算法:(参考李航老师的《统计学习方法》)
假设给定一个二分类的训练数据集:T={(x1,y1),(x2,y2),⋯,(xN,yN)}T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\}T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)},其中每个样本点由特征与类别组成。特征xi∈X⊆Rnx_{i} \in \mathcal{X} \subseteq \mathbf{R}^{n}xi​∈X⊆Rn,类别yi∈Y={−1,+1}y_{i} \in \mathcal{Y}=\{-1,+1\}yi​∈Y={−1,+1},X\mathcal{X}X是特征空间,$ \mathcal{Y}是类别集合,输出最终分类器是类别集合,输出最终分类器是类别集合,输出最终分类器G(x)。Adaboost算法如下:(1)初始化训练数据的分布:。Adaboost算法如下: (1) 初始化训练数据的分布:。Adaboost算法如下:(1)初始化训练数据的分布:D_{1}=\left(w_{11}, \cdots, w_{1 i}, \cdots, w_{1 N}\right), \quad w_{1 i}=\frac{1}{N}, \quad i=1,2, \cdots, N$
(2) 对于m=1,2,…,M

  • 使用具有权值分布DmD_mDm​的训练数据集进行学习,得到基本分类器:Gm(x):X→{−1,+1}G_{m}(x): \mathcal{X} \rightarrow\{-1,+1\}Gm​(x):X→{−1,+1}
  • 计算Gm(x)G_m(x)Gm​(x)在训练集上的分类误差率em=∑i=1NP(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)e_{m}=\sum_{i=1}^{N} P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)=\sum_{i=1}^{N} w_{m i} I\left(G_{m}\left(x_{i}\right) \neq y_{i}\right)em​=∑i=1N​P(Gm​(xi​)​=yi​)=∑i=1N​wmi​I(Gm​(xi​)​=yi​)
  • 计算Gm(x)G_m(x)Gm​(x)的系数αm=12log⁡1−emem\alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}}αm​=21​logem​1−em​​,这里的log是自然对数ln
  • 更新训练数据集的权重分布
    Dm+1=(wm+1,1,⋯,wm+1,i,⋯,wm+1,N)wm+1,i=wmiZmexp⁡(−αmyiGm(xi)),i=1,2,⋯,N\begin{array}{c} D_{m+1}=\left(w_{m+1,1}, \cdots, w_{m+1, i}, \cdots, w_{m+1, N}\right) \\ w_{m+1, i}=\frac{w_{m i}}{Z_{m}} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right), \quad i=1,2, \cdots, N \end{array} Dm+1​=(wm+1,1​,⋯,wm+1,i​,⋯,wm+1,N​)wm+1,i​=Zm​wmi​​exp(−αm​yi​Gm​(xi​)),i=1,2,⋯,N​
    这里的ZmZ_mZm​是规范化因子,使得Dm+1D_{m+1}Dm+1​称为概率分布,Zm=∑i=1Nwmiexp⁡(−αmyiGm(xi))Z_{m}=\sum_{i=1}^{N} w_{m i} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right)Zm​=∑i=1N​wmi​exp(−αm​yi​Gm​(xi​))

(3) 构建基本分类器的线性组合f(x)=∑m=1MαmGm(x)f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x)f(x)=∑m=1M​αm​Gm​(x),得到最终的分类器

G(x)=sign⁡(f(x))=sign⁡(∑m=1MαmGm(x))\begin{aligned} G(x) &=\operatorname{sign}(f(x)) \\ &=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} G_{m}(x)\right) \end{aligned} G(x)​=sign(f(x))=sign(m=1∑M​αm​Gm​(x))​

下面对Adaboost算法做如下说明:
对于步骤(1),假设训练数据的权值分布是均匀分布,是为了使得第一次没有先验信息的条件下每个样本在基本分类器的学习中作用一样。
对于步骤(2),每一次迭代产生的基本分类器Gm(x)G_m(x)Gm​(x)在加权训练数据集上的分类错误率em=∑i=1NP(Gm(xi)≠yi)=∑Gm(xi)≠yiwmi\begin{aligned}e_{m} &=\sum_{i=1}^{N} P\left(G_{m}\left(x_{i}\right) \neq y_{i}\right) =\sum_{G_{m}\left(x_{i}\right) \neq y_{i}} w_{m i}\end{aligned}em​​=i=1∑N​P(Gm​(xi​)​=yi​)=Gm​(xi​)​=yi​∑​wmi​​代表了在Gm(x)G_m(x)Gm​(x)中分类错误的样本权重和,这点直接说明了权重分布DmD_mDm​与Gm(x)G_m(x)Gm​(x)的分类错误率eme_mem​有直接关系。同时,在步骤(2)中,计算基本分类器Gm(x)G_m(x)Gm​(x)的系数αm\alpha_mαm​,αm=12log⁡1−emem\alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}}αm​=21​logem​1−em​​,它表示了Gm(x)G_m(x)Gm​(x)在最终分类器的重要性程度,αm\alpha_mαm​的取值由基本分类器Gm(x)G_m(x)Gm​(x)的分类错误率有直接关系,当em⩽12e_{m} \leqslant \frac{1}{2}em​⩽21​时,αm⩾0\alpha_{m} \geqslant 0αm​⩾0,并且αm\alpha_mαm​随着eme_mem​的减少而增大,因此分类错误率越小的基本分类器在最终分类器的作用越大!
**最重要的,对于步骤(2)中的样本权重的更新: **
wm+1,i={wmiZme−αm,Gm(xi)=yiwmiZmeαm,Gm(xi)≠yiw_{m+1, i}=\left\{\begin{array}{ll} \frac{w_{m i}}{Z_{m}} \mathrm{e}^{-\alpha_{m}}, & G_{m}\left(x_{i}\right)=y_{i} \\ \frac{w_{m i}}{Z_{m}} \mathrm{e}^{\alpha_{m}}, & G_{m}\left(x_{i}\right) \neq y_{i} \end{array}\right. wm+1,i​={Zm​wmi​​e−αm​,Zm​wmi​​eαm​,​Gm​(xi​)=yi​Gm​(xi​)​=yi​​
因此,从上式可以看到:被基本分类器Gm(x)G_m(x)Gm​(x)错误分类的样本的权重扩大,被正确分类的样本权重减少,二者相比相差e2αm=1−emem\mathrm{e}^{2 \alpha_{m}}=\frac{1-e_{m}}{e_{m}}e2αm​=em​1−em​​倍。
对于步骤(3),线性组合f(x)f(x)f(x)实现了将M个基本分类器的加权表决,系数αm\alpha_mαm​标志了基本分类器Gm(x)G_m(x)Gm​(x)的重要性,值得注意的是:所有的αm\alpha_mαm​之和不为1。f(x)f(x)f(x)的符号决定了样本x属于哪一类。

案例

本次案例我们使用一份UCI的机器学习库里的开源数据集:葡萄酒数据集,该数据集可以在 ( https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data )上获得。该数据集包含了178个样本和13个特征,从不同的角度对不同的化学特性进行描述,我们的任务是根据这些数据预测红酒属于哪一个类别。(案例来源《python机器学习(第二版》)

# 引入数据科学相关工具包:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use("ggplot")
%matplotlib inline
import seaborn as sns# 加载训练数据:
wine = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data",header=None)
wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash','Magnesium', 'Total phenols','Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins','Color intensity', 'Hue','OD280/OD315 of diluted wines','Proline']
# 数据预处理
# 仅仅考虑2,3类葡萄酒,去除1类
wine = wine[wine['Class label'] != 1]
y = wine['Class label'].values
X = wine[['Alcohol','OD280/OD315 of diluted wines']].values# 将分类标签变成二进制编码:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)# 按8:2分割训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=1,stratify=y)  # stratify参数代表了按照y的类别等比例抽样
# 使用单一决策树建模
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(criterion='entropy',random_state=1,max_depth=1)
from sklearn.metrics import accuracy_score
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))
# 使用sklearn实现Adaboost(基分类器为决策树)
'''
AdaBoostClassifier相关参数:
base_estimator:基本分类器,默认为DecisionTreeClassifier(max_depth=1)
n_estimators:终止迭代的次数
learning_rate:学习率
algorithm:训练的相关算法,{'SAMME','SAMME.R'},默认='SAMME.R'
random_state:随机种子
'''
from sklearn.ensemble import AdaBoostClassifier
ada = AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=1)
ada = ada.fit(X_train,y_train)
y_train_pred = ada.predict(X_train)
y_test_pred = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))

结果分析:单层决策树似乎对训练数据欠拟合,而Adaboost模型正确地预测了训练数据的所有分类标签,而且与单层决策树相比,Adaboost的测试性能也略有提高。然而,为什么模型在训练集和测试集的性能相差这么大呢?我们使用图像来简单说明下这个道理!

# 画出单层决策树与Adaboost的决策边界:
x_min = X_train[:, 0].min() - 1
x_max = X_train[:, 0].max() + 1
y_min = X_train[:, 1].min() - 1
y_max = X_train[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),np.arange(y_min, y_max, 0.1))
f, axarr = plt.subplots(nrows=1, ncols=2,sharex='col',sharey='row',figsize=(12, 6))
for idx, clf, tt in zip([0, 1],[tree, ada],['Decision tree', 'Adaboost']):clf.fit(X_train, y_train)Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)axarr[idx].contourf(xx, yy, Z, alpha=0.3)axarr[idx].scatter(X_train[y_train==0, 0],X_train[y_train==0, 1],c='blue', marker='^')axarr[idx].scatter(X_train[y_train==1, 0],X_train[y_train==1, 1],c='red', marker='o')axarr[idx].set_title(tt)
axarr[0].set_ylabel('Alcohol', fontsize=12)
plt.tight_layout()
plt.text(0, -0.2,s='OD280/OD315 of diluted wines',ha='center',va='center',fontsize=12,transform=axarr[1].transAxes)
plt.show()

从上面的决策边界图可以看到:Adaboost模型的决策边界比单层决策树的决策边界要复杂的多。也就是说,Adaboost试图用增加模型复杂度而降低偏差的方式去减少总误差,但是过程中引入了方差,可能出现国拟合,因此在训练集和测试集之间的性能存在较大的差距,这就简单地回答的刚刚问题。值的注意的是:与单个分类器相比,Adaboost等Boosting模型增加了计算的复杂度,在实践中需要仔细思考是否愿意为预测性能的相对改善而增加计算成本,而且Boosting方式无法做到现在流行的并行计算的方式进行训练,因为每一步迭代都要基于上一部的基本分类器。

Boosting方法的基本思路相关推荐

  1. Boosting方法及代码实战

    1. Boosting基本思路   Boosting(提升)方法是一种常用的统计学习方法,应用广泛且有效,在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的 ...

  2. GBDT 之 Boosting方法

    Boosting方法概述 Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操 ...

  3. 编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略

    编程笔试(解析及代码实现):字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 目录 字符串反转(字符串逆序输出)代码实现十多种方法对比(解析思路及其耗费时间)详细攻略 ...

  4. 缓存雪崩处理方法-双缓存思路

    为什么80%的码农都做不了架构师?>>>    缓存雪崩处理方法-双缓存思路: http://www.oschina.net/question/12_26514 转载于:https: ...

  5. 集成学习(ensemble learning)干货系列(3)——Boosting方法详解

    集成学习(ensemble learning)干货系列(1)--集成学习概述 集成学习(ensemble learning)干货系列(2)--随机森林(Bagging) Boosting基本原理 提升 ...

  6. Boosting方法详解

    文章目录 提升方法与AdaBoost算法 提升方法的基本思路 AdaBoost算法 AdaBoost算法的训练误差分析 一般分类问题训练误差分析 二分类问题训练误差分析 由误差分析产生的推论 AdaB ...

  7. Monte Carlo方法的基本思路

    Monte Carlo方法的基本思路 (1)针对实际问题建立一个简单且便于实现的概率统计模型,使所求的解恰好是所建模型的概率分布或其某个数字特征,比如是某个事件的概率,或者是该模型的期望值. (2)对 ...

  8. PCB电路板3D渲染电路板3D效果图制作方法的一点思路

    PCB电路板3D渲染电路板3D效果图制作方法的一点思路 首先看下效果图,如果不是你需要的效果,就可以不用看了 工具 第一步,截图得出AD里面的各个图层 第二步,导出轮廓为矢量图 第三步,处理线条 第四 ...

  9. 常见的加密方法与破解思路

    电脑在我们身边逐步扮演着越来越重要的角色,越来越多的机密数据存放在我们的电脑中.随着人们安全意识的不断提高,我们也开始大量使用密码来保护自己的机密数据.然而,经常还能听到"XX网站被黑客攻击 ...

最新文章

  1. 第二十五章 面向对象------封装、内置函数、反射、动态导入
  2. 限时抢购秒杀系统架构分析与实战
  3. GlobalAlloca GlobalLock GlobalUnlock函数的作用
  4. idea里自动创建构造函数
  5. linux挂载U盘,及乱码问题解决
  6. 做一个有胆识的有为青年
  7. js点击图片查看大图,并可以拖动,且滚动滑轮放大缩小
  8. dz论坛连接mysql数据库_dz论坛搬家后连接数据库等教程
  9. 为什么要使用Base64?
  10. Django中使用CORS实现跨域请求
  11. 二阶振荡环节的谐振频率_晶振频率稳定性的两个重要因素
  12. STM8 ADC转换模式-------连续模式
  13. 泰然的粒子编辑器~~拿过来玩玩啊
  14. ESET NOD32激活码/许可证密钥/用户名密码
  15. 100层楼扔鸡蛋,最快速度找出,哪层是鸡蛋碎的临界点
  16. 利用谷歌浏览器翻译外文文献 操作记录
  17. Windows 内存映射
  18. 使用freemarker导出Word文档(含图片)
  19. Adobe Photoshop 2021 22.1.1.138中文版(win/mac)
  20. 3.20 关于怎样做好小红书直播的一些技巧【玩赚小红书】

热门文章

  1. C语言编程输出特殊图案
  2. java hincrby_挖坑记录-redistemplate hincrby
  3. 美团优选前端面试经验分享
  4. 数据挖掘之Web挖掘和文本挖掘
  5. linux中的截图命令
  6. Vue表头下拉选择框使用总结
  7. ABAP OpenSQL使用索引(HINTS)的参考NOTE记录
  8. Paper Reading 02 基于持久性内存的哈希索引
  9. 2015蓝桥杯python——三羊献瑞
  10. mysql数据库性别字段你选用什么数据类型呢