机器学习---xgboost算法

1. xgboost算法原理

XGBoost(Extreme Gradient Boosting)全名叫极端梯度提升树,XGBoost是集成学习方法的王

牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost。 XGBoost在绝大多数的回归和分类

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。构建最优模型的⼀般方法是最

小化训练数据的损失函数。 我们用字母 L 表示损失,如下式:

其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情

况的⼀种毫无遗漏的假设集合。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。当

训练数据较小时,模型很容易出现过拟合问题。 因此,为了降低模型的复杂度,常采用下式:

。其中J(f)为模型的复杂度,式(2.1)称为结构风险

最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。决策树的生

成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小

化的结果。

2. XGBoost的⽬标函数推导

目标函数,即损失函数,通过最小化损失函数来构建最优模型。 由前面可知, 损失函数应加上表

示模型复杂度的正则项,且XGBoost对应的模型包含了多个CART树,因此,模型的目标函数为:

,(3.1)式是正则化的损失函数; 其中 y 是模型的实际输

出结果, 是模型的输出结果; 等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里

的正则化项是K棵树的正则化项相加而来的。

上图为第K棵CART树,确定⼀棵CART树需要确定两部分, 第⼀部分就是树的结构,这个结构将

输⼊样本映射到⼀个确定的叶子节点上,记为f (x); 第⼆部分就是各个叶子节点的值,q(x)表示输出

的叶子节点序号,w (x)表示对应叶子节点序号的值。 由定义得:

XGBoost法对应的模型包含了多棵cart树,定义每棵树的复杂度:

其中T为叶子节点个数,||w||为叶子节点向量的模 。γ表示节点切分的难度,λ表示L2正则化系数。

2.1 目标函数推导

根据(3.1)式,共进行t次迭代的学习模型的目标函数为:

由前向分布算法可知,前t-1棵树的结构为常数:

我们知道,泰勒公式的⼆阶导近似表示:

令ft(xi)为Δx, 则(3.5)式的⼆阶近似展开:

因为为常数,所以

其中:gi 和hi 分别表示预测误差对当前模

型的⼀阶导和⼆阶导;表示前t-1棵树组成的学习模型的预测误差。 当前模型往预测误

差减小的方向进行迭代。 忽略(3.8)式常数项,并结合(3.4)式,得:

,通过(3.2)式简化(3.9)式:

(3.10)式第⼀部分是对所有

训练样本集进行累加, 此时,所有样本都是映射为树的叶子节点,所以,我们换种思维,从叶子

节点出发,对所有的叶子节点进行累加,得:

,Gj 表示映射为叶子节点 j 的所有输⼊样本的⼀阶导之和,同理,H 表示

⼆阶导之和。 得:

对于第 t 棵CART树的某⼀个确定结构(可用q(x)表示),其叶子节点是相互独立的, G 和H 是确

定量,因此,(3.12)可以看成是关于叶子节点w的⼀元⼆次函数 。 最小化(3.12)式,得:

,把(3.13)带⼊到(3.12),得到最终的目标函数:

,(3.14)也称为打分函数(scoring function),它是衡量树结构

好坏的标准, 值越小,代表结构越好 。 我们用打分函数选择最佳切分点,从而构建CART树。

3. XGBoost的回归树构建方法

在实际训练过程中,当建立第 t 棵树时,XGBoost采用贪心法进行树结点的分裂:从树深为0时开

始:对树中的每个叶子结点尝试进行分裂; 每次分裂后,原来的⼀个叶子结点继续分裂为左右两

个子叶子结点,原叶子结点中的样本集将根据该结点的判断规则分散到左右两个叶子结点中;新分

裂⼀个结点后,我们需要检测这次分裂是否会给损失函数带来增益,增益的定义如下:

,如果增益Gain>0,即分裂为两个叶子节点后,目标函

数下降了,那么我们会考虑此次分裂的结果。那么⼀直这样分裂,什么时候才会停止呢?

3.1 停止分裂条件判断

情况⼀:上节推导得到的打分函数是衡量树结构好坏的标准,因此,可用打分函数来选择最佳切分

点。首先确定样本特征的所有切分点,对每⼀个确定的切分点进行切分,切分好坏的标准如下:

Gain表示单节点obj与切分后的两个节点的树obj之差, 遍历所有特征的切分点,找到最大Gain的

切分点即是最佳分裂点,根据这种方法继续切分节点,得到CART树。 若 γ 值设置的过大,则

Gain为负,表示不切分该节点,因为切分后的树结构变差了。 γ 值越大,表示对切分后obj下降幅

度要求越严,这个值可以在XGBoost中设定。 情况⼆:当树达到最大深度时,停止建树,因为树

的深度太深容易出现过拟合,这⾥需要设置⼀个超参数max_depth。 情况三:当引入⼀次分裂

后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任⼀个叶子结点的样本权重低于某

⼀个阈值,也会放弃此次分裂。这涉及到⼀个超参数:最小样本权重和,是指如果⼀个叶子节点包

含的样本数量太少也会放弃分裂,防止树分的太细,这也是过拟合的⼀种措施。 

XGBoost与GDBT的区别:①XGBoost⽣成CART树考虑了树的复杂度,GDBT未考虑,GDBT在树

的剪枝步骤中考虑了树的复杂度。 ②XGBoost是拟合上⼀轮损失函数的⼆阶导展开,GDBT是拟合

上⼀轮损失函数的⼀阶导展开,因此,XGBoost 的准确性更高,且满足相同的训练效果,需要的

迭代次数更少。 ③XGBoost与GDBT都是逐次迭代来提高模型性能,但是XGBoost在选取最佳切分

点时可以开启多线程进行,大大提高了运行速度。

4. xgboost算法api介绍

官⽹链接:https://xgboost.readthedocs.io/en/latest/

pip3 install xgboost

xgboost中封装了很多参数,主要由三种类型构成:通用参数(general parameters),Booster 参

数(booster parameters)和学习目标参数(task parameters),通用参数:主要是宏观函数控

制; Booster参数:取决于选择的Booster类型,用于控制每⼀步的booster(tree, regressiong);

学习目标参数:控制训练,目标的表现。

通用参数(general parameters):

1. booster [缺省值=gbtree]

2. 决定使用哪个booster,可以是gbtree,gblinear或者dart。 gbtree和dart使用基于树的模型(dart

主要多了 Dropout),而gblinear 使用线性函数。

3. silent [缺省值=0] 设置为0打印运行信息;设置为1静默模式,不打印

4. nthread [缺省值=设置为最大可能的线程数] 并行运行xgboost的线程数,输⼊的参数应该<=系统

的CPU核心数,若是没有设置算法会检测将其设置为CPU 的全部核心数

下面的两个参数不需要设置,使用默认的就好了:

1. num_pbuffer [xgboost自动设置,不需要用户设置] 预测结果缓存大小,通常设置为训练实例的

个数。该缓存用于保存最后boosting操作的预测结果。

2. num_feature [xgboost自动设置,不需要用户设置] 在boosting中使用特征的维度,设置为特征的

最大维度

Booster 参数(booster parameters):

1. eta [缺省值=0.3,别名:learning_rate] 更新中减少的步长来防止过拟合。 在每次boosting之

后,可以直接获得新的特征权值,这样可以使得boosting更加鲁棒。 范围:[0,1]

2. gamma [缺省值=0,别名: min_split_loss](分裂最小loss) 在节点分裂时,只有分裂后损失函

数的值下降了,才会分裂这个节点。 Gamma指定了节点分裂所需的最小损失函数下降值。 这个参

数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。 范围: [0,∞]

3. max_depth [缺省值=6] 这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越

大,模型会学到更具体更局部的样本。 设置为0代表没有限制范围: [0,∞]

4. min_child_weight [缺省值=1] 决定最小叶子节点样本权重和。XGBoost的这个参数是最小样本权

重的和。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致

欠拟合。这个参数需要使用CV来调整。范围: [0,∞]

5. subsample [缺省值=1] 这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法

会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。典型值:0.5-

1,0.5代表平均采样,防止过拟合。范围: (0,1]

6. colsample_bytree [缺省值=1] 用来控制每棵随机采样的列数的占比(每⼀列是⼀个特征)。 典型

值:0.5-1 范围: (0,1]

7. colsample_bylevel [缺省值=1] 用来控制树的每⼀级的每⼀次分裂,对列数的采样的占比。 我个

⼈⼀般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是

如果感兴趣,可以挖掘这个参数更多的用处。 范围: (0,1]

8. lambda [缺省值=1,别名: reg_lambda] 权重的L2正则化项(和Ridge regression类似)。 这个参数

是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数

在减少过拟合上还是可以挖掘出更多用处的。

9. alpha [缺省值=0,别名: reg_alpha] 权重的L1正则化项。(和Lasso regression类似)。 可以应用

在很高维度的情况下,使得算法的速度更快。

10. scale_pos_weight[缺省值=1] 在各类别样本十分不平衡时,把这个参数设定为⼀个正值,可以

使算法更快收敛。通常可以将其设置为负样本的数目与正样本数目的比值。

11. lambda [缺省值=0,别称: reg_lambda] L2正则化惩罚系数,增加该值会使得模型更加保守。

12. alpha [缺省值=0,别称: reg_alpha] L1正则化惩罚系数,增加该值会使得模型更加保守。

13. lambda_bias [缺省值=0,别称: reg_lambda_bias] 偏置上的L2正则化(没有在L1上加偏置,因

为并不重要)

学习目标参数(task parameters):

1. objective [缺省值=reg:linear] i. “reg:linear” – 线性回归 ii. “reg:logistic” – 逻辑回归 iii.

“binary:logistic” – ⼆分类逻辑回归,输出为概率 iv. “multi:softmax” – 使⽤softmax的多分类器,返

回预测的类别(不是概率)。在这种情况下,你还需要多设⼀个参数:num_class(类别数目) v.

“multi:softprob” – 和multi:softmax参数⼀样,但是返回的是每个数据属于各个类别的概率。

2. eval_metric [缺省值=通过目标函数选择] 可供选择的如下所示: i. “rmse”: 均方根误差 ii. “mae”:

平均绝对值误差 iii. “logloss”: 负对数似然函数值 iv. “error”: ⼆分类错误率。 其值通过错误分类数目

与全部分类数目比值得到。对于预测,预测值大于0.5被认为是正类,其它归为负类。 v. “error@t”:

不同的划分阈值可以通过 ‘t’ 进行设置 vi. “merror”: 多分类错误率,计算公式为(wrong cases)/(all

cases) vii. “mlogloss”: 多分类log损失 viii. “auc”: 曲线下的面积

3. seed [缺省值=0] 随机数的种子,设置它可以复现随机数据的结果,也可以用于调整参数

5. xgboost案例

案例:https://www.kaggle.com/c/titanic/overview

数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
# 1、获取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]
# 缺失值需要处理,将特征当中有类别的这些特征进⾏字典特征抽取
x['age'].fillna(x['age'].mean(), inplace=True)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
# 对于x转换成字典数据x.to_dict(orient="records")
# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
# 模型初步训练
from xgboost import XGBClassifier
xg = XGBClassifier()
xg.fit(x_train, y_train)
xg.score(x_test, y_test)
# 针对max_depth进⾏模型调优
depth_range = range(10)
score = []
for i in depth_range:
xg = XGBClassifier(eta=1, gamma=0, max_depth=i)
xg.fit(x_train, y_train)
s = xg.score(x_test, y_test)
print(s)
score.append(s)# 结果可视化
import matplotlib.pyplot as plt
plt.plot(depth_range, score)
plt.show()

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

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

相关文章

MYSQL的索引(一)

本章概览 索引的出现就是为了提高数据查询的效率&#xff0c;实际上可以提高读写效率的数据节后有很多 索引常见模型 哈希表是一种以键 - 值&#xff08;key-value&#xff09;存储数据的结构&#xff0c;用哈希函数把key计算成一个值&#xff0c;这个值代表一个位置&#xf…

使用docker搭建LNMP架构

目录 环境准备 下载安装包 服务器环境 任务分析 nginx部分 建立工作目录 编写 Dockerfile 脚本 准备 nginx.conf 配置文件 生成镜像 创建自定义网络 启动镜像容器 验证nginx MySQL部分 建立工作目录 编写 Dockerfile 准备 my.cnf 配置文件 生成镜像 启动镜像…

Puppeteer让你网页操作更简单(2)抓取数据

Puppeteer让你网页操作更简单(1)屏幕截图】 示例2 —— 让我们抓取一些数据 现在您已经了解了Headless Chrome和Puppeteer的工作原理基础知识,让我们看一个更复杂的示例,其中我们实际上可以抓取一些数据。 首先,请查看此处的Puppeteer API文档。如您所见,有大量不同的方法我…

Marin说PCB之传输线损耗---趋肤效应和导体损耗01

大家在做RF上的PCB走线或者是车载相机的上走线的时候经常会听那些硬件工程师们说你这个走线一定要保证50欧姆的阻抗匹配啊&#xff0c;还有就是记得加粗走做隔层参考。 有的公司的EE硬件同事会很贴心的把RF走线的注意事项给你备注在原理图上或者是layoutguide上&#xff0c;遇到…

php中常用的几个安全函数

1. mysql_real_escape_string() 这个函数对于在PHP中防止SQL注入攻击很有帮助&#xff0c;它对特殊的字符&#xff0c;像单引号和双引号&#xff0c;加上了“反斜杠”&#xff0c;确保用户的输入在用它去查询以前已经是安全的了。但你要注意你是在连接着数据库的情况下使用这个…

【Kafka-3.x-教程】-【二】Kafka-生产者-Producer

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

10.9.2 std::function 非OO的多态实现 Page185~187

源代码&#xff1a; #include <iostream> #include <functional> #include <list>using namespace std;//使用function模板类定义一个类型&#xff0c; //该类型要求作为T的 //函数类型是参数是string,返回值是void typedef std::function <void (std::s…

关于浏览器下载的时候出现失败,网络错误

我试过所有浏览器&#xff0c;谷歌&#xff0c;firefox,qq浏览器&#xff0c;还是edge都不好使&#xff0c; 1.看网上说是http debugger的问题&#xff0c;但是我没有找到这个服务项 2.也有说可以通过修改或设置下载路径解决 -------- 我通过下载一个叫xdm的软件&#xff…

CloudFlare平台下载的WARP一直连不上(warp无法连接)解决办法

遇到问题&#xff1a; 解决办法&#xff1a; 下载一个warp选ip的文件夹&#xff0c;选一下ip就行了。 下载链接如下&#xff1a; https://pan.kejicode.cn/d/Onedrive/WIN%E7%AB%AFwarp%E8%87%AA%E9%80%89IP(%E6%89%8B%E5%8A%A8%2B%E8%87%AA%E5%8A%A8).rar?signRqBdHIMyyhg…

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

题目&#xff1a;122.买卖股票的最佳时机II 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:122.买卖股票的最佳时机|| 题目链接&#xff1a;力扣题目链接 图释&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {// 查看…

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而&#xff0c;通过采用一些有效的策略和方法&#xff0c;我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度&#xff0c;分享一些实用的建议和技巧&#xff0c;帮助读者在…

Costco攻入山姆大本营

01 Costco深圳店开业火爆 “我今天不去Costco&#xff0c;早上还没开业&#xff0c;路上就已经堵车了&#xff0c;看来今天人很多&#xff0c;过几天再去”&#xff0c;原本计划在Costco开业当天去逛逛的张芸&#xff08;化名&#xff09;无奈只能放弃。 家住在Costco深圳店旁…

回归预测 | Python基于ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM多输入单输出回归预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 原创改进&#xff0c; ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数&#xff1a;filter,unints1,units2&#xff0c;学习率&#xff08;可添加&#xff09; 以下是三个主要的改进点&…

【Minio】常见问题解决思路

检查存储服务器对应的端口与应用服务器是否能够互通&#xff0c;通过ping|telnet命令检查、查看防火墙端口是否开放&#xff0c;检查防火墙端口linux系统和windows系统各有不同。检查电脑上的杀毒软件是否限制了网络端口和文件权限问题。检查minio配置信息是否正确&#xff0c;…

第三次面试总结 - 吉云集团 - 全栈开发

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ&#xff1b;) 专栏 —— 本人真实面经&#xff0c;更多真实面试经验&#xff0c;中大厂面试总结等您挖掘 目录 总结&#xff08;非详细&#xff09; 面试内…

【面试突击】并发编程、线程池面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

SpringBoot懒加载

什么是懒加载 懒加载是一种优化技术&#xff0c;它延迟加载或按需加载资源&#xff0c;以减少初始加载时间或提高性能。在不同的上下文中&#xff0c;懒加载有不同的应用和含义。在web开发中&#xff0c;懒加载通常指的是延迟加载图片数据。在长网页或应用中&#xff0c;如果图…

分布式链路追踪专栏,分布式链路追踪:Skywalking集群管理设计

SkyWalking 是一个开源 APM 系统&#xff0c;包括针对 Cloud Native 体系结构中的分布式系统的监视&#xff0c;跟踪&#xff0c;诊断功能。核心功能如下&#xff1a; 服务、服务实例、端点指标分析&#xff1b; 根本原因分析&#xff0c;在运行时分析代码&#xff1b; 服务拓…

【Qt】QThread moveTothread-多线程的两种实现方法

一、如何理解多线程 二、实现多线程的两种方式&#xff08;面向应用&#xff09; 2.1 继承 QThread 的类 2.2 (推荐这种方式)函数 moveTothread() 三、多线程的释放问题&#xff08;善后工作&#xff09; 多线程的两种实现方法 一、如何理解多线程二、实现多线程的两种方式&…

跟着暄桐林曦老师读《宝贵的人生建议》,重视心这颗种子

暄桐林曦老师在《见道明心的笔墨》读书课上讲到&#xff1a;人要在心这颗种子上去进化。当人的动机和果实都清静时&#xff0c;才能在内心具足里转化出更多可能性&#xff0c;进入正面的循环里。“宽以待人&#xff0c;严以律己&#xff0c;反之&#xff0c;则人人身处地狱”&a…