AdaBoost算法比较简单,本文重点放在算法实现上。
算法描述
输入:训练集
,其中
输出:最终加权组合起来的分类器
算法:
- 初始化权重
,其中
- 训练
个基分类器
- 用带权重
的训练集组训练出一个基分类器
- 计算这个基分类器的错误率(带权重):
- 计算分类器权重:
- 计算规范化因子:
- 更新权重:
,其中
- 用带权重
- 组合得到最终分类器:
算法实现
参考代码:https://github.com/fengdu78/lihang-code/blob/master/第08章%20提升方法/8.Boost.ipynb
AdaBoost构建框架如下
class
接下来详细解释几个重要函数。
首先是初始化函数,涉及到贯穿整个算法的一些参数,包括
- 基分类器数量
- 数据集(包括特征值、类别、样本数量、特征数量)
- 数据权重集合
- 基分类器参数集合
- 基分类器权重集合
def
接下来是计算分类器权重、规范化因子和数据权重更新的函数,可以按照前文中的公式计算
- 计算分类器权重时需要的参数:当前分类器的错误率
- 计算规范化因子时需要的参数:当前分类器权重、当前分类器的分类结果
- 计算新一轮权重时需要的参数:当前分类器权重、当前分类器的分类结果、规范化因子
def
接下来是样本预测函数,也就是组合得到的最终的分类器,加权求和后使用符号函数。
def
最重要就是AdaBoost算法训练过程,其中基分类器用的是单层决策树,循环嵌套结构如下
- 迭代训练每个基分类器
- 训练一个基分类器时,由于是单层决策树,要尝试使用每一个特征来分类,选一个最好的
- 用一个特征分类时,要尝试每个分类边界值,找到一个最好的(这一步体现在基分类器训练中)
def
单层决策树分类器不是AdaBoost算法的重点,代码也不再详细说明了,可以使用sklearn库中的决策树模型,将参数max_depth设置为1,这样也是一个基分类器。