集成学习之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_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

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

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

相关文章

(2)(2.10) LTM telemetry

文章目录 前言 1 协议概述 2 配置 3 带FPV视频发射器的使用示例 4 使用TCM3105的FSK调制解调器示例 前言 轻量级 TeleMetry 协议 (LTM) 是一种单向通信协议(从飞行器下行的数据链路),可让你以低带宽/低波特率(通常为 2400 波…

Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导

文章目录 1. 背景基础知识1.1 什么是状态空间模型(State Space Model,SSM)?1.2 什么是离散化(Discretization)?1.3 为什么需要离散化? 2. SSM离散化过程推导2.1 为什么在离散化过程中…

Windows断开映射磁盘提示“此网络连接不存在”,并且该磁盘直在资源管理器中

1、打开注册表编辑器 快捷键winR 打开“运行”, 输入 regedit 2、 删除下列注册表中和无法移除的磁盘相关的选项 \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\ 3、打开“任务管理器”,重新启动“Windows资源…

vue3源码(三)computed

1.功能 接受一个 getter 函数,并根据 getter 的返回值返回一个不可变的响应式 ref 对象。 默认不执行,在取值时执行,具有缓存功能,数据不变多次取值只触发一次取值计算。 import {reactive,effect,computed,} from "/node_…

蓝桥杯AT24C02问题记录

问题1:从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样,第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS;nop()要延时1个指令周期。延时时间不对会对时序产生影响,时序不对,则AT24C02有没被使用…

大数据分析案例-基于随机森林算法构建电影票房预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

nginx 编译安装sticky时报错处理

一般企事业单位的内网按照部门划分网段,ip hash 的负载均衡策略容易导致负载失衡,比如某个网段地址多,一些网段地址少,IP hash是基于IPv4地址的前三段来区分的(开发者可能觉得机器处理区分所有IP太累么?配置…

医院如何筛选安全合规的内外网文件交换系统?

医院内外网文件交换系统是专为医疗机构设计的,用于在内部网络(内网)和外部网络(外网)之间安全、高效地传输敏感医疗数据和文件的解决方案。这种系统对于保护患者隐私、遵守医疗数据保护法规以及确保医疗服务的连续性和…

牛客网-----------[NOIP2006]数列

题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k3时,这个序列是: 1,3,4,9,10,12,13&…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制,使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合,如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…

【大数据安全】大数据安全的挑战与对策基础设施安全

目录 一、大数据安全的挑战与对策 (一)数据加密技术 (二)大数据安全与隐私 (三)大数据安全保障体系 (四)华为大数据安全解决方案 二、基础设施安全 (一&#xff0…

TCP/IP网络模型

大家好我是苏麟 , 今天聊聊TCP/IP四层网络模型 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 应用层 最上层的,也是我们能直接接触到的就是应用层(Application Layer),我们电脑或手机使用的应用软件都…

Cloudera Manager 安装 Kafka 并简单使用

Kafka 简介 kafka 是一款分布式消息发布和订阅的系统,具有高性能和高吞吐率。 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理&#…

CCF-CSP 202312-1 仓库规划(Java、C++、Python)

文章目录 仓库规划问题描述输入格式输出格式样例输入样例输出子任务 满分代码JavaCPython 仓库规划 问题描述 西西艾弗岛上共有 n n n 个仓库, 依次编号为 1 ⋯ n 1 \cdots n 1⋯n 。每个仓库均有一个 m m m 维向量的位置编码, 用来表示仓库间的物流运转关系。 具体来说,…

uni-app小程序自定义导航栏

最近在开发一个uni-app小程序,用到了自定义导航栏,在这里记录一下实现过程: page.json 在对应页面路由的style中设置入"navigationStyle": "custom"取消原生导航栏,自定义导航栏 {"path": "…

企业级大模型的护城河:RAG + 微调

围绕LLM的炒作是前所未有的,但这是有道理的,生成式 AI 有潜力改变我们所知道的社会。 在很多方面,LLM将使数据工程师变得更有价值——这令人兴奋! 不过,向老板展示数据发现工具或文本到 SQL 生成器的炫酷演示是一回事…

flutter+go构建的即时通讯app,ChatCraft

前言 Hi👋all.好久不见,已经两个多月没有发文章了,这段时间一直在反思过去的一年,有好有坏。对博客文章这块我对自己是不满意的,文章的质量参差不齐,有时候在没有好的题材时,我会选择写一些泛泛…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式(脚本语法) 2.…

【VS Code+Verilog+Vivado使用】(2)基本设置

文章目录 2 基本设置2.1 字体大小2.2 Tab大小2.3 选中高亮2.4 文件编码 2 基本设置 2.1 字体大小 方法1:VS Code左下角 > 管理 > 设置,搜索"font size",点击左侧"字体",根据需要设置"editor.fon…

【乳腺肿瘤诊断分类及预测】基于LVQNN学习向量量化神经网络

课题名称:基于LVQ神经网络的乳腺肿瘤诊断(类型分类) 版本日期:2023-03-10 运行方式: 直接运行0501_LVQ0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院…