Machine Learning-L12-集成学习:Boosting/Bagging/随机森林

简介: Machine Learning-L12-集成学习:Boosting/Bagging/随机森林

集成学习通过构建并结合多个学习器来完成学习任务,然后把结果整合起来进行整体预测。也称为multi-classifier system、committee-based learning。



20200427095753543.png

对于训练集数据,训练若干个个体学习器,并通过一定的结合策略,最终形成一个强学习器。集成学习常可获得比单一学习器显著优越的泛化性能。集成学习要求个体学习器(individual learner)要有一定的准确性及多样性。


集成只包含同种类型的个体学习器,如“决策树”集成中全是决策树,称为“同质”的(homogeneous)。同质集成中的个体学习器又称基学习器(base learner)或弱学习器(weak learner)。

集成也可包含不同类型的学习器,如同时包含决策树和神经网络,称为“异质”的(heterogenous).异质集成中的个体学习器又称组件学习器(component learner)。

根据个体学习器的生成方式,集成学习算法分为两类:


Boosting:个体学习器之间存在强依赖关系,必须串行生成的序列化方法。

关注降低偏差,参数选择一般较低 e.g.决策树深度6

对离群点和噪声数据敏感

典型算法:AdaBoost/GradientBoostingDecisionTree

Bagging:个体学习器间不存在强依赖关系、可同时生成的并行化方法。

关注降低方差,参数选择一般较高 e.g.决策树深度10

对离群点和噪声数据不敏感

典型算法:Bagging/Random Forest

对于Boosting,每一步都会在上一轮的基础上更加拟合原数据,可以降低偏差(bias);因此对于每个基分类器来说,关键在于如何选择variance更小的分类器,即更简单的分类器,所以选择深度很浅的决策树。


对于Bagging,由于会并行地训练很多不同的(相互独立)分类器,可以降低方差(variance) ,因此对于每个基分类器来说,关键就是如何降低偏差(bias),即更准确的分类器,所以选择深度很深甚至不剪枝的决策树。


1. Boosting


Boosting 是一族将弱学习器提升为强学习器的算法,关注降低偏差,每个分类器采用的样本分布都和上一轮的学习结果有关,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。工作机制如下:


从训练集训(使用初始权重)训练出一个基学习器

根据基学习器的表现(学习误差率),对训练样本分布进行调整,使先前基学习器做错的样本后续受到更多关注(权重变高)

基于调整后的样本分布来训练下一个基学习器,重复直到基学习器数目到底指定的T值

将这T个基学习器进行加权结合

Boosting中的三个要素:


基学习器,如决策树

误差函数,如分类用cross entropy,回归用 mean squared error

加权模型

其中,如何计算学习误差率(损失函数)决定了算法的名字与效果,Boosting系列算法主要有AdaBoost算法和提升树(boosting tree)系列算法,详见下表:


20200427101255276.png


1.1 AdaBoost


AdaBoost(Adaptive Boosting)算法由Freund and Schapire在1996年提出(A decision-theoretic generalization of on-line learning and an application to boosting)。AdaBoost基于加性模型(additive model),即基学习器的线性组合,来最小化指数损失函数(exponential loss function),过程如下:

20200427095938105.png



20200427095951457.png


1.2 GBDT


GBDT(Gradient Boosting Decison Tree)有很多简称GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ), GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree),都是指同一种算法,本文统一简称GBDT。


GBDT是一种迭代的决策树算法,该算法由多棵决策树(GBDT中的树是回归树)组成,所有树的结论累加起来做最终答案。主要的思想是,每一次建立单个学习器时,是在之前建立的模型的损失函数的梯度下降方向。


下面两个图分别表示 DT 和 GB(由100棵树组合成)在树的深度为 0,3,6 时的效果。0 时就是要拟合的函数的图像,可以看到 GB 可以在有限的深度就能得到比较光滑的的拟合:


20200427100637839.png

提升树是迭代多棵回归树来共同决策,利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。提升树即是整个迭代过程生成的回归树的累加。过程如下:

20200427101159411.png


Xgboost(eXtreme Gradient Boosting) 是 GB 算法的C++高效实现,最大的特点在于,它能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。


2. Bagging


为了得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,设法使基学习器尽可能具有较大差异。


Bagging是并行式集成学习方法的最著名代表,基于bootstrap sampling采用出T个含m个训练样本的采样集,然后基于每个采样训练出一个基学习器,再将基学习器进行结合。输出预测时,对分类任务使用简单投票,对回归任务使用简单平均法。


20200427101413946.png


随机采样(bootsrap)就是从我们的训练集里面采集固定个数的样本,但是每采集一个样本后,都将样本放回(GBDT的子采样是无放回采样)。Bagging算法,一般随机采集和训练集样本数m一样个数的样本,得到的采样集和训练集样本的个数相同,但是样本内容不同。对有m个样本训练集做T次的随机采样,则由于随机性,T个采样集各不相同。


对于一个样本,每次被采集到的概率是image.png ,不被采集到的概率为image.png 。如果m次采样都没有被采集中的概率是image.png

image.png  即在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集采集中,称之为袋外数据(Out Of Bag, 简称OOB)。这些数据没有参与训练集模型的拟合,因此可以用来检测模型的泛化能力。


由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。


3. Random Forest


随机森林(RF,Random Forest),在以决策树(CART)为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选。

对基决策树的每个节点,先从该节点的n nn个属性集合中随机选择一个包含k ( k < n )个属性的子集,然后再从这个子集中选择一个最优属性用于划分。

随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,进一步增强了模型的泛化能力


4. Stacking


Stacking使用“学习法”,通过该次级学习器(元学习器,meta-learner)来结合多个初级学习器。

Stacking先从初始数据集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器,在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。


20200427101530126.png


数据集输入->若干学习器-->若干学习器输出(输出作为次级学习器的输入)-->次级学习器-->学习器2输出(预测输出)

以下是stacking中一个模型的完整流程,stacking中同一层通常包含多个模型,可重复相关步骤。


20200427101551273.jpg



首先用一个初级学习器(Model1)进行5折交叉验证,包含两个过程,


基于其中80%数据训练模型(Learn);

使用训练生成的模型对剩余20%数据进行预测(Predict)。

在5折交叉验证完成后,会形成整个Training Data的预测值(Predications)。这些预测值作为新的Training Data,输入下一层的模型,进行训练。


在5折交叉验证完成的同时,还要整个Test Data进行预测,并对5次预测值取加权平均,形成新的Test Data,输入下一层模型,进行预测。

相关文章
|
25天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
43 3
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
194 1
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
122 0
|
2月前
|
机器学习/深度学习 算法 前端开发
集成学习任务七和八、投票法与bagging学习
集成学习任务七和八、投票法与bagging学习
28 0
|
2月前
|
机器学习/深度学习 算法
【机器学习】迅速了解什么是集成学习
【机器学习】迅速了解什么是集成学习
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
25天前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
48 0
|
5月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
316 6
|
5月前
|
Java 关系型数据库 MySQL
如何实现Springboot+camunda+mysql的集成
【7月更文挑战第2天】集成Spring Boot、Camunda和MySQL的简要步骤: 1. 初始化Spring Boot项目,添加Camunda和MySQL驱动依赖。 2. 配置`application.properties`,包括数据库URL、用户名和密码。 3. 设置Camunda引擎属性,指定数据源。 4. 引入流程定义文件(如`.bpmn`)。 5. 创建服务处理流程操作,创建控制器接收请求。 6. Camunda自动在数据库创建表结构。 7. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
419 4
|
5月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
378 1

热门文章

最新文章

下一篇
DataWorks