集成学习之Boosting方法系列_XGboost

文章目录

    • 【文章系列】
    • 【前言】
    • 【算法简介】
    • 【正文】
      • (一)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_importanceplt.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.mzph.cn/news/657340.shtml

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

相关文章

小程序定制开发:解析定制化移动应用的未来

引言 在当今数字化时代,移动应用已经成为人们生活不可或缺的一部分。随着智能手机的普及,移动应用的需求呈现出爆发式增长,企业们也纷纷投身于这场数字化浪潮。然而,众多企业在竞争激烈的市场中,如何突显个性、提高用…

使用Eclipse搞Android项目报错

相信现在都没什么人还会用Eclipse来开发的了。 不过安装完后,打开Eclipse会提示我的Jdk版本不符合 --------------------------- Incompatible JVM --------------------------- Version 1.8.0_391 of the JVM is not suitable for this product. Version: 17 or g…

python之poetry模块,项目管理

一、简介 Poetry 是一个用于管理 Python 项目依赖关系和构建工具的工具。它提供了一个简单的命令行界面,可以帮助您创建、管理和发布 Python 项目,使用方法:command [options] [arguments] 官网:https://python-poetry.org/docs/…

详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实战(旅游类项目) 📚订阅专栏&#x…

软件设计不是CRUD(11):低耦合模块设计理论——业务抽象:规划模块分层

上一篇文章《软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度》本专题详细讲解了业务抽象的一个重要步骤:提取业务维度。本篇文章内容主要讲解在提取业务维度后,如何对应用程序中初步划分的各个功能模块进行分层规划。 1、为什么要进行模块分…

【lesson2】定长内存池的实现

文章目录 介绍定长内存池的设计定长内存池的实现需要成员变量需要的成员函数定长内存池结构定长内存池Delete(释放空间)的实现定长内存池New(申请空间)的实现 定长内存池的实现完整版 介绍 作为程序员(C/C)我们知道申请内存使用的…

Zookeeper实现分布式队列

目录 Zookeeper分布式队列 普通方式实现 设计思路 具体实现 使用Curator实现 具体实现 注意事项 Zookeeper分布式队列 常见的消息队列有:RabbitMQ,RocketMQ,Kafka等。Zookeeper作为一个分布式的小文件管理系统,同样能实现简单的队列功…

【python】图形化开发pyqt6基本写法模板与基础控件属性方法整理

pyqt6的简介 首先呢Python有许多可以编写图形化界面的库,我们通常跟着教程的话最初会接触的tkinter,但是学习中会发现编写的图形化跟我们平常接触的软件有很大区别(简单来说就是丑)。 pyqt则是第三方库,在Python中算…

ETL怎么实现文件处理

在现代企业及各类组织的日常运作中,数据作为一种关键的信息资源,其管理和分析能力直接影响到决策效率与准确性。文件作为数据的主要载体,承载着从运营报告、客户记录、交易明细等各种类型的数据信息。这些海量且多样的文件数据在未经处理的情…

flask_django基于python的城市轨道交通公交线路查询系统vue

同时,随着信息社会的快速发展,城市轨道交通线路查询系统面临着越来越多的信息,因此很难获得他们对高效信息的需求,如何使用方便快捷的方式使查询者在广阔的海洋信息中查询,存储,管理和共享信息方面有效&…

C语言菜鸟入门·运算符(算数运算符,关系运算符,逻辑运算符,位运算符,赋值运算符,三目运算符)详细介绍

目录 ​编辑 1. 算术运算符 2. 关系运算符 3. 逻辑运算符 4. 位运算符 5. 赋值运算符 6. 杂项运算符 ↦ sizeof & 三元 6.1 sizeof() 6.2 &取地址运算符 6.3 * 6.4 三目运算符 7. 运算符优先级 运算符是一种告诉编译器执行…

ElementUI组件:Link 文字链接

Link 文字链接 点击下载learnelementuispringboot项目源码 效果图 el-link.vue页面效果图 项目里el-link.vue文件代码 <script> export default {name: el_link }</script> <!--https://element.eleme.cn/#/zh-CN/component/link --> <template>&l…

嵌入式学习第十四天

1.结构体&#xff08;2&#xff09;: &#xff08;1&#xff09;结构体类型定义 &#xff08;2&#xff09;结构体变量的定义 &#xff08;3&#xff09;结构体元素的访问 &#xff08;4&#xff09;结构体的存储: 内存对齐: char 按照1字节对齐 …

C# OpenCvSharp DNN Gaze Estimation 视线估计

目录 介绍 效果 模型信息 项目 代码 frmMain.cs GazeEstimation.cs 下载 C# OpenCvSharp DNN Gaze Estimation 介绍 训练源码地址&#xff1a;https://github.com/deepinsight/insightface/tree/master/reconstruction/gaze 效果 模型信息 Inputs ----------------…

医院安全(不良)事件报告系统源码,不良事件处理的全过程管理,实现11大类不良事件类型的报告上报、流转审批、跟踪改进及统计分析功能。

医院安全&#xff08;不良&#xff09;事件报告系统源码&#xff0c;不良事件上报系统源码&#xff0c;PHP源码 医院安全&#xff08;不良&#xff09;事件报告系统提供11大类不良事件的上报、事件审核处理、时间按分析、事件跟踪与持续改进&#xff0c;事件提醒、权限控制、外…

聊聊DoIP吧

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

React通用后台模板

一. 项目初始化 1. 创建项目 环境 npm init vite 打开package.json,参考以下各模块版本: "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", "react-redux": "^7.2.8", …

Security ❀ TCP异常报文详解

文章目录 1. TCP Out-Of-Order2. TCP Previous Segment Lost3. TCP Retransmission4. TCP Dup Ack XXX#X5. TCP Windows Update6. TCP Previous segment not captured7. 异常案例分析 TCP协议中seq和ack seq的联系&#xff1a; id4的http请求报文由客户端发向服务器&#xff0…

sqli-labs-master靶场训练笔记(1-22|新手村)

2024.1.21 level-1 &#xff08;单引号装饰&#xff09; 先根据提示建立一个get请求 在尝试使用单个单引号测试&#xff0c;成功发现语句未闭合报错 然后反手一个 order by 得到数据库共3列&#xff0c;-- 后面加字母防止浏览器吃掉 -- 操作&#xff08;有些会&#xff09…

maven helper 解决jar包冲突方法

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