集成学习之随机森林、Adaboost、Gradient Boosting、XGBoost原理及使用

简介: 集成学习之随机森林、Adaboost、Gradient Boosting、XGBoost原理及使用

集成学习


什么是集成学习


集成学习(ensemble learning)本身不是一个单独的机器学习算 法,而是通过构建并结 合多个机器学习模型来完成学习任务——博采众长。集成学习很好 的避免了单一学习模型带 来的过拟合问题。



集成学习的类型


根据个体学习器的生成方式,目前的集成学习方法大致可分为两 大类:


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

Boosting(个体学习器间存在强依赖关系、必须串行生成的序列 化方法)

Bagging与随机森林


Bagging介绍

Bagging是并行式集成学习最著名的代表,它是基于自助采样法 (bootstrap sampling)


自助采样法(bootstrap sampling):


给定包含m个样本的数据集,先随机取出一个样本放入采 样集中并记录,再把该样本放回初始数据集,使得下次采样时 该样本仍有可能被选中,这样,经过m次随机采样操作,我们 得到含m个样本的采样集,初始训练集中有的样本在采样集里 多次出现,有的则从未出现(平均37%没有取到)。


带外数据OOB(Out of Bag)


自助采样过程导致一部分样本可能没有取到(平均37%没有取到), 这些未取到的样本称为 OOB(Out of Bag),可以使用这部分OOB的数据集作为测试集。


Bagging的基本流程


基于每个采样集训练出一个基学习器,再将这些基学习器进行结 合


对分类任务,使用简单投票法

对回归任务,使用简单平均法

随机森林

       随机森林(Random Forest,简称RF)是Bagging的一个扩展变体。


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


       具体来说,传统决策树在选择划分属性时是在当前结点的属性集 合(假定有d个属性) 中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该 结点的属性集合中随机 选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属 性用于划分。这里的参 数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统 决策树相同;若令k=1, 则是随机选择一个属性用于划分;一般情况下,推荐值k=log2d。


实战——随机森林实现分类


在sklearn中,使用随机森林算法实现分类的功能使用的是 RandomForestClassifier.


import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 生成数据集
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=555)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,
                               oob_score=True,random_state=666,
                               n_jobs=-1)
rf_clf.fit(X,y)  # 拟合
rf_clf.oob_score_   # 使用OOB数据测试

Adaboost


Adaboost的原理

       以分类为例,Adaboost算法通过提高前一轮分类器分类错误的 样本的权值,而降低那 些被分类正确的样本的权值。


       需要注意的是,由于每个子模型要使用全部的数据集进行训练, 因此 Adaboost算法中 没有oob数据集,在使用 Adaboost 算法前,需要划分数据集: train_test_split。


实战——Adaboost + 决策树

在使用Adaboost与决策树结合解决分类问题时,使用 AdaBoostClassifier


import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
# 创建数据集
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=666)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()



# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
# 创建AdaBoostClassifier对象,结合了AdaBoost提升算法与决策树算法
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),
                            n_estimators=500)
ada_clf.fit(X_train,y_train)  # 在训练集上拟合
ada_clf.score(X_test,y_test)   # 在测试集上测试准确率


Gradient Boosting


Gradient Boosting原理


       和Adaboost不同,Gradient Boosting 在迭代的时候选择损失 函数在其梯度方向下降 的方向不停地改进模型。


1 训练一个模型m1,产生错误e1

2 针对e1训练第二个模型m2,产生错误e2

3 针对e2训练第三个模型m3,产生错误e3...

4 最终预测结果是:m1+m2+m3+...

注意: Adaboost和Gradient Boosting的区别主要在于从不同的角度实 现对上一轮训练错误的数据更多关注,Adaboost主要对数据引 入权重,训练后调整学习错误的数据的权重,从而使得下一轮 学习中给予学习错误的数据更多的关注。


实战——GBDT及其代码实现

GBDT的组成部分 GBDT由GB(Gradient Boosting)和DT(Regression Decision Tree)组成。


注意: GBDT中的树是回归树(不是分类树),GBDT用来做回归预 测,调整后也可以用于分类


sklearn中的GBDT


在scikit-learn中,GBDT类库包括


GradientBoostingClassifier(用于分类)

GradientBoostingRegressor(用于回归)

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 创建数据集,并显示
X, y = datasets.make_moons(n_samples=500, noise=0.3, random_state=666)
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show() 


from sklearn.model_selection import train_test_split
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
from sklearn.ensemble import GradientBoostingClassifier
# 创建GBDT对象,设置树的深度和数量
gb_clf = GradientBoostingClassifier(max_depth=2,n_estimators=30)
gb_clf.fit(X_train,y_train)  # 在训练集上拟合
gb_clf.score(X_test,y_test)  # 在测试集上评测


XGBoost


XGBoost简介


XGBoost全称是eXtreme Gradient Boosting,可译为极限梯度 提升算法。它由陈天奇 所设计,致力于让提升树突破自身的计算极限,以实现运算快速, 性能优秀的工程目标。 XGBoost已经被认为是在分类和回归上都拥有超高性能的先进评估 器。


XGBoost原理


XGBoost的基础是梯度提升算法 XGBoost中的预测值是所有弱分类器上的叶子节点权重直接求和 得到 例如:要预测一家人对电子游戏的喜好程度。



实战——XGBoost的sklearn实现

XGBoost的安装


使用pip直接安装 pip install xgboost


下载相关的whl文件进行安装(https://www.lfd.uci.edu/~gohlk e/pythonlibs/#xgboost)

from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()  # 加载鸢尾花数据集
X = iris.data  # 样本特征
y = iris.target  # 样本标签
# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=666)
from xgboost import XGBClassifier
xgb = XGBClassifier(learning_rate=0.01,
                    n_estimators=10,  # 树的个数
                    max_depth=4   # 树的深度
                    )
xgb.fit(X_train,y_train)  # 在训练集上拟合
xgb.score(X_test,y_test)  # 在测试集上评估分类准确率

目录
相关文章
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
105 0
|
1月前
|
机器学习/深度学习 算法 前端开发
集成学习任务七和八、投票法与bagging学习
集成学习任务七和八、投票法与bagging学习
18 0
|
1月前
|
机器学习/深度学习 算法
【机器学习】迅速了解什么是集成学习
【机器学习】迅速了解什么是集成学习
|
4月前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
297 6
|
4月前
|
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. 启动应用,测试流程启动,如通过服务和控制器开始流程实例。 示例代码包括服务类启动流程实例及控制器接口。实际集成需按业务需求调整。
380 4
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
336 1
|
5月前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
176 2
|
5月前
|
监控 前端开发 Java
五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
|
4月前
|
消息中间件 Java Kafka
Spring Boot与Apache Kafka Streams的集成
Spring Boot与Apache Kafka Streams的集成
下一篇
无影云桌面