集成学习之Boosting方法系列_XGboost

news2024/11/24 7:50:14

文章目录

    • 【文章系列】
    • 【前言】
    • 【算法简介】
    • 【正文】
      • (一)XGBoost前身:梯度提升树
      • (二)XGBoost的特点
      • (三)XGBoost实际操作
        • 1. 前期准备
          • (1)数据格式
          • (2)参数设置
        • 2. 实际演示
          • (1)获取数据
          • (2)转换格式
          • (3)设定参数
          • (4)开始训练
          • (5)可视化训练过程
          • 可视化训练过程

【文章系列】

第一章 集成学习_LightGBM————集成学习之Boosting方法系列_LightGBM

第二章 集成学习_XGboost————集成学习之Boosting方法系列_XGboost

第三章 集成学习_CatBoost————集成学习之Boosting方法系列_CatBoost

【前言】

集成学习是一种机器学习方法,通过将多个弱学习器(weak learners)组合成一个更强大的集成模型来提高预测性能和泛化能力。

Boosting 是一种迭代的集成方法,它通过逐步调整训练数据的权重和/或模型的权重来训练多个弱学习器,以便每个弱学习器更关注先前被错误分类的样本。AdaBoost、Gradient Boosting 和 XGBoost 都是 Boosting 的变种。

本文将介绍Boosting方法的其中一种:XGBoost

【算法简介】

XGBoost是一种强大的机器学习算法,它采用梯度提升树的方法,通过集成多个决策树模型来提高预测性能。具有特征重要性评估、正则化、高性能和广泛应用等特点,XGBoost在分类、回归和排名等各种预测任务中表现出色,被广泛应用于数据科学竞赛和实际问题解决中。

【正文】

(一)XGBoost前身:梯度提升树

梯度提升树(Gradient Boosting Trees)是一种集成学习方法,用于解决回归和分类问题。它通过串行构建多个决策树模型来提高预测性能。梯度提升树的主要思想是不断纠正前一个模型的错误,以逐步改进整体模型的性能。

梯度提升树的工作流程如下:

  1. 创建一个简单的基础模型(通常是决策树),这个模型会对数据进行初步拟合。
  2. 计算基础模型的预测值与真实标签之间的残差(错误)。这些残差代表了模型在训练数据上的错误。
  3. 构建一个新的决策树模型,它的目标是减小前一个模型的残差。这个新模型会学习如何将残差映射到更接近真实标签的值。
  4. 重复上述步骤,每次都构建一个新的决策树模型,目标是进一步减小残差,直到达到预定的迭代次数或直到模型性能不再改进为止。
  5. 将所有模型的预测结果组合起来,得到最终的集成模型。

梯度提升树的优点包括:

  • 能够处理各种类型的数据,包括数值型和类别型特征。
  • 具有很强的预测性能,通常能够取得竞赛和实际问题中的良好结果。
  • 可以估计特征的重要性,帮助特征选择和理解问题。
  • 可以通过调整超参数来控制模型的复杂度,从而避免过拟合。

梯度提升树的一些流行实现包括XGBoost、LightGBM和CatBoost,它们在不同情况下都具有优势,并在机器学习和数据科学领域广泛应用。


(二)XGBoost的特点

  1. 高性能: XGBoost的实现经过了高度优化,能够高效处理大规模数据集,具有较快的训练和预测速度。这使得它在大数据环境中非常有用。
  2. 梯度提升框架: XGBoost采用梯度提升算法,通过迭代构建一系列的决策树模型,逐步减小模型的预测误差,从而提高模型性能。
  3. 正则化: XGBoost支持L1(Lasso正则化)和L2(Ridge正则化)正则化技术,以帮助减少模型的过拟合风险。这有助于提高模型的泛化能力。
  4. 特征重要性评估: XGBoost能够估计输入特征的重要性,帮助用户识别哪些特征对于模型性能最关键。这有助于特征选择和问题理解。
  5. 并行计算: XGBoost支持并行计算,可以利用多核CPU进行训练和预测,从而进一步提高性能。
  6. 灵活性: XGBoost适用于分类、回归和排名任务,并支持多分类问题。此外,它允许用户自定义损失函数,以适应各种问题。
  7. 广泛应用: XGBoost在数据科学竞赛和实际应用中表现出色,常常在分类、回归、排名、异常检测等各种预测建模任务中取得顶级成绩。

(三)XGBoost实际操作

1. 前期准备
(1)数据格式

对于分类和回归任务,XGBoost的输入通常是一个矩阵,其中每行代表一个样本,每列代表一个特征。以下是一般的输入格式:

  • 特征矩阵:一个二维矩阵,包含了所有的训练样本和它们的特征。每行是一个样本,每列是一个特征。特征可以是数值型特征或类别型特征,但通常需要进行特征编码,例如独热编码,以便模型能够处理。
  • 标签向量:一个一维向量,包含与每个训练样本相关联的目标变量的值。对于分类问题,目标变量通常是类别标签(整数),而对于回归问题,目标变量是连续数值。

示例代码(Python):

import xgboost as xgb

# 特征矩阵
X = [[feature1, feature2, ...],
     [feature1, feature2, ...],
     ...
    ]

# 标签向量
y = [label1, label2, ...]

# 创建DMatrix对象
dtrain = xgb.DMatrix(X, label=y)
(2)参数设置

类似于LightGBM的参数设置:

  • config, 默认值为空,配置文件的路径

  • 任务参数

    • task, 默认值为train,可选项有:train, predict, convert_model

      • train, alias=training, for training

      • predict, alias=prediction, test, for prediction.

      • convert_model, 要将模型文件转换成 if-else 格式

    • objective, (优化目标),默认值为regression, 可选项有:regression, regression_l1, huber, fair, poisson, quantile, quantile_l2, binary, multiclass, multiclassova, xentropy, xentlambda, lambdarank

      • 回归问题

        regression_l2, L2 loss, alias=regression, mean_squared_error, mse

        regression_l1, L1 loss, alias=mean_absolute_error, mae

        huber, Huber loss

        fair, Fair loss

        poisson, Poisson regression

        quantile, Quantile regression

        quantile_l2, 类似于 quantile, 但是使用了 L2 loss

      • binary, 二元分类的交叉熵损失

      • 多元分类问题

        multiclass, softmax 目标函数, 应该设置好 num_class

        multiclassova, One-vs-All 二分类目标函数, 应该设置好 num_class

      • 交叉熵损失

        xentropy, 目标函数为 cross-entropy (同时有可选择的线性权重), alias=cross_entropy

        xentlambda, 替代参数化的 cross-entropy, alias=cross_entropy_lambda

        标签是 [0, 1] 间隔内的任意值

      • lambdarank, 排序问题的学习算法

        在 lambdarank 任务中标签应该为 int type, 数值越大代表相关性越高 (e.g. 0:bad, 1:fair, 2:good, 3:perfect)

        label_gain 可以被用来设置 int 标签的增益 (权重)

    • reg_alpha:用于设置L1的正则化参数

    • reg_lambda:用于设置L2的正则化参数

  • 训练参数

    • boosting, (提升类型),默认值为gbdt, 可选项有:gbdt, rf, dart, goss, alias=boost, boosting_type

      • gbdt, 传统的梯度提升决策树
      • rf, Random Forest (随机森林)
      • dart, Dropouts meet Multiple Additive Regression Trees(Dropout 与多个加法回归树的结合)
      • goss, Gradient-based One-Side Sampling (基于梯度的单侧采样)
    • data, 默认值为"",代表训练数据, LightGBM 将会使用这个数据进行训练

    • valid, 默认值为"",验证/测试 数据, LightGBM 将输出这些数据的度量

      • 支持多验证数据集, 以 , 分割
    • num_iterations,默认值为100,代表boosting 的迭代次数

      • Note: 对于 Python/R 包, 这个参数是被忽略的, 使用 train and cv 的输入参数 num_boost_round (Python) or nrounds ® 来代替
      • Note: 在内部, LightGBM 对于 multiclass 问题设置 num_class * num_iterations 棵树
    • learning_rate,(学习率),默认值为0.1

      • shrinkage rate (收缩率)
      • 在 dart 中, 它还影响了 dropped trees 的归一化权重
    • bagging_seed:随机采样的种子,用于确保可复现性

    • bagging_fraction:每次迭代中随机选择的样本比例,用于减少过拟合风险

    • bagging_freq:随机采样的频率,每隔多少次进行一次随机采样

    • feature_fraction:每次迭代中随机选择的特征比例,用于减少过拟合风险

    • metric:模型评估指标

  • 树的参数

    • num_leaves, 默认值为31, 每棵树上的最大叶子数
    • min_child_samples(叶子节点最小样本数):叶子节点上所需的最小样本数,用于控制叶子节点的分裂。
    • max_depth:树的最大深度,设置为-1表示不限制树的深度
    • tree_learner,默认值为serial, 可选项有:serial, feature, data, voting, alias=tree
      • serial, 单台机器的 tree learner
      • feature, alias=feature_parallel, 特征并行的 tree learner
      • data, alias=data_parallel, 数据并行的 tree learner
      • voting,alias=voting_parallel, 投票并行的 tree learner
  • 性能设置

    • num_threads, 默认值为OpenMP_default, type=int, LightGBM 的线程数

      • 为了更快的速度, 将此设置为真正的 CPU 内核数, 而不是线程的数量 (大多数 CPU 使用超线程来使每个 CPU 内核生成 2 个线程)
      • 当你的数据集小的时候不要将它设置的过大 (比如, 当数据集有 10,000 行时不要使用 64 线程)
      • 请注意, 任务管理器或任何类似的 CPU 监视工具可能会报告未被充分利用的内核. 这是正常的
      • 对于并行学习, 不应该使用全部的 CPU 内核, 因为这会导致网络性能不佳
    • device, 默认为cpu, 可选项有:cpu, gpu

      • 为树学习选择设备, 你可以使用 GPU 来获得更快的学习速度
      • Note: 建议使用较小的 max_bin (e.g. 63) 来获得更快的速度
      • Note: 为了加快学习速度, GPU 默认使用32位浮点数来求和. 你可以设置 gpu_use_dp=true 来启用64位浮点数, 但是它会使训练速度降低
2. 实际演示
(1)获取数据

以UCI Raisin数据集为例

导入相关包

import numpy as np
import pandas as pd
from ucimlrepo import fetch_ucirepo
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb  # 导入XGBoost库
import matplotlib.pyplot as plt

获取UCI Raisin数据集

# fetch dataset 
raisin = fetch_ucirepo(id=850) 
  
# data (as pandas dataframes) 
train = raisin.data.features 
label = raisin.data.targets 
  
# metadata 
print(raisin.metadata) 
  
# variable information 
print(raisin.variables) 

查看输入属性与输出属性

train.info()

image-20240123121925937

label.info()

image-20240123121937371

对object数据类型,进行字典编码

def change_object_cols(se):
    value = se.unique().tolist()
    value.sort()
    return se.map(pd.Series(range(len(value)), index=value)).values
label['Class'] = change_object_cols(label['Class'])
label.info()

image-20240123122037369

全部转换为0、1编码

label['Class'].values

image-20240123122152375

(2)转换格式
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(train, label, test_size=0.3, random_state=0)

# 将标签向量转换为一维数组
y_train = y_train.values.ravel()
y_test = y_test.values.ravel()

# 创建XGBoost训练和测试数据集
dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test, label=y_test)
(3)设定参数

此数据集是二分类数据集,因此objective设置为’binary’,metric评估指标设置为‘binary_logloss’,使用‘gbdt’方法进行训练。

# 定义XGBoost的参数
params = {
    'objective': 'binary:logistic',  # 适用于二分类问题
    'max_depth': 8,                 # 决策树深度
    'learning_rate': 0.03,          # 学习率
    'eval_metric': 'logloss',       # 评估指标
    'num_leaves': 6,                # 树的叶子节点数
    'subsample': 0.8,               # 每次迭代时用于训练的子样本比例
    'colsample_bytree': 0.8,        # 每次迭代时用于训练的特征比例
    'early_stopping_rounds': 20     # 提前停止的轮数,如果验证误差不再下降
}
(4)开始训练

eval_result用于存放每次迭代过程的损失函数值,用于可视化训练过程。

# 训练XGBoost模型
eval_result = {}  # 用于存储评估结果
bst = xgb.train(params, dtrain, evals=[(dtrain, "train"), (dtest, "test")], evals_result=eval_result)

image-20240128110835010

(5)可视化训练过程
可视化训练过程
  • 特征重要程度
from xgboost import plot_importance

plt.rcParams["figure.figsize"] = (14, 8)
plot_importance(bst)

image-20240128111420312

  • 树可视化
xgboosts = xgb.to_graphviz(bst)
xgboosts.format = 'png'
xgboosts.render('./xgboost')  # 将图形保存为'./xgboost.png'

xgboost

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Banana Pi BPI-R4开发板实现5G上网、Wi-Fi AP、文件共享和Docker服务

转载:本文出处https://think8848.cnblogs.com和作者: think8848 本文目的:记录近一个月以来折腾BPI-R4的过程,为后面可能的学习提供参考资料,此外也把折腾中踩过的坑发出来,让更多研究BPI-R4的筒子们少踩坑。 一、需求…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤: 开机,指示灯亮起后(需要灯闪烁3下后),需在3s内(超过3s则会正常启动),按一下按键(注:切…

大数据学习之Redis,十大数据类型的具体应用(一)

目录 3. 数据类型命令及落地应用 3.1 备注 3.2 Redis字符串(String) 单值单value 多值操作 获取指定区间范围内的值 数值增减 获取字符串长度和内容追加 分布式锁 getset(先get后set) 3.3 Redis列表(List) 简单说明 …

网络协议与攻击模拟_11DHCP欺骗防护

开启DHCP 监听 ip dhcp snooping 指定监听vlan ip dhcp snooping vlan 1 由于开启监听后,交换机上的接口就全部变成非信任端口, 非信任端口会拒绝DHCP报文,会造成正常的DHCP请求和响应都无法完成。 现在是请求不到IP地址的,…

2023美赛A题之Lotka-Volterra【完整思路+代码】

这是2023年的成功,考虑到曾经付费用户的负责,2024年可以发出来了。去年我辅导队伍数量:15,获奖M为主,个别F,H,零S。言归正传,这里我开始分享去年的方案。由于时间久远,我…

IDEA2023打开新项目默认SDK变成了17

问题描述 项目安装了2个sdk版本,jdk8和jdk17 自从升级IDEA版本到2023以后,每次打开新项目,sdk都被默认选择成了jdk17, 每次都得手动修改 (File--Project Structure),超级麻烦。 没有用的解决方法 以下这…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归: 举例:蝉(昆虫物种&…

设计模式篇---备忘录模式

文章目录 概念结构实例总结 概念 备忘录模式:在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,像这样可以在以后将对象恢复到原先保存的状态。 就好比我们下象棋,下完之后发现走错了,想要回退…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点:不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

ONLYOFFICE:兼顾协作与安全的开源办公套件

文章目录 前言ONLYOFFICE是什么?ONLYOFFICE的特点多人在线协同灵活集成安全可靠跨平台和设备扩展丰富 实操注册登录编写文档插件安装智谱CopilotDraw.io 新版强势功能显示协作者头像插件 UI 界面更新 总结 前言 随着数字化时代的到来,越来越多的文档处理…

第38期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

Redis核心技术与实战【学习笔记】 - 7.Redis GEO类型 - 面向 LBS 应用的数据类型

前言 前面,介绍了 Redis 的 5 大基本数据类型:String、List、Hash、Set、Sorted Set,它们可以满足绝大多数的数据存储需求,但是在面对海里数据统计时,它们的内存开销很大。所以对于一些特殊的场景,它们是无…

Java笔记 --- 四、异常

四、异常 Java.lang.Throwable Error Exception(异常) 异常的作用 异常的处理方式 JVM默认的处理方式 捕获异常(自己处理) try里面没有出现异常,就不会运行catch里面的代码 如果出现多个异常,需要多个c…

山石防火墙安装使用

山石虚拟防火墙,可以安装在vmware workstation上 安装步骤: 1、新建虚拟机,选择典型。 2、稍后安装 3、操作系统版本选择“Other Linux 3.x kernel 64-bit”。 4、配置虚拟机名称和位置 5、自定义硬盘容量 6、点击自定义硬件 7、此处可以选…

Python编辑开发 --- pycharm pro 中文

PyCharm Pro是一款专业的Python集成开发环境(IDE),由JetBrains公司开发。它为Python开发者提供了丰富的功能和工具,使得Python编程变得更加高效和便捷。PyCharm Pro具有智能代码编辑功能,能够自动完成代码、快速导航至…

爆了!sealos 三天时间支持 1000 个帕鲁私服

Sealos 的帕鲁私服模板从第一天发布之后就起了 100 多个私服,第二天直接上到 500 多个,第三天直接上千,还在加速增长中。来讲讲我们只用一个晚上怎么做到上线一个专属可用区的,还有一些帕鲁实践让我对云有的一些新的思考。 Sealos…

2024年AI全景:趋势、预测和可能性

欢迎来到 2024 年人工智能和技术的可能性之旅。 在这里,每一个预测都是一个潜在的窗口,通向充满创新、变革、更重要的是类似于 1950 年代工业革命的未来。 20 世纪 50 年代见证了数字计算的兴起,重塑了行业和社会规范。 如今,人工…

第二十回 虔婆醉打唐牛儿 宋江怒杀阎婆惜-FreeBSD改变分区大小

阎婆找到宋江,劝宋江和阎婆惜和解。 宋江无奈跟阎婆惜喝酒,想趁阎婆下楼之机离开,但被阎婆用门锁拦住。宋江无奈留宿,但是两人还是不愉快,宋江五更天就起来了。 宋江走的匆忙,没有带招文袋。阎婆惜拿到招文…

maven helper 解决jar包冲突方法

一 概要说明 1.1 说明 首先,解决idea中jar包冲突,使用maven的插件:maven helper插件,它能够给我们罗列出来同一个jar包的不同版本,以及他们的来源,但是对不同jar包中同名的类没有办法。 1.2 依赖顺序 …

动态住宅IP可以用来注册亚马逊电商吗?

注册亚马逊店铺可以用动态IP,只要是独立且干净的网线就没问题,亚马逊规则要求一个IP地址只能出现一个亚马逊店铺,若使用不当会导致关联账户。所以现在非常多人使用指纹浏览器搭配代理IP 固定ip可以给我们的账户带来更多的安全,要知…