本文介绍提升方法与AdaBoost算法。
0x01、提升方法
提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。
对于分类问题而言,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(也称基本分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。
对提升方法来说,有两个关键问题:(1)在每一轮如何改变训练数据的权值或概率分布;(2)如何将弱分类器组合成一个强分类器。
0x02、AdaBoost算法基础知识
1、基本框架
(1)在原始数据上学习基本分类器 。是基于假设训练数据集具有均匀的权值分布,即每个训练样本在基本分类器的学习中作用相同。
(2)反复学习基本分类器,在每一轮 顺次地执行下列操作:
a. 使用当前分布 加权的训练数据集,学习基本分类器 。
b. 计算基本分类器 在加权训练数据集上的分类误差率:
这里 表示第 轮中第 个实例的权值, 。这表明 在加权的训练数据集上的分类误差率是被 误分类样本的权值之和,由此可以看出数据权值分布 与基本分类器 的分类误差率的关系;
c. 计算基本分类器 的系数 。 表示 在最终分类器中的重要性。 分类误差率越小的基本分类器在最终分类器中的作用越大。
d. 更新训练数据的权值分布为下一轮做准备。被基本分类器 误分类样本的权值得以扩大,而被正确分类样本的权值却得以缩小。误分类样本在下一轮学习中起更大的作用。
(3)线性组合 实现M个基本分类器的加权表决系数 表示了基本分类器 的重要性。这里 所有 之和并不为1 的符号决定示例 的类。 的绝对值表示分类的确信度。利用基本分类器的线性组合构建最终分类器是AdaBoost的另一特点。
2、前向分步算法
前向分步算法(forward stagewise algorithm)的基本想法是:因为学习的是加法模型,如果能从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数,那么就可以简化优化复杂度。这样,每步只需优化如下损失函数:
【前向分步算法】
输入:训练数据集 ;损失函数 ;基函数集 ;
输出:加法模型 。
(1)初始化 ;
(2)对 :
(a). 极小化损失函数,得到参数 ,:
(b). 更新: ;
(3)得到加法模型:
这样,前向分步算法将 同时求解从 m=1 到 M 所有参数 , 的优化问题 简化为逐次求解各个 , 的优化问题。
【定理】AdaBoost算法是前向分步加法算法的特例,这是模型是由基本分类器组成的加法模型,损失函数是指数函数。
0x03、AdaBoost算法步骤
AdaBoost采用加权多数表决的方法,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权重。同时加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用。这样,分类问题被一系列弱分类器“分而治之”。
输入:训练数据集 ,其中 ; 弱学习算法;
输出:最终分类器 。
(1)初始化训练数据的权值分布 , ,
(2)对 :
a. 使用具有权值分布 的训练数据集学习,得到基本分类器: ;
b. 计算 在训练数据集上的分类误差率:
c. 计算 的系数:
d. 更新训练数据集的权值分布:
这里 是范化因子: ,它使 成为一个概率分布。
(3)构建基本分类器的线性组合:
得到最终分类器:
0x04、AdaBoost算法的训练误差分析
AdaBoost最基本的性质是它能在学习过程中不断减少训练误差,即在训练数据集上的分类误差率。
【定理:AdaBoost的训练误差界】AdaBoost算法最终分类器的训练误差界为:
这里 和 分别为:
【定理:二分类问题AdaBoost训练误差界】如下公式,其中 :
【推论】如果存在 ,对所有 有 ,则:
这表明在此条件下AdaBoost的训练误差是以指数速率下降的。
0x05、AdaBoost在sklearn中的实现
1、sklearn.ensemble.AdaBoostClassifier
参数 | 参数类型 | 默认值 | 参数含义 | 详细说明 |
base_estimator | 对象型 | None | 基学习器 | 理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。默认使用CART分类树。 |
n_estimattors | int | 50 | 基学习器个数 | 基学习器的个数,默认50个 |
learning_rate | float | 1 | 学习率 | 每个弱学习器的权重缩减系数,取值在[0,1]之间,用于正则化,防止过拟合 |
algorithm | {'SAMME', 'SAMME.R'} | SAMME.R | 分类算法 | 两者的主要区别是弱学习器权重的度量,SAMME使用对样本集分类效果作为弱学习器权重,SAMME.R使用对样本集分类的预测概率大小来作为弱学习器权重。SAMME.R迭代一般比SAMME快。一般使用默认的SAMME.R就够了。但要注意使用了SAMME.R,则base_estimator必须限制使用支持概率预测的分类器。SAMME算法没有这个限制。 |
random_state | int或随机状态 | None | 随机性设置 | 给基学习器每轮的迭代加上随机种子。 |
2、sklearn.ensemble.AdaBoostRegressor
参数 | 参数类型 | 默认值 | 参数含义 | 详细说明 |
base_estimator | 对象型 | None | 基学习器 | 理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。默认使用CART回归树。 |
n_estimattors | int | 50 | 基学习器个数 | 基学习器的个数,默认50个 |
learning_rate | float | 1 | 学习率 | 每个弱学习器的权重缩减系数,取值在[0,1]之间,用于正则化,防止过拟合 |
loss | {'linear','square', 'exponential'} | linear | 损失函数 | 损失函数的选择,有线性损失函数、平方损失函数和指数损失函数,一般用线性损失函数 |
random_state | int或随机状态 | None | 随机性设置 | 给基学习器每轮的迭代加上随机种子。 |
参考:
[1]. 李航. 统计学习方法(第二版)