机器学习的Boosting技术(以AdaBoost为例)
Boosting(提升,提高)是一种集成技术,它通过综合多个弱分类器来获得一个强的分类器。
本文将探究机器学习中的AdaBoost集成方法,本文要解决的问题如下:
- boosting集成技术是什么,它的工作原理是什么
- 如何学习使用AdaBoost算法来提升决策树的性能
- 如何使用训练得到的AdaBoost模型进行预测
- 为了使用AdaBoost算法,我们在数据准备上应该注意什么
本文针对没有数理和统计基础的开发者编写,主要介绍算法的工作原理以及如何将之应用于预测问题的建模当中。
Boosting集成技术
Boosting在机器学习中通常指通过综合多个弱分类器来得到一个强分类器的集成技术。
在Boosting集成技术中,后面加入模型的目的主要是纠正前面模型的错误,直到达到性能标准或者模型的数量达到设置的上限。
AdaBoost是二分类问题中非常成功的Boosting算法。对于理解Boosting算法来说,以它来入门是最适合不过的了。
现代的boosting技术都是构建在AdaBoost基础上的,尤其是随机梯度提升机(stochastic gradient boosting machines)。
从数据中训练得到AdaBoost模型
AdaBoost在提升决策二分类的性能上表现最为出色。
最初的AdaBoost被它的提出者Freund和Schapire称为AdaBoost.M1。由于它更多被用于解决分类问题而不是回归问题,现在人们也称作离散AdaBoost。
AdaBoost技术可以用来提升任何机器学习算法的性能,通常被用于弱学习器(在分类问题中表现为预测正确率就比随机预测高一点)上。
最常与AdaBoost搭配使用的算法是层级为1的决策树,由于单层的决策树只包含一个决策节点,也被称作决策树桩。
训练数据集中的每一个实例都被赋予了权重,初始的权重设置为:
weight(xi) = 1 / n
xi:第i个训练实例,n:训练实例的数量。
如何训练一个模型
在赋予了权重的训练数据上可以训练得到弱分类器(决策树桩)。一般只讨论二分类问题,每个决策树桩在接受输入后输出该数据对应的类别为+1(正例)或-1(反例)。
我们可以训练结束得到模型的误分类率,计算公式如下:
error = (correct - N) / N
error:误分类率,correct:模型正确分类的实例数,N:训练实例数。例如,如果模型正确预测了100个训练实例中的78个,则误分类率可以写作(78-100)/ 100或0.22。
在为实例设置权重后,上述公式可以改写为:
error = sum(w(i) * terror(i)) / sum(w)
加权和为模型的误分类率,w(i):第i个训练实例的权重,terror:第i个训练实例的预测误差,如果错误分类则为1,如果正确分类则为0。
例如,如果我们有3个权重为0.01,0.5和0.2的训练实例。预测值是-1,-1和-1,真实值是-1,1和-1,那么terror的值是0,1,0.可以通过上面的公式计算误分类率:
error =(0.01 * 0 + 0.5 * 1 + 0.2 * 0)/(0.01 + 0.5 + 0.2)
得
error = 0.704
下面计算另一个中间量来更新实例的权重。我们将该值定义为stage,计算表达式如下:
stage = ln( (1-error) / error)
ln():自然对数,error:模型的误分类率。预测正确的实例所占权重越大,stage的值越大。
利用stage值的这一特性,我们可以赋予预测错误的实例更大的权重占比,相应地,预测正确的实例权重占比就会下降,模型就会更偏向于对错误样本作出纠正而不是保持正确样本预测结果的稳定性。
我们可以通过下面的形式来实现我们所需的更新:
w = w * exp(stage * terror)
w:当前训练实例的权重,exp():数值常数e的指数函数,terror:当前实例的预测误差,计算表达式:
terror = 0,(Y == P),else 1
Y为实例的真实值,P为分类器的预测值。
如果该实例被正确分类,则权重值不变,反之权重值增大。
AdaBoost集成技术
依次加入弱学习器并用赋予权重的训练数据进行训练。
该过程将一直持续到达到指定的弱分类器数量或者不能在训练数据集上进一步提升性能为止。
该过程完成后,你将获得一批弱学习器以及它们对应的stage值。
使用AdaBoost方法进行预测
AdaBoost利用弱分类器的加权平均值进行预测。
对于新的输入实例,每个弱学习器的预测值为+1.0或-1.0。通过stage值可以求得各个弱学习器的加权值。各个预测结果的加权和将作为最终的预测结果。如果加权和为正,则为正例,加权和为负为反例,为零可以放弃预测或者输出任意值。
举例说明:如果我们有五个弱分类器,弱分类器的输出分别为1.0,1.0,-1.0,1.0,-1.0。如果从多数投票规则来看应该将实例划分至正例。如果此时他们的stage值为0.2,0.5,0.8,0.2,0.9。计算加权和为-0.8,模型将输出反例的预测结果。
为AdaBoost模型准备数据
本节列出了一些具有启发性的方法供读者参考:
- 保证数据质量:因为集成方法会不断尝试纠正训练数据中的误分类实例,所以一定要保证训练数据是高质量的。
- 移除离群/异常数据:异常值或者离群值会不断迫使模型去拟合一些不现实的数据,因此我们需要将这些异常/离群值从训练集中移除。
- 清洗含噪数据:噪声数据,特别是输出变量中的噪声可能会带来很多问题。如果可以的话,尝试从训练数据集中分离噪声,清洗这些数据。
延伸阅读
下面是一些从机器学习角度描述AdaBoost的章节段落:
- An Introduction to Statistical Learning: with Applications in R,第321页
- The Elements of Statistical Learning: Data Mining, Inference, and Prediction,第10章
- Applied Predictive Modeling,第203和389页
下面为想深入研究AdaBoost的理论基础的读者准备了相关的优秀文章:
- A decision-theoretic generalization of on-line learning and an application to boosting,1995
- Improved Boosting Algorithms Using Confidence-rated Predictions,1999
- Explaining Adaboost, Chapter from Empirical Inference,2013
- A Short Introduction to Boosting,1999
总结回顾
在这篇文章中涉及了以下内容:
- Boosting技术,以及它是如何通过增加弱学习器来纠正误分类结果的。
- AdaBoost的成功应用:在二分类问题上提升分类性能。
- 综合stage权重和弱学习器来实现AdaBoost模型。
- 使用AdaBoost模型来进行预测。
- AdaBoost算法相关资源。
- 持续近7个小时的索引扫描的查询优化分析 (r5笔记第44天)
- 04.Java对象和类
- 关于Oracle数据恢复的两个临界点(r5笔记第42天)
- 关于提问的一些建议(r5笔记第41天)
- shell中echo的显示格式 (r5笔记第58天)
- springboot 入门教程(5) 基于ssm框架的crud操作(前端部分-附源码)
- springboot入门(4)_web开发
- springboot入门教程(2)_Thymeleaf集成
- VList data structures in C#
- 编程思想 之「语言导论」
- 编程思想 之「对象漫谈」
- Github 项目推荐 | TensorFlow 概率推理工具集 —— probability
- Github 项目推荐 | 用于 C/C++、Java、Matlab/Octave 的特征选择工具箱
- Mercari Price 比赛分享 —— 语言不仅是算法和公式而已
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法