XGBoost的介绍

一、XGBoost的介绍

1.什么是XGBoost?

XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升树的机器学习算法,它在解决分类和回归问题上表现出色。它是由陈天奇在2014年开发的,如今已成为机器学习领域中最流行和强大的算法之一。

XGBoost结合了梯度提升框架和决策树模型,通过迭代地训练一系列的决策树来逐步改进预测性能。它的目标是优化损失函数,使得预测值与实际值之间的误差最小化

2.XGBoost的主要特点
  1. 梯度提升树:XGBoost使用梯度提升框架,通过迭代地训练多个决策树来不断改进模型的预测能力。
  2. 正则化:XGBoost引入了正则化技术,包括L1和L2正则化,以控制模型的复杂度并减少过拟合的风险。
  3. 特征重要性:XGBoost能够评估特征的重要性,并根据特征的贡献度进行特征选择。
  4. 并行计算:XGBoost支持并行计算,可以有效地利用多个CPU核心加速训练过程。
  5. 缺失值处理:XGBoost能够自动处理缺失值,无需对缺失值进行预处理。
  6. 可扩展性:XGBoost可以处理大规模数据集和高维特征,具有很好的可扩展性。
  7. 多种语言支持:XGBoost提供了多种编程语言的接口,包括Python、R、Java等。

由于XGBoost在准确性、灵活性和效率方面的优势,它在各种机器学习任务中被广泛应用,包括分类、回归、排序、推荐系统等。它在许多机器学习竞赛和实际应用中取得了显著的成绩,成为了许多数据科学家和机器学习从业者的首选算法之一。

3.XGBoost的算法原理

XGBoost(eXtreme Gradient Boosting)是一种梯度提升树(Gradient Boosting Tree)算法,它是一种集成学习方法通过将多个弱学习器(通常是决策树)进行集成来构建一个更强大的预测模型。下面是XGBoost的算法原理:

  1. 损失函数:XGBoost的目标是最小化一个定义在预测值和实际值之间的损失函数。常用的损失函数包括平方损失函数(回归问题)和对数损失函数(二分类和多分类问题)。
  2. 基础模型:XGBoost使用回归树作为基础模型,每个回归树由一系列决策节点和叶节点组成。初始时,XGBoost使用一个简单的基础模型(如一个叶节点)作为起点。
  3. 残差计算:在每轮迭代中,XGBoost通过计算当前模型的预测值与实际值之间的残差来进行训练。这里的残差表示当前模型对样本的预测结果与真实值之间的差异。
  4. 损失函数近似:为了优化损失函数,XGBoost使用泰勒展开(Taylor expansion)来近似损失函数。将损失函数进行二阶泰勒展开后,可以得到一个简化的目标函数,其中包括关于残差的一阶导数和二阶导数。
  5. 弱学习器训练:XGBoost以梯度下降的方式训练每个回归树。根据目标函数的一阶导数和二阶导数,XGBoost计算每个样本在当前模型下的梯度和二阶梯度。然后,通过拟合一个新的回归树来近似梯度和二阶梯度,使得模型能够更好地预测这些样本的残差。
  6. 加权组合:XGBoost使用一定的步长(学习率)将新构建的回归树与当前模型进行加权组合。这样,每轮迭代都会得到一个更新的模型,它在之前模型的基础上进一步提高了预测能力。
  7. 正则化:为了控制模型的复杂度和防止过拟合,XGBoost引入了正则化项。正则化项包括树的复杂度和叶节点权重的惩罚项,可以限制树的深度和叶节点的权重。
  8. 迭代训练:通过多轮迭代,XGBoost不断优化模型的预测能力,直到达到停止条件(如达到指定的迭代次数、模型在验证集上的性能不再提升等)。
  9. 预测:训练完成后,可以使用XGBoost模型进行预测。对于回归问题,预测值为多个回归树的加权求和;对于分类问题,预测值可以通过使用softmax函数将多个回归树的输出转化为概率。

总之,XGBoost通过迭代训练多个回归树,以梯度下降的方式优化损失函数,通过加权组合多个回归树的预测结果来得到最终的预测值。它通过特定的损失函数近似和正则化技术,提供了一种高效而强大的机器学习算法,适用于回归问题和分类问题。

4.XGBoost的回归树构建流程

XGBoost使用回归树作为基础模型,下面是XGBoost构建回归树的方法:

  1. 划分候选特征:对于每个节点,在训练数据中选择一部分特征作为候选特征。常用的特征选择方法有随机选择、按照特征重要性排序等。
  2. 特征分割点搜索:对于每个候选特征,通过遍历特征的所有可能取值或使用一些启发式算法(如贪婪算法)来搜索最佳的特征分割点。分割点的选择通常基于某种准则(如最小化平方损失、最大化信息增益等)来衡量分割的质量。
  3. 分割节点:根据选定的特征和分割点,将当前节点的训练样本分成左子节点和右子节点。左子节点包含满足分割条件的样本,右子节点包含不满足分割条件的样本。
  4. 终止条件:对每个节点,可以设置一些终止条件来判断是否停止分割节点。常见的终止条件包括树的最大深度、节点包含的最小样本数等。
  5. 递归构建:根据上述步骤,递归地构建子节点,直到满足终止条件为止。这样就得到了一棵完整的回归树。
  6. 正则化:为了控制树的复杂度和防止过拟合,XGBoost引入了正则化项。正则化项包括树的复杂度和叶节点权重的惩罚项,可以限制树的深度和叶节点的权重。
  7. 加权叶节点输出:对于回归问题,XGBoost为每个叶节点分配一个权重,表示该叶节点的输出。这些权重可以通过优化损失函数得到。
  8. 预测:对于新的样本,通过遍历回归树的节点,并根据节点的分割条件判断样本应该进入左子树还是右子树,最终得到叶节点的输出值。预测值可以通过加权叶节点输出的加和来得到。

XGBoost的回归树构建方法与传统的决策树构建方法类似,但引入了正则化和加权叶节点输出的技术来提高模型的泛化能力和预测准确性。通过迭代地构建多个回归树,并使用梯度提升的方式优化模型的预测能力,XGBoost能够在回归问题中取得较好的性能。

5.XGBoost与GBDT的区别

XGBoost(eXtreme Gradient Boosting)与GBDT(Gradient Boosting Decision Tree)都是基于梯度提升树(Gradient Boosting Tree)的算法,它们在原理上有一些相似之处,但也存在一些区别。以下是XGBoost与GBDT的几个主要区别:

  1. 正则化技术:XGBoost引入了正则化项来控制模型的复杂度,包括树的复杂度和叶节点权重的惩罚项。这些正则化项可以通过控制树的深度、叶节点权重等来限制模型的复杂度,防止过拟合。而GBDT通常只使用树的剪枝来进行正则化。
  2. 损失函数的优化:XGBoost使用了二阶泰勒展开来逼近目标函数,并使用近似的方式优化损失函数,提高了模型的拟合能力和训练效率。相比之下,GBDT通常使用一阶泰勒展开来逼近目标函数,并采用贪婪算法进行优化。
  3. 特征分裂策略:XGBoost采用了一种近似的贪婪算法来选择最佳的特征分裂点,同时结合了精确的分位数方法来处理连续特征。这种分裂策略可以提高模型的训练速度。而GBDT通常采用精确的枚举方式来选择最佳的特征分裂点,计算量较大。
  4. 并行计算:XGBoost在训练过程中支持并行计算,可以有效地利用多核CPU进行加速,提高训练速度。而GBDT的训练过程通常是串行的,无法充分利用多核CPU。
  5. 缺失值处理:XGBoost能够自动处理缺失值,无需对缺失值进行特殊处理。而GBDT通常需要对缺失值进行额外处理,如特殊编码或填充。

总体而言,XGBoost在算法设计和实现上对GBDT进行了一系列的改进和优化,包括正则化、近似优化、特征分裂策略、并行计算等方面。这些改进使得XGBoost在训练速度、模型的准确性和泛化能力上都具有一定的优势

二、XGBoost算法API介绍

1.XGBoost的安装
pip3 install xgboost
2.XGBoost参数介绍

xgboost中封装了很多参数,主要由三种类型构成:通用参数(general parameters),Booster参数(booster parameters)和学习目标参数(task parameters)

  • 通用参数:主要是宏观函数控制;
  • Booster参数:取决于选择的Booster类型,用于控制每一步的booster(tree,regression);
  • 学习目标参数:控制训练目标的表现。

通用参数

  • booster:决定使用哪个booster,可以是gbtree,gblinear或者dart,默认值是gbtree。
    • gbtree和dart使用基于树的模型(dart主要多了Dropout),而gblinear使用线性函数。
  • silent:设置为0打印运行信;设置为1静默模式,不打印,默认值是0
  • nthread:并行运行xgboost的线程数,输入的参数要小于等于系统的CPU核心数。默认值是最大可能的线程数。
  • num_pbuffer[xgboost自动设置,不需要用户设置]:预测结果缓存大小,通常设置为训练实例的个数。
  • num_feature[xgboost自动设置,不需要用户设置]:在boosting中使用特征的维度,设置为特征的最大维度

Booster参数

  • Tree Booster 的参数
    • eta(别名 learning_rate):
      • 更新中减少的步长来防止过拟合。
      • 在每次boosting之后,可以直接获得新的特征权值,这样可以使得boosting更加鲁棒。
      • 范围是[0,1],这个参数的默认值为0.3
    • gamma(别名 min_split_loss(分裂最小loss)):
      • 在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。
      • gamma指定了节点分裂所需的最小损失函数下降值。这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。
      • 范围是[0,∞],这个参数的默认值为0
    • max_depth:
      • 这个值为树的最大深度。这个值也是避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。该参数设置为0表示没有最大深度限制。
      • 范围是[0,∞],这个参数的默认值为6
    • min_child_weight:
      • 决定最小叶子节点样本权重和。XGBoost的这个参数是最小样本权重的和。
      • 当它的值较大时,可以避免模型学习到局部的特殊样本。但是这个值过高,很导致欠拟合。通常这个参数的值要通过CV来调整。
      • 范围是[0,∞],这个参数的默认值为1
    • subsample:
      • 这个参数控制对于每棵树,随机采样的比例。
      • 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置的过小,它可能会导致欠拟合。
      • 典型值:[0.5-1],0.5代表平均采样,防止过拟合。
      • 范围是[0,1],这个参数的默认值为1
    • colsample_bylevel:
      • 用来控制树的每一级的每一次分裂,对列数的采样的占比。
      • 范围是[0,1],这个参数的默认值为1
    • lambda(别名 reg_lambda):
      • 权重的L2正则化项(和Ridge regression类似)
      • 这个参数是用来控制XGBoost的正则化部分的。这个参数在减少过拟合上有挺多作用。
      • 默认值为1
    • alpha:
      • 权重的L1正则化项。(和Lasso regression类似)。可以应用在很高维度的情况下,使得算法的速度更快。
      • 默认值为0
    • scale_pos_weight:
      • 在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。通常可以将其设置为负样本数目与正样本数目的比值。
      • 默认值为1
  • Linear Booster的参数:
    • lambda:
      • L2正则化惩罚系数,增加该值会使得模型更加保守。
      • 默认值为0
    • alpha:
      • L1正则化惩罚系数,增加该值会使得模型更加保守。
      • 默认值为0
    • lambda_bias:
      • 偏置上的L2正则化(没有在L1上加偏置,因为不重要)
      • 默认值为0

学习目标参数

  • objective:
    • “reg:linear”:线性回归
    • “reg:logistic”:逻辑回归
    • “binary:logistic”:二分类逻辑回归,输出为概率
    • “multi:softmax”:使用softmax的多分类器,返回预测的类别。在这种情况下,还需要多设一个参数:num_class(类别数目)
    • “multi:softprob”:和"multi:softmax"参数一样,但是返回的是每个数据属于各个类别的概率
    • 默认值为:reg:linear
  • eval_metric:
    • “rmse”:均方根误差
    • “mae”:平均绝对值误差
    • “logloss”:负对数似然函数值
    • “error”:二分类错误率
      • 其值通过错误分类数目与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其他归为负类。
    • “error@t”:不同的划分阈值可以通过t进行设置
    • “merror”:多分类错误率
    • “mlogloss”:多分类log损失
    • “auc”:曲线下的面积
    • 默认值是根据目标函数自己选择
  • seed:
    • 随机数的种子
    • 设置它可以复现随机数据的结果,也可以用于调整参数
    • 默认值为0

三、XGBoost的实现案例

1.案例背景

泰坦尼克号沉没是历史上最臭名昭著的沉船事件之一。这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下去有一些运气因素,但有些人比其他人更容易幸存。例如妇女,儿童和上流社会。在这个案例中,要求完成对哪些人可能存活的分析。特别是,要求运用机器学习工具来预测哪些乘客幸免于悲剧。

我们提到的数据集中的特征包括票的类别,是否存活,乘坐班次,年龄,登陆home.dest,房间船和性别等。

数据:https://hbiostat.org/data/repo/titanic.txt

在这里插入图片描述

经过观察数据得到:

  • 乘坐班是指乘客班(1,2,3),是社会经济阶层的代表
  • 其中age数据存在缺失
2.步骤分析
  1. 获取数据

  2. 数据基本处理

    2.1 确定特征值目标值

    2.2 缺失值处理

    2.3 数据集划分

  3. 特征工程(字典特征抽取)

  4. 机器学习(xgboost)

  5. 模型评估

3.代码实现
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from xgboost import XGBClassifier
import matplotlib.pyplot as plt

# 1.获取数据
titan = pd.read_csv("https://hbiostat.org/data/repo/titanic.txt")
titan.head()

# 2.数据基本处理
# 2.1确定特征值,目标值
x = titan[["pclass","age","sex"]]
y = titan["survived"]

# 2.2缺失值处理
x["age"].fillna(value=titan["age"].mean(),inplace= True)

# 2.3数据集划分
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,random_state=22)

# 3.特征工程--字典类型提取
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4.模型训练(XGBoost)以及模型评估
# 模型初步训练
estimator = XGBClassifier()
estimator.fit(x_train,y_train)
score1 = estimator.score(x_test,y_test)
print("模型初步训练的准确率为:\n",score1)

# 针对max_depth进行模型调优
depth_range = range(10)
score = []
for i in depth_range:
    estimator = XGBClassifier(eta=0.3,gamma=0,max_depth=i)
    estimator.fit(x_train,y_train)
    s = estimator.score(x_test,y_test)
    print(s)
    score.append(s)
    
# 结果可视化
plt.plot(depth_range,score,"r")
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/27683.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

那年我头脑发热,选择了自动化,后来我掉入计算机的世界无法自拔

首先,小雅兰是22届高考考生,而且当时填报志愿也没有填报到计算机相关的专业去,小雅兰是自动化专业的学生,是由于一次偶然的机会,了解到了这个行业,对于写代码所带来的成就感,总之,我…

2023春期末考试选择题R2-9AVL树插入调整详解

题目: 将 8, 9, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? A. 4 和 6 是兄弟 B. 5 是 8 的父结点 C. 7 是根结点 D. 3 和 8 是兄弟 解题要点: 需要对AVL树的4种旋转方式熟悉。 AVL旋转过程: 根据…

人事管理项目-部门数据删除

人事管理项目-部门数据删除 后端实现前端实现 Spring Boot是一个框架,一种全新的编程规范,它的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且烦琐的配置文件,所以Spring Boot是一个服务于框架的框架&…

使用IDEA使用Git:Git使用指北——实际操作篇

Git使用指北——实际操作 🤖:使用IDEA Git插件实际工作流程 💡 本文从实际使用的角度出发,以IDEA Git插件为基座讲述了如果使用IDEA的Git插件来解决实际开发中的协作开发问题。本文从 远程仓库中拉取项目,在本地分支进行开发&…

电路模型和电路定律(3)——“电路分析”

小雅兰期末加油冲冲冲!!! 复习之前的内容: 这样的连接方式是不可以的: 两个电压源,电压值不相同,是不能并联的 两个电流源,电流值不相同,是不能串联的 电流源也不能开…

PoseiSwap的趋势性如何体现?

DEX 代表了一种先进的意识形态,相对于 CEX 其更强调无许可、去中心化以及公开透明。然而随着 DeFi 赛道逐渐从 2021 年年底的高峰逐渐转向低谷,DEX 整体的交易量、TVL等数据指标也开始呈现下滑的趋势,DEX 正在面临发展的新瓶颈期。 在这样的背…

漂亮国因一颗气球而疯狂给质量团队带来的启示

最近漂亮国因为我国的一颗漂洋过海的淘气的民用气球而疯狂。这颗气球成功躲过了号称全球最先进的防空系统,跨越大半个漂亮国,直到被一居民拍照无意间发现,漂亮国才反应过来。多次派战斗机拦截无果,在气球降到15km后,F2…

【云原生】Docker容器服务更新与发现之consul

1.consul的相关知识 1.1 什么是注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0…

day8 栈顶的种类与应用

目录 多寄存器访问指令与寻址方式 多寄存器内存访问指令 多寄存器内存访问指令的寻址方式 ​编辑 栈的种类与使用 栈的概念 栈的分类 栈的应用举例 叶子函数的调用过程举例 多寄存器访问指令与寻址方式 多寄存器内存访问指令 MOV R1, #1 MOV R2, #2 MOV R3, #3 MOV R…

PL2303HXA自2012已停产,请联系供货商的解决办法

一、概述 PL2303 是Prolific 公司生产的一种高度集成的接口转换器,可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利连接的解决方案。PL2303具有多个历史版本,早期的版本是PL2303HX, 近年有PL2303HXA、PL2303HXC、PL2303HXD(D版本…

详解Java中static的使用及其注意事项

1.可以用来修饰的结构: 主要用来修饰类的内部结构 属性、方法、代码块、内部类 2.static修饰属性:静态变量(或类变量) ​ 2.1 属性,是否使用static修饰,又分为:静态属性 vs 非静态属性(实例…

Java中方法的重载与重写

文章目录 前言方法重载方法重写 前言 提示:这里可以添加本文要记录的大概内容: 方法的重载与重写容易混,所以单独拿出来比较 提示:以下是本篇文章正文内容,下面案例可供参考 方法重载 在同一个类中,允…

注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】

目录 一、注解配置AOP 1. 开启注解支持 2. 在类和方法加入注解 3. 测试 4. 为一个类下的所有方法统一配置切点 二、原生Spring实现AOP 1. 引入依赖 2. 编写SpringAOP通知类 3. 编写配置类bean2.xml 4 测试 三、SchemaBased实现AOP 1. 配置切面 2. 测试 往期专栏…

【二十七】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能

springboot篇章整体栏目: 【一】springboot整合swagger(超详细 【二】springboot整合swagger(自定义)(超详细) 【三】springboot整合token(超详细) 【四】springboot整合mybatis…

5.部署LVS-DR群集

文章目录 部署LVS-DR群集LVS-DR数据包流向分析LVS-DR中的ARP问题问题一问题二 LVS-DR部署调度器配置节点服务器配置NFS服务器配置 ipvsadm 部署LVS-DR群集 LVS-DR数据包流向分析 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线…

代码随想录第55天

1.判断子序列: 动态规划五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 注意这里是判断s是否…

OneFormer:规则通用图像分割的一个Transformer

文章目录 OneFormer: One Transformer to Rule Universal Image Segmentation摘要本文方法实验结果 OneFormer: One Transformer to Rule Universal Image Segmentation 摘要 通用图像分割并不是一个新概念。过去统一图像分割的尝试包括场景解析、全景分割,以及最…

spring boot + xxl-job 分布式任务调度

一、介绍 1、任务调度 1.1、什么是任务调度 我们可以先思考一下下面业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某财务系统需要在每天上午10点前结算前一天的账单数据,统计汇总。某电…

chatgpt赋能python:如何在Python中添加空行?

如何在Python中添加空行? 如果你是一个有经验的Python工程师,在编写代码时你可能会遇到需要添加空行的情况。但是有几种方法可以实现这一点,你应该用哪种方法呢?在本文中,我们将探讨如何在Python中添加空行以及各种添…

Lambda表达式与函数式编程

文章目录 函数式编程——Stream流概述为什么学?函数式编程思想 Lambda表达式概述Lambda表达式的前身省略规则 Stream流概述案例数据准备创建流中间操作终结操作reduce归并注意事项 Optional概述创建对象安全消费值获取值安全获取值过滤数据转换 函数式接口常用的默认方法 方法…