boosting思路与Adaboost算法

boosting

1. 导论

在前面的学习中,我们探讨了一系列简单而实用的回归和分类模型,同时也探讨了如何使用集成学习家族中的Bagging思想去优化最终的模型。

Bagging思想的实质是:通过Bootstrap 的方式对全样本数据集进行抽样得到抽样子集,对不同的子集使用同一种基本模型进行拟合,然后投票得出最终的预测。

我们也从前面的探讨知道:Bagging主要通过降低方差的方式减少预测误差。那么,本章介绍的Boosting是与Bagging截然不同的思想,Boosting方法是使用同一组数据集进行反复学习,得到一系列简单模型,然后组合这些模型构成一个预测性能十分强大的机器学习模型。

显然,Boosting思想提高最终的预测效果是通过不断减少偏差的形式,与Bagging有着本质的不同。在Boosting这一大类方法中,笔者主要介绍两类常用的Boosting方式:Adaptive Boosting 和 Gradient Boosting 以及它们的变体Xgboost、LightGBM以及Catboost。

2. Boosting方法的基本思路

是一种可以用来减小监督式学习偏差机器学习算法。面对的问题是迈可·肯斯(Michael Kearns)提出的:一组“弱学习者”的集合能否生成一个“强学习者”?弱学习者一般是指一个分类器,它的结果只比随机分类好一点点;强学习者指分类器的结果非常接近真值。在概率近似正确PAC学习的框架下:

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

在PAC 学习的框架下,强可学习和弱可学习是等价的。

这样一来,问题便是:在学习中,如果已经发现了弱可学习算法,能否将他提升至强可学习算法。因为,弱可学习算法比强可学习算法容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基本分类器),然后通过一定的形式去组合这些弱分类器构成一个强分类器。

大多数的Boosting方法都是通过改变训练数据集的概率分布(训练数据不同样本的权值),针对不同概率分布的数据调用弱分类算法学习一系列的弱分类器。

对于Boosting方法来说,有两个问题需要给出答案:

  1. 每一轮学习应该如何改变数据的概率分布;
  2. 如何将各个弱分类器组合起来;

关于这两个问题,不同的Boosting算法会有不同的答案,我们接下来介绍一种最经典的Boosting算法----Adaboost,我们需要理解Adaboost是怎么处理这两个问题以及为什么这么处理的。

3. Adaboost算法

3.1Adaboost的基本原理

对于Adaboost来说,解决上述的两个问题的方式是:

  1. 提高那些被前一轮分类器错误分类的样本的权重,而降低那些被正确分类的样本的权重。这样一来,那些在上一轮分类器中没有得到正确分类的样本,由于其权重的增大而在后一轮的训练中“备受关注”。
  2. 各个弱分类器的组合是通过采取加权多数表决的方式,具体来说,加大分类错误率低的弱分类器的权重,因为这些分类器能更好地完成分类任务,而减小分类错误率较大的弱分类器的权重,使其在表决中起较小的作用。

现在,我们来具体介绍Adaboost算法:(参考李航老师的《统计学习方法》)

假设给定一个二分类的训练数据集:[图片上传失败...(image-b4c2ff-1618844519750)] ,其中每个样本点由特征与类别组成。特征[图片上传失败...(image-e007f3-1618844519752)] ,类别[图片上传失败...(image-90fb95-1618844519752)] ,[图片上传失败...(image-d53e9b-1618844519752)] 是特征空间,[图片上传失败...(image-8867d7-1618844519752)] 是类别集合,输出最终分类器[图片上传失败...(image-9fc4eb-1618844519752)] 。Adaboost算法如下:

(1) 初始化训练数据的分布:[图片上传失败...(image-eb88f7-1618844519752)]

(2) 对于m=1,2,...,M

  • 使用具有权值分布[图片上传失败...(image-94160a-1618844519751)] 的训练数据集进行学习,得到基本分类器:[图片上传失败...(image-23470a-1618844519751)]

  • 计算[图片上传失败...(image-a2d30d-1618844519751)] 在训练集上的分类误差率[图片上传失败...(image-a6daef-1618844519751)]

  • 计算[图片上传失败...(image-e7eed6-1618844519751)] 的系数[图片上传失败...(image-baf420-1618844519751)] ,这里的log是自然对数ln

  • 更新训练数据集的权重分布

这里的[图片上传失败...(image-860af6-1618844519752)] 是规范化因子,使得[图片上传失败...(image-c3da3d-1618844519752)] 称为概率分布,[图片上传失败...(image-65497d-1618844519752)]

(3) 构建基本分类器的线性组合[图片上传失败...(image-68a2e6-1618844519752)] ,得到最终的分类器

[图片上传失败...(image-c00092-1618844519752)]

下面对Adaboost算法做如下说明:

对于步骤(1),假设训练数据的权值分布是均匀分布,是为了使得第一次没有先验信息的条件下每个样本在基本分类器的学习中作用一样。

对于步骤(2),每一次迭代产生的基本分类器[图片上传失败...(image-96058f-1618844519752)] 在加权训练数据集上的分类错误率[图片上传失败...(image-548521-1618844519752)] 代表了在[图片上传失败...(image-618c37-1618844519752)] 中分类错误的样本权重和,这点直接说明了权重分布[图片上传失败...(image-fd635b-1618844519752)] 和[图片上传失败...(image-171963-1618844519751)] 的分类错误率[图片上传失败...(image-722d38-1618844519752)] 有直接关系。同时,在步骤(2)中,计算基本分类器[图片上传失败...(image-196b27-1618844519752)] 的系数[图片上传失败...(image-126ac2-1618844519752)] ,[图片上传失败...(image-b7d66c-1618844519751)] ,它表示了[图片上传失败...(image-cb1534-1618844519752)] 在最终分类器的重要性程度,[图片上传失败...(image-e7de7f-1618844519752)] 的取值由基本分类器[图片上传失败...(image-932a5-1618844519752)] 的分类错误率有直接关系,当[图片上传失败...(image-1c3e4e-1618844519752)] 时,[图片上传失败...(image-ba044d-1618844519752)] ,并且[图片上传失败...(image-c73a84-1618844519752)] 随着[图片上传失败...(image-e3fee7-1618844519752)] 的减少而增大,因此分类错误率越小的基本分类器在最终分类器的作用越大!

最重要的,对于步骤(2)中的样本权重的更新:

[图片上传失败...(image-7ab8e0-1618844519751)]

因此,从上式可以看到:被基本分类器[图片上传失败...(image-70902f-1618844519752)] 错误分类的样本的权重扩大,被正确分类的样本权重减少,二者相比相差[图片上传失败...(image-64eee-1618844519752)] 倍。对于步骤(3),线性组合[图片上传失败...(image-bcd594-1618844519752)] 实现了将M个基本分类器的加权表决,系数[图片上传失败...(image-8fb6d0-1618844519752)] 标志了基本分类器[图片上传失败...(image-3aca75-1618844519752)] 的重要性,值得注意的是:所有的[图片上传失败...(image-9e562b-1618844519752)] 之和不为1。[图片上传失败...(image-72d1c-1618844519752)] 的符号决定了样本x属于哪一类。

手推Adaboost

下面,我们使用一组简单的数据来手动计算Adaboost算法的过程:(例子来源:http://www.csie.edu.tw))

训练数据如下表,假设基本分类器的形式是一个分割[图片上传失败...(image-140b25-1618844519752)] 或[图片上传失败...(image-b668a-1618844519752)] 表示,阈值v由该基本分类器在训练数据集上分类错误率[图片上传失败...(image-efb1c9-1618844519752)] 最低确定。

[图片上传失败...(image-ba3f9e-1618844519752)]

解:

初始化样本权值分布

[图片上传失败...(image-b24ce7-1618844519752)]

对m=1:

  • 在权值分布[图片上传失败...(image-510533-1618844519751)] 的训练数据集上,遍历每个结点并计算分类误差率[图片上传失败...(image-cb50b8-1618844519751)] ,阈值取v=2.5时分类误差率最低,那么基本分类器为:[图片上传失败...(image-453e8c-1618844519751)]
  • [图片上传失败...(image-d4f43d-1618844519751)] 在训练数据集上的误差率为[图片上传失败...(image-f30e29-1618844519751)]
  • 计算[图片上传失败...(image-a4ba69-1618844519751)] 的系数:[图片上传失败...(image-d7b8d0-1618844519751)]
  • 更新训练数据的权值分布:

[图片上传失败...(image-748f52-1618844519751)]

对于m=2:

  • 在权值分布[图片上传失败...(image-ecada8-1618844519751)] 的训练数据集上,遍历每个结点并计算分类误差率[图片上传失败...(image-1e04de-1618844519751)] ,阈值取v=8.5时分类误差率最低,那么基本分类器为:[图片上传失败...(image-b08074-1618844519751)]
  • [图片上传失败...(image-864920-1618844519751)] 在训练数据集上的误差率为[图片上传失败...(image-d996-1618844519751)]
  • 计算[图片上传失败...(image-fec422-1618844519751)] 的系数:[图片上传失败...(image-d5c0dc-1618844519751)]
  • 更新训练数据的权值分布:

[图片上传失败...(image-59e458-1618844519751)]

对m=3:

在权值分布[图片上传失败...(image-1527c3-1618844519751)] 的训练数据集上,遍历每个结点并计算分类误差率[图片上传失败...(image-32063f-1618844519751)] ,阈值取v=5.5时分类误差率最低,那么基本分类器为:[图片上传失败...(image-ac8ec7-1618844519751)]

[图片上传失败...(image-4ad7ba-1618844519751)] 在训练数据集上的误差率为[图片上传失败...(image-214851-1618844519751)]

计算[图片上传失败...(image-56cd1c-1618844519751)] 的系数:[图片上传失败...(image-c06f96-1618844519751)]

更新训练数据的权值分布:[图片上传失败...(image-eb2a9e-1618844519751)]

于是得到:[图片上传失败...(image-50e2f5-1618844519751)] ,分类器[图片上传失败...(image-a63b54-1618844519751)] 在训练数据集上的误分类点的个数为0。

于是得到最终分类器为:[图片上传失败...(image-60fa47-1618844519751)]

3.2 Adaboost实战

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

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"># 引入数据科学相关工具包: import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.style.use("ggplot") %matplotlib inline import seaborn as sns</pre>

加载训练数据:

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">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']</pre>

数据查看:

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">print("Class labels",np.unique(wine["Class label"])) # Class labels [1 2 3] wine.head()</pre>

image.png

下面对数据做简单解读:

  • Class label:分类标签
  • Alcohol:酒精
  • Malic acid:苹果酸
  • Ash:灰
  • Alcalinity of ash:灰的碱度
  • Magnesium:镁
  • Total phenols:总酚
  • Flavanoids:黄酮类化合物
  • Nonflavanoid phenols:非黄烷类酚类
  • Proanthocyanins:原花青素
  • Color intensity:色彩强度
  • Hue:色调
  • OD280/OD315 of diluted wines:稀释酒OD280 OD350
  • Proline:脯氨酸

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"># 数据预处理 # 仅仅考虑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的类别等比例抽样</pre>

wine['Class label'].values

image.png

处理之后的y

image.png

<pre class="cm-s-default" style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);"># 使用单一决策树建模 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)) # Decision tree train/test accuracies 0.916/0.875</pre>

</article>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容