Py学习  »  机器学习算法

机器学习实战 | Adaboost

生信菜鸟团 • 4 年前 • 808 次点击  

这一期给大家介绍 Adaboost 算法,和我们之前介绍的算法不同,Adaboost 是一种集成学习方法,它本身不是一个单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果,以此提高模型的准确性。简单来说就是“三个臭皮匠顶个诸葛亮”。

集成学习概述

集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现。多个模型集成成为的模型叫做集成评估器(ensemble estimator),组成集成评估器的每个模型都叫做基评估器(base estimator)。通常来说,有三类集成算法:装袋法(Bagging),提升法(Boosting)和stacking。

装袋法的核心思想是构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结果。装袋法的代表模型就是随机森林。

提升法中,基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。提升法的代表模型有 Adaboost。

Adaboost 算法

具体说来,整个 Adaboost 迭代算法就 3 步:

  1. 首先,是初始化训练数据的权值分布 D1。假设有 N 个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:

  1. 然后,训练弱分类器 hi。具体训练过程中是:如果某个训练样本点,能被弱分类器 hi 准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

  2. 最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

上面的公式是不是显得有些抽象,接下来,我们就用一个简单的例子来了解如何实现 Adaboost 算法。比如,现在我们需要生成一个分类器以分类下图中的圆形和三角形。

第一步,我们先训练第一个分类器 h1,如图2。很明显经过 h1 的分类,有三个圆形分错了。所以这三个圆的权重要变大一些,然后形成一个新的样本分布用于训练下一个分类器。

第二步,基于这个新的分布再训练一个基分类器,获得一个新的样本分布以及第二个基分类器 h2,如图3。

我们可以看到,有三个三角形是分错的,这也是我们需要重点照顾的对象,因此要把权重加大。同时靠近分类边界的圆形是上次分错的,也要重点关注。

于是样本的分布就变成了下面的样子:

第三步,基于这个新的样本分布,我们需要训练新的分类器 h3。

于是最后的分类器,是三个基分类器的线性组。如下图所示:

AdaBoost的核心思想在于样本权重的更新和弱分类器权值的生成,样本权重的更新保证了前面的弱分类器重点处理普遍情况,后续的分类器重点处理疑难杂症。最终,弱分类器加权组合保证了前面的弱分类器会有更大的权重,这其实有先抓总体,再抓特例的分而治之思想。

Adaboost 算法实现

代码实现

下面,我们尝试用 sklearn 进行 Adaboost 实战~


scikit-learn 库中,包含 AdaBoostRegression(回归)和 AdaBoostClassifier(分类)两种。AdaBoostClassifier 使用了两种 Adaboost 分类算法的实现,SAMME 和 SAMME.R。SAMME 就是之前介绍到的 AdaBoost 算法,指 Discrete AdaBoost。SAMME.R 指 Real AdaBoost,返回值不再是离散的类型,而是一个表示概率的实数值。两者的主要区别是弱分类器权重的度量,SAMME 使用了分类效果作为弱分类器权重,SAMME.R 使用了预测概率作为弱分类器权重,默认算法是SAMME.R。


当我们对Adaboost调参时,主要要对两部分内容进行调参,第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参。


AdaBoostClassifier参数解释

base_estimator:弱分类器,理论上可以选择任何一个分类算法,不过需要支持样本权重。我们常用的一般是 CART 决策树或者神经网络 MLP,默认是决策树。

algorithm:scikit-learn 实现了两种 Adaboost 分类算法,SAMME 和 SAMME.R,默认为 SAMME.R。两者的主要区别是弱学习器权重的度量,SAMME 使用对样本集分类效果作为弱学习器权重,而 SAMME.R 则使用了对样本集分类的预测概率大小来作为弱学习器权重。由于 SAMME.R 使用了概率度量的连续值,迭代一般比 SAMME 快。我们一般使用默认的SAMME.R就够了,但是要注意的是使用了 SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME 算法则没有这个限制。

n_estimator:最大迭代次数,默认 50。在实际调参过程中,常常将n_estimator和学习率learning_rate一起考虑。

learning_rate:每个弱分类器的权重缩减系数。较小的意味着更多的迭代次数,默认是1,也就是不发挥作用。

代码来自:https://github.com/LouisScorpio/datamining/blob/master/blog_code/src/algorithm/ml/ensemble/AdaBoostDemo.py

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles

# 用make_gaussian_quantiles生成多组多维正态分布的数据
# 这里生成2维正态分布,设定样本数1000,协方差2
x1,y1=make_gaussian_quantiles(cov=2., n_samples=200, n_features=2, n_classes=2, shuffle=True, random_state=1)
# 为了增加样本分布的复杂度,再生成一个数据分布
x2,y2=make_gaussian_quantiles(mean=(3,3), cov=1.5, n_samples=300, n_features=2 , n_classes=2, shuffle=True, random_state=1)
# 合并
X=np.vstack((x1,x2))
y=np.hstack((y1,1-y2))
# plt.scatter(X[:,0],X[:,1],c=Y)
# plt.show()

# 设定弱分类器CART
weakClassifier=DecisionTreeClassifier(max_depth=1)

# 构建模型。
clf=AdaBoostClassifier(base_estimator=weakClassifier,algorithm='SAMME',n_estimators=300,learning_rate=0.8)
clf.fit(X, y)

# 绘制分类效果
x1_min=X[:,0].min()-1
x1_max=X[:,0].max()+1
x2_min=X[:,1].min()-1
x2_max=X[:,1].max()+1
x1_,x2_=np.meshgrid(np.arange(x1_min,x1_max,0.02),np.arange(x2_min,x2_max,0.02))

y_=clf.predict(np.c_[x1_.ravel(),x2_.ravel()])
y_=y_.reshape(x1_.shape)
plt.contourf(x1_,x2_,y_,cmap=plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c=y)
plt.show()

训练完成后的错误率大概是0.116。分类效果图如下:

猜你喜欢

支持向量机 sklearn 参数详解

一文带你了解什么是支持向量机

机器学习实战 | 逻辑回归

机器学习实战 | 朴素贝叶斯

机器学习实战 | 决策树

机器学习实战 | k-邻近算法

一起来学习机器学习吧~



全国巡讲约你


第1-11站北上广深杭,西安,郑州, 吉林,武汉,成都,港珠澳(全部结束)

一年一度的生信技能树单细胞线下培训班(已结束)

全国巡讲第13站-杭州(生信技能树爆款入门课)(下一站甘肃兰州,火热报名)



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38459
 
808 次点击