20- Xgboost 算法参数最优化 (集成算法) (算法)

news2024/9/28 5:25:36

Xgboost 方式一

from xgboost import XGBClassifier
model = XGBClassifier(
    learning_rate =0.1, # 学习率,控制每次迭代更新权重时的步长,默认0.3。值越小,训练越慢
    use_label_encoder=False,
    n_estimators=10,   # 总共迭代的次数,即决策树的个数
    max_depth=5,       # 深度
    min_child_weight=1,  # 默认值为1,。值越大,越容易欠拟合;值越小,越容易过拟合
    gamma=0,        # 惩罚项系数,指定节点分裂所需的最小损失函数下降值。
    # 训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。防止overfitting
    subsample=0.8,  
    colsample_bytree=0.8,
    objective= 'binary:logistic',  # 目标函数
    eval_metric = ['merror'],  # 验证数据集评判标准
    nthread=4,)    # 并行线程数
eval_set = [(X_test, y_test),(X_train,y_train)]
model.fit(X_train,y_train,eval_set = eval_set,verbose = True)

Xgboost 方式二

import xgboost as xgb
param = {'learning_rate':0.1, 'n_estimators':10,
         'max_depth':5,'min_child_weight':1,'gamma':0,'subsample':0.8,
         'colsample_bytree':0.8, 'verbosity':0,'objective':'multi:softprob'}
model = xgb.XGBClassifier(**param)
model.fit(X_train, y_train, early_stopping_rounds=20, eval_metric='merror',
        eval_set=[(X_test, y_test)])

Xgboost 方式三

import xgboost as xgb
dtrain = xgb.DMatrix(data = X_train,label = y_train)
dtest = xgb.DMatrix(data = X_test,label = y_test)
param = {'learning_rate':0.1,'use_label_encoder':False,'n_estimators':20,
         'max_depth':5,'min_child_weight':1,'gamma':0,'subsample':0.8,
         'eval_metric':['merror','mlogloss'],'colsample_bytree':0.8, 
         'verbosity':0,'objective':'multi:softmax','num_class':3 }
num_round = 10
evals = [(dtrain,'train'),(dtest,'eval')]

bst = xgb.train(param, dtrain, num_round,evals = evals,)
y_ = bst.predict(dtest)
display(y_,accuracy_score(y_test,y_))   # 0.9722222222222222

算法差异:

  1. 传统GBDT以CART(gini系数进行裂分的决策树)作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  2. (经过GBDT推导,目前GBDT也是二阶导数)传统GBDT在优化时只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,XGBoost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  3. XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。正则降低了模型的方差,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
  4. Shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)
  5. 列抽样(column subsampling)。XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性。
  6. 对缺失值的处理。对于特征的值有缺失的样本,XGBoost可以自动学习出它的分裂方向。
  7. XGBoost工具支持并行。boosting不是一种串行的结构吗? 怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的。(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分点),XGBoost 在训练之前,预先对数据进行了排序,然后保存为Block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个Block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。


1、Xgboost介绍

1.1、Xgboost概述

XGBoost 是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。

1.2、青出于蓝

说到XGBoost,不得不提GBDT(Gradient Boosting Decision Tree)。因为XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。两者都是boosting方法。

2、Xgboost树的定义

2.1、构造决策树

先来举个例子,我们要预测一家人对电子游戏的喜好程度,考虑到年轻和年老相比,年轻更可能喜欢电子游戏,以及男性和女性相比,男性更喜欢电子游戏,故先根据年龄大小区分小孩和大人,然后再通过性别区分开是男是女,逐一给各人在电子游戏喜好程度上打分,如下图所示。

 2.2、决策树集成

就这样,训练出了2棵树tree1和tree2,类似之前gbdt的原理,两棵树的结论累加起来便是最终的结论,所以小孩的预测分数就是两棵树中小孩所落到的结点的分数相加:2 + 0.9 = 2.9。爷爷的预测分数同理:-1 + (-0.9)= -1.9。具体如下图所示:

 事实上,如果不考虑工程实现、解决问题上的一些差异,XGBoost与GBDT比较大的不同仅仅在于目标函数的定义

3、Xgboost目标函数

3.1、目标函数方程

对于Boosting算法我们知道,是将多个弱分类器的结果结合起来作为最终的结果来进行输出。​\small f_t(x_i) 为第 t 棵树的输出结果, \small \hat{y}_i^{(t)} ​是模型当前的输出结果,​​ 是实际的结果。

那么:

\small \hat{y}_i^{(t)} = \sum\limits_{t=1}^t f_{t}(x_i)

\small \hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + f_t(x_i)

XGBoost的目标函数如下图所示:

\small Obj^{(t)} = \sum\limits_{i = 1}^nl(y_i,\hat{y}_i) + \sum\limits_{i =1}^t\Omega(f_t)

  • 训练损失 :

        \small \sum\limits_{i = 1}^nl(y_i,\hat{y}_i)

  • 常见损失函数 :

    

  • 树的复杂度

        \small \sum\limits_{i =1}^t\Omega(f_i)

  • Xgboost包含多棵树,定义每棵树的复杂度:

        \small \Omega(f) = \gamma T + \frac{1}{2}\lambda \sum\limits_{j=1}^T w_j^2

  • ​​ \small \sum\limits_{i=1}^{t-1}\Omega(f_i)为前 t-1 棵树的复杂度,是常数项,求导时可忽略。目标函数简化为:

        \small Obj^{(t)} = \sum\limits_{i=1}^nl\left(y_i,\hat{y}_i^{t-1} + f_t{(x_i})\right) + \Omega(f_t)

3.2、目标函数泰勒展开

泰勒展开近似目标函数:

\small f(x + \Delta x) \approx f(x) + f'(x)\Delta x + \frac{1}{2}f''(x)\Delta x^2

\small Obj^{t} \approx \sum\limits_{i=1}^n\left[ l(y_i,\hat{y}_i^{(t-1)}) + g_if_t(x_i) + \frac{1}{2}h_if^2_t(x_i)\right] + \Omega(f_t)

  • 方程中的 ​​​\small l 即为损失函数(比如平方损失函数:\small l(y_i,\hat{y_i}) = (y_i - \hat{y_i})^2​​​,或者交叉熵Log-loss

  • ​​\small \Omega(f_t) 的是正则项(包括L1正则、L2正则),防止过拟合,鲁棒性加强。

  • 对于 f(x),XGBoost利用二阶泰勒展开三项,做一个近似。f(x)表示的是其中一颗回归树。

由于在第 t​ 步时 \small \hat{y}_i^{(t-1)} ​其实是一个已知的值,所以 ​​\small l(y_i,\hat{y}_i^{(t-1)}) 是一个常数,其对函数的优化不会产生影响。因此,去掉全部的常数项,得到目标函数为:

        \small Obj^{t} \approx \sum\limits_{i=1}^n\left[g_if_t(x_i) + \frac{1}{2}h_if^2_t(x_i)\right] + \Omega(f_t)

所以我们只需要求出每一步损失函数的一阶导和二阶导的值(由于前一步的 \small \hat{y}^{(t-1)}​ 是已知的,所以这两个值就是常数),然后最优化目标函数,就可以得到每一步的 \small f(x)​ ,最后根据加法模型得到一个整体模型。

3.3、定义一棵树

我们重新定义一颗树,包括两个部分:

  • 叶子结点的权重向量 ​;

  • 实例 ---> 叶子结点的映射关系q(本质是树的分支结构);

3.4、定义树的复杂度

我们定义一颗树的复杂度 \small \Omega​,它由两部分组成:

  • 叶子结点的数量;

  • 叶子结点权重向量的L2范数;

 

3.5、叶子结点归组

我们将属于第 j 个叶子结点的所有样本 xi , 划入到一个叶子结点样本集中,数学表示如下:

\small I_j = {i|q(x_i) == j}

3.6、树结构打分

回忆一下高中数学知识。假设有一个一元二次函数,形式如下:

 \small Gx + \frac{1}{2}Hx^2, H > 0

我们可以套用一元二次函数的最值公式轻易地求出最值点:

上图给出目标函数计算的例子,求每个节点每个样本的一阶导数 ​ 和二阶导数 ​ ,然后针对每个节点对所含样本求和得到 ​ 和 ​​ ,最后遍历决策树的节点即可得到目标函数。

4、Xgboost模型使用

4.1、模型基本使用

4.1.1、使用方式一

import numpy as np
import xgboost as xgb
from xgboost import XGBClassifier
from sklearn import datasets
from sklearn import tree
from sklearn.model_selection import train_test_split
X,y = datasets.load_wine(return_X_y=True)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
model = XGBClassifier(
    learning_rate =0.1, # 学习率,控制每次迭代更新权重时的步长,默认0.3。值越小,训练越慢
    use_label_encoder=False,
    n_estimators=10,   # 总共迭代的次数,即决策树的个数
    max_depth=5,       # 深度
    min_child_weight=1,  # 默认值为1,。值越大,越容易欠拟合;值越小,越容易过拟合
    gamma=0,        # 惩罚项系数,指定节点分裂所需的最小损失函数下降值。
    # 训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。防止overfitting
    subsample=0.8,  
    colsample_bytree=0.8,
    objective= 'binary:logistic',  # 目标函数
    eval_metric = ['merror'],  # 验证数据集评判标准
    nthread=4,)    # 并行线程数
eval_set = [(X_test, y_test),(X_train,y_train)]
model.fit(X_train,y_train,eval_set = eval_set,verbose = True)
model.score(X_test,y_test)     # 0.9722222222222222

4.1.2、使用方式二:

X,y = datasets.load_wine(return_X_y=True)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)
param = {'learning_rate':0.1,'n_estimators':10,
         'max_depth':5,'min_child_weight':1,'gamma':0,'subsample':0.8,
         'colsample_bytree':0.8, 'verbosity':0,'objective':'multi:softprob'}
model = xgb.XGBClassifier(**param)
model.fit(X_train, y_train, early_stopping_rounds=20, eval_metric='merror',
        eval_set=[(X_test, y_test)])
model.score(X_test,y_test) 

4.1.3、使用方式三

DMatrix是XGBoost中使用的数据矩阵。DMatrix是XGBoost使用的内部数据结构,它针对内存效率和训练速度进行了优化 。

import xgboost as xgb
from sklearn.metrics import accuracy_score
X,y = datasets.load_wine(return_X_y=True)
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

# 创建数据
dtrain = xgb.DMatrix(data = X_train,label = y_train)
dtest = xgb.DMatrix(data = X_test,label = y_test)
# 指定参数
param = {'learning_rate':0.1,'use_label_encoder':False,'n_estimators':20,
         'max_depth':5,'min_child_weight':1,'gamma':0,'subsample':0.8,
         'eval_metric':['merror','mlogloss'],'colsample_bytree':0.8, 
         'verbosity':0,'objective':'multi:softmax','num_class':3 }
num_round = 10
evals = [(dtrain,'train'),(dtest,'eval')]
bst = xgb.train(param, dtrain, num_round,evals = evals,)
# 进行预测
y_ = bst.predict(dtest)
display(y_,accuracy_score(y_test,y_))   # 0.9722222222222222

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

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

相关文章

英特尔研究院探索负责任的生成式AI,让AI应用真正惠及大众

ChatGPT的爆火让AI再次成为大众热议的焦点,作为英特尔所提出的搭建起从模拟时代到数字时代桥梁的五大“超级技术力量”之一,伴随着无处不在的智能化,AI可将无穷的数据转化为切实可行的洞察。作为半导体行业的领先企业,在这一前沿技…

Windows系统从权限维持角度进行应急响应

一、基本介绍 红队攻击者在对目标进行渗透利用后通常都会进行权限维持,以达到持续利用的目的。而作为防守方进行应急响应时,应该如何与技术高超(jiaohuajianzha)的攻击者斗智斗勇呢?或许可以通过本文可以找到答案。以…

企业小程序开发步骤【教你创建小程序】

随着移动互联网的兴起,微信已经成为了很多企业和商家必备的平台,而其中,微信小程序是一个非常重要的工具。本文将为大家介绍小程序开发步骤,教你创建小程序。 步骤一、注册小程序账号 先准备一个小程序账号,在微信公…

ROS从入门到精通5-5:局部路径规划插件开发案例(以DWA算法为例)

目录0 专栏介绍1 局部规划插件制作框架2 DWA算法源码分析2.1 全局路径裁剪2.2 更新局部代价2.3 运行DWA算法2.3.1 构造动态窗口2.3.2 生成最优轨迹2.4 终点规划3 算法测试0 专栏介绍 本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机…

区块链知识系列 - 系统学习EVM(四)-zkEVM

区块链知识系列 - 系统学习EVM(一) 区块链知识系列 - 系统学习EVM(二) 区块链知识系列 - 系统学习EVM(三) 今天我们来聊聊 zkEVM、EVM 兼容性 和 Rollup 是什么? 1. 什么是 Rollup rollup顾名思义,就是把一堆交易卷(rollup)起来…

oracle官方下载历史版本JDK版本

背景 日常工作中由于一些特殊原因,我们需要下载指定系统指定位数指定版本的jdk,这个时候去网上搜索下载就会遇到各种坑,病毒、诱导连接、诱导关注/注册、付费、错误版本等,所以最好的办法是去官网下载,下面列举两种方式…

Allegro中如何删除多余D码操作指导

Allegro中如何删除多余D码操作指导 用Allegro做PCB设计的时候,在最后输出生产文件的时候,必须清除多余的D码,不让多余的D码出现在D码文件中,类似下图 如何清除多余D码,具体操作如下 点击Tools点击Padstack

WIN11/win10+Azure Kinect DK详细驱动配置教程(亲测)

本人3000多大洋 买了一台 Azure Kinect DK设备,打算研究研究人体姿态。今天配置一下,网上的教程不少,有的过期教程,有的和我的不匹配,所以,只能参考他们的,取其精华 去其糟粕。下面 开始,这里先…

C#.Net正则表达式学习笔记

C#.Net正则表达式学习笔记 在处理字符串时,你会经常有查找符合特定条件的字符串的需求,比如判断一串电话号码是否符合格式、一个邮箱是否符合格式、一个密码是否包含了字母大小写等等。 正则表达式(Regular expressions)用于匹配文本,使用一…

[2023]自动化测试框架完整指南

所有软件在提供给用户之前都必须经过测试。软件测试是开发生命周期中必不可少的一步因为它确保用户必须收到符合其开发目的的高质量产品。每个企业都优先考虑测试;因此,大多数人更愿意从手动测试转向自动化。因此,自动化测试框架是任何软件测试过程的基础…

redis 分布式缓存、主从集群

目录分布式缓存1.Redis持久化1.1.RDB持久化RDB原理1.2.AOF持久化1.3.RDB与AOF对比2.Redis主从2.1.搭建主从架构2.2.主从数据同步原理2.2.1.全量同步2.2.2.增量同步2.2.3.repl_backlog原理2.3.主从同步优化方式2.4.全量同步和增量同步区别3. Redis哨兵3.1 集群监控原理3.2 集群故…

powerjob的worker启动,研究完了这块代码之后我发现了,代码就是现实中我们码农的真实写照

这是一篇让你受益匪浅的文章,代码即使人生。 worker启动比server启动要复杂一些,毕竟worker是要实际干活的,工欲善其事必先利其器,所以需要准备的工具还是不能少的,server对于powerjob来说,只是一个调度用的…

JVM详解

一,JVM 1,JVM区域划分 类装载器,运行时数据区,字节码执行引擎 2,JVM内存模型(运行时数据区) 由本地方法栈,虚拟机栈,堆,方法区,和程序计数器组成。…

C++类基础(十五)

类的继承——虚函数&#xff08;二&#xff09; ● 由虚函数所引入的动态绑定属于运行期行为&#xff0c;与编译期行为有所区别 虚函数与继承紧密相关 – 虚函数的缺省实参只会考虑静态类型 struct Base {virtual void fun(int x 3){std::cout << "virtual void f…

国产技术迎来突破,14nm芯片横空出世,低代码也有好消息

芯片&#xff0c;被称为工业时代的“粮食”&#xff0c;小到手机手环&#xff0c;大到飞机轮船&#xff0c;几乎各个行业都不离开芯片的支持&#xff0c;其重要性不言而喻。而我国在这一领域一直较为薄弱。 一、“芯片之路坎坷” 由于国内半导体芯片市场底子薄弱、没有主动权…

NetApp AFF A 系列全闪存存储阵列

NetApp AFF A 系列全闪存阵列是一款智能、至强、至信的解决方案&#xff0c;它可利用现代云技术为您的 Data Fabric 提供所需的速度、效率和安全性。 是时候实现数据现代化了 进行任何 IT 转型的基础性第一步是利用高性能全闪存存储打造现代化基础架构&#xff0c;提高关键业务…

【C++之容器适配器】反向迭代器的实现

目录前言一、反向迭代器的实现1. 底层2. 成员函数1. 构造函数2. operator*()3. operator->()4. 前置5. 后置6. 前置--7. 后置--8. operator!()9. operator()二、vector反向迭代器的实现1. vector的正向迭代器2. vector反向迭代器的实现3. 测试vector的反向迭代器三、list反向…

git提交

文章目录关于数据库&#xff1a;桌面/vue-admin/vue_shop_api 的 git 输入 打开 phpStudy ->mySQL管理器 导入文件同时输入密码&#xff0c;和文件名 node app.js 错误区&#xff1a; $ git branch // git branch 查看分支 只有一个main分支不见master解决&#xff1a; gi…

PyQt5保姆级入门教程——从安装到使用

目录 Part1&#xff1a;安装PyQt5 Part 2&#xff1a;PyCharm配置PyQt5 Part 3&#xff1a;PyQt5设计界面介绍 Part 4&#xff1a;PyQt5设计UI 今天看了多个大佬的教程&#xff0c;总算是把PyQt5开发弄好了&#xff0c;每个部分都要看几个人的十分不方便&#xff0c;我十分…

YOLOv3简介

YOLOv3 预测部分 Darknet-53 YOLOv3的主干提取网络为Darknet-53&#xff0c;相比于YOLOv2时期的Darknet-19&#xff0c;其加深了网络层数且引入了Residual残差结构。其通过不断的1X1卷积和3X3卷积以及残差边的叠加&#xff0c;大幅度的加深了网络。残差网络的特点是容易优化&a…