集成学习之随机森林、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)  # 在测试集上评估分类准确率

目录
相关文章
|
5天前
|
机器学习/深度学习 算法 前端开发
机器学习中的集成学习(二)
**集成学习概述** 集成学习通过结合多个弱学习器创建强学习器,如Bagging(Bootstrap Aggregating)和Boosting。Bagging通过随机采样产生训练集,训练多个弱模型,然后平均(回归)或投票(分类)得出结果,减少方差和过拟合。Boosting则是迭代过程,每个弱学习器专注于难分类样本,逐步调整样本权重,形成加权平均的强学习器。典型算法有AdaBoost、GBDT、XGBoost等。两者区别在于,Bagging模型并行训练且独立,而Boosting模型间有依赖,重视错误分类。
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习中的集成学习(一)
集成学习是一种将多个弱学习器组合成强学习器的方法,通过投票法、平均法或加权平均等策略减少错误率。它分为弱分类器集成、模型融合和混合专家模型三个研究领域。简单集成技术包括投票法(用于分类,少数服从多数)、平均法(回归问题,预测值取平均)和加权平均法(调整模型权重以优化结果)。在实际应用中,集成学习如Bagging和Boosting是与深度学习并驾齐驱的重要算法,常用于数据竞赛和工业标准。
|
6天前
|
机器学习/深度学习 算法 前端开发
集成学习思想
**集成学习**是通过结合多个预测模型来创建一个更强大、更鲁棒的系统。它利用了如随机森林、AdaBoost和GBDT等策略。随机森林通过Bootstrap抽样构建多个决策树并用多数投票决定结果,增强模型的多样性。Boosting,如Adaboost,逐步调整样本权重,使后续学习器聚焦于前一轮分类错误的样本,减少偏差。GBDT则通过拟合残差逐步提升预测精度。这些方法通过组合弱学习器形成强学习器,提高了预测准确性和模型的鲁棒性。
|
1天前
|
消息中间件 Java Kafka
springboot集成kafka
springboot集成kafka
9 2
|
8天前
|
消息中间件 Java Kafka
集成Kafka到Spring Boot项目中的步骤和配置
集成Kafka到Spring Boot项目中的步骤和配置
37 7
|
8天前
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
71 5
|
8天前
|
Java 数据库连接 mybatis
在Spring Boot应用中集成MyBatis与MyBatis-Plus
在Spring Boot应用中集成MyBatis与MyBatis-Plus
41 5
|
8天前
|
前端开发 JavaScript 安全
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
集成WebSocket在Spring Boot中可以用于实现实时的双向通信
28 4
|
8天前
|
安全 Java Maven
在 Spring Boot 中实现邮件发送功能可以通过集成 Spring Boot 提供的邮件发送支持来完成
在 Spring Boot 中实现邮件发送功能可以通过集成 Spring Boot 提供的邮件发送支持来完成
17 2
|
8天前
|
XML 搜索推荐 Java
Elasticsearch集成到Spring Boot项目
将Elasticsearch集成到Spring Boot项目中,可以方便地实现数据的搜索、分析等功能。
34 2

热门文章

最新文章