AdaBoost

AdaBoost方法是一种迭代算法,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率。每一个训练样本都被赋予一个权重,表明它被某个分类器选入训练集的概率。如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost方法能“聚焦于”那些较难分(更富信息)的样本上。在具体实现上,最初令每个样本的权重都相等,对于第k次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器Ck。然后就根据这个分类器,来提高被它分错的的样本的权重,并降低被正确分类的样本权重。然后,权重更新过的样本集被用于训练下一个分类器Ck。整个训练过程如此迭代地进行下去。

AdaBoost算法包括以下三个步骤:
1)初始化训练样本的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N
2)训练弱分类器。具体训练过程中,如果某个样本已经被准确地分类,那么在构造下一个训练集中,它的权值就会被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本被用于训练下一个分类器,整个训练过程如果迭代地进行下去,使得分类器在迭代过程中逐步改进。
3)将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中权重较大,否则较小。得到最终分类器

算法流程如下:
假定给定一个二类分类的训练数据集
在这里插入图片描述
其中yi属于二分类的标记组合,即yi∈{+1,−1},AdaBoost算法利用一下算法,从训练数据中学习一系列弱分类器或基本分类器,并将这些弱分类器线性组合成一个强分类器。
步骤一:首先,初始化训练数据的权值分布。假设每一个训练样本最开始时都被赋予相同的权值:1/N,即每个训练样本在基本分类器的学习中作用相同,这一假设保证步骤一能够在原始数据上学习基本分类器G1(x),数学化的语言表示为:
在这里插入图片描述
步骤二:AdaBoost反复学习基本分类器,在每一轮m=1,2,···,M 顺次执行下列操作:
1)使用当前权值分布为Dm的训练数据集,学习得到基分类
在这里插入图片描述
2)计算上一步得到的基分类器Gm(x)
在训练数据集上的分类误差率em为
在这里插入图片描述
这里wmi表示第m轮中第i个实例的权值,∑Ni=1wmi=1。这表明,Gm(x)在加权的训练数据集上的分类误差率是被Gm(x)误分类样本的权值之和,由此可以看出数据权值分布Dm与基本分类器Gm(x)的分类误差率的关系。
3)计算Gm
前面的权重系数am,该系数表示Gm在最终分类器中的重要程度,目的在于使我们得到基分类器在最终分类器中所占的权值,系数计算公式如下:
在这里插入图片描述
这里的对数是自然对数,由表达式可知,当em≤12时,am≥0,并且am随着em的减小而增大,意味着分类误差越小的基本分类器在最终分类器的作用越大,而em≥12则刚好相反,这正好验证了集成学习中每个个体分类器的分类精度必须大于0.5的前提条件。
4)更新训练数据集的权值分布为下一轮作准备
在这里插入图片描述
其中
在这里插入图片描述
我们也可以写成:
在这里插入图片描述
由此可知,被基本分类器Gm(x)误分类样本的权值得以扩大,而被正确分类样本的权值得以缩小。两两比较,误分类样本的权值
在这里插入图片描述
倍。因此,误分类样本在下一轮学习中起更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作业,这是AdaBoost的一个特点。这里我们还引入了一个规范化因子,它的作用在于使Dm+1成为一个概率分布。具体公式为
在这里插入图片描述
重复步骤二中的1至4步骤,得到一系列的权重参数am和基分类器Gm

步骤三:将上一步得到的基分类器根据权重参数线性组合
在这里插入图片描述
得到最终分类器G(x)
在这里插入图片描述
线性组合f(x)实现了M个基本分类器的加权表决。系数am表示了基本分类器Gm(x)的重要性,这里,所有的am之和并不为1。f(x)的符号决定实例x的类,f(x)的绝对值表示分类的确信度,利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。

首先是加载所需的库
在这里插入图片描述
导入train_test_split函数用于分割训练集和测试集
在这里插入图片描述
导入metric模块用于评估准确率
在这里插入图片描述
在建模部分的模型中,我们使用IRIS数据集,这是一个非常著名的多分类问题。 该数据集包括4个特征(萼片长度,萼片宽度,花瓣长度,花瓣宽度)和目标(花的类型)。 这些数据有三种花类:Setosa,Versicolour和Virginica
加载数据
在这里插入图片描述
将数据集划分为训练集和测试集,使用函数train_test_split()拆分数据集。train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签。
原型是
X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.3, random_state=0)
train_data:被划分的样本特征集
train_target:被划分的样本标签
test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
random_state:是随机数的种子。其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
在这里插入图片描述
使用Scikit-learn创建AdaBoost模型。AdaBoost使用决策树分类器作为默认分类器
在这里插入图片描述
AdaBoost最重要的三个参数:

  1. base_estimator:即弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。AdaBoostClassifier默认使用CART分类树DecisionTreeClassifier
  2. n_estimators: 弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
  3. learning_rate: 每个弱学习器的权重缩减系数ν,强学习器的迭代公式为fk(x)=fk−1(x)+ναkGk(x)。ν的取值范围为0<ν≤1。对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的ν开始调参,默认是1。

训练AdaBoost分类器

在这里插入图片描述
做出预测
在这里插入图片描述
让我们估计一下,模型可以预测品种的类型有多少准确率。
准确率可以通过比较实际测试集值和预测值来计算。
在这里插入图片描述
完整代码在1.py
运行后结果如图
在这里插入图片描述
可以看到这个准确率还是蛮不错的,接下来我们换个弱分类学习器

这次使用SVC,不用默认的决策树
在这里插入图片描述
在这里插入图片描述
在AdaBoostClassifier的base_estimator需要指定为svc
在这里插入图片描述
完整代码在2.py
在这里插入图片描述
运行后可以看到准确率较默认的以决策树作为base estimator时有一定提升

参考:
1.《机器学习》(西瓜书)
2. https://en.wikipedia.org/wiki/AdaBoost
3. https://www.datacamp.com/community/tutorials/adaboost-classifier-python
4. https://wizardforcel.gitbooks.io/dm-algo-top10/content/adaboost.html
5. https://blog.csdn.net/v_JULY_v/article/details/40718799

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值