机器学习模型——GBDT和Xgboost

GBDT基本概念:

GBDT(Gradient Boosting Decision Tree,简称GBDT)梯度提升决策树,是Gradient Boost 框架下使用较多的一种模型,且在GBDT中,其基学习器是分类回归树也就是CART,且使用的是CART树中的回归树。

GBDT这个算法还有一些其他的名字, MART(Multiple Additive Regression Tree),GBRT(Gradient Boost Regression Tree),Tree Net,Treelink等。

GBDT算法原理以及实例理解(含Python代码简单实现版)-CSDN博客

GBDT算法原理以及实例理解_gbdt算法实例 csdn-CSDN博客

https://blog.csdn.net/lgh1700/article/details/100093316 回归问题

https://blog.csdn.net/RuDing/article/details/78332192 参数

https://www.cnblogs.com/always-fight/p/9400346.html  平方损失计算

决策树:

决策树分为两大类:回归树和分类树。前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女?

GBDT的核心在于累加所有树的结果作为最终结果,就像前面对年龄的累加(-3是加负3),而分类树的结果显然是没办法累加的,所以GBDT中的树都是回归树,不是分类树,这点对理解GBDT相当重要(尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树)。GBDT很适用二分类

GBDT算法原理:

GBDT也是继承了Boosing的思想,利用加法模型与前向分布算法实现学习的优化过程。每个基学习器在上一轮学习器的基础上进行训练。对弱学习器 (弱分类器)的要求一般足够简单,并且是低方差和高偏差的(欠拟合)。因为训练的过程就是通过降低偏差不断提高最终学习器的精度。

加法模型:本质就是我们要得到的最终预测结果是由前面M个弱学习器拟合的结果相加得到。 如果我们用 T(x;θ_m)表示第m棵决策树;θ_m表示决策树的参数;M为树的个数。强分类器f_M(x)可以由多个弱分类器T(x;θ_m)线性相加而成。则加法模型可表述为:

前项分步算法:第m步的模型可以写成:

可以理解为当前树模型等于前一棵树的模型加上刚生成树的模型 (递归)

GBDT的核心:

GBDT的核心就在于,每一棵树学习的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁。如果我们的迭代轮数还没有完,可以继续迭代下面每一轮迭代,拟合的岁数误差都会减小。

GBDT的目标函数:

模型一共训练M轮,每轮产生一个弱学习器T(x;θ_m)。弱学习器的目标函数可以表示为:

 F_m−1(x_i)为当前的模型,GBDT通过经验风险极小化来确定下一个弱学习器的参数。具体使用到的损失函数的选择也就是这里的L(),主要有平方损失函数,0-1损失函数,对数损失函数等等。如果我们选择平方损失函数,那么这个差值其实就是我们平常所说的残差。 目标:第一个是希望我们的损失函数能够不断减小;第二个是希望我们的损失函数能够尽可能快地减小。

https://blog.csdn.net/qq_35269774/article/details/88593661  回归树

目标函数的优化:

让损失函数沿着负梯度方向的下降,是GBDT的GB另外一个核心。利用损失函数的负梯度在当前模型的值,作为回归提升树算法中的残差的近似值去拟合一个回归树。GBDT每轮迭代的时候,都去拟合损失函数在当前模型下的负梯度。

这样每轮训练的时候都能够让损失函数尽可能快的减小,尽快地收敛达到局部最优或者全局最优。

GBDT代码实现:

from sklearn.datasets import load_iris
iris = load_iris()from sklearn.ensemble import GradientBoostingClassifier,GradientBoostingRegressor
# 既可以做分类,也可以做回归
GBDT = GradientBoostingClassifier()X = iris['data']
y = iris['target']from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)GBDT.fit(X_train,y_train)print(GBDT.score(X_test,y_test))

 0.9555555555555556

准确率还是很高的

由于GBDT不经常用于回归,因此我就不演示了

Xgboost基本概念:

 XGBoost本质上还是GBDT,但是把速度和效率做到了极致;

不同于传统的GBDT方式,只利用了一阶的导数信息,XGBoost对损失函数做了二阶的求导 (泰勒展开),并在目标函数之外加入了正则项整体求最优解,用以权衡目标函数的下降和模型的复杂程度,避免过拟合。

https://www.jianshu.com/p/ac1c12f3fba1  详解

https://www.cnblogs.com/mantch/p/11164221.html

XGboost的目标函数:

 XGBoost继承了GBDT,模型也是CART, 但不仅限于回归树。因此还是沿用了加法模型,但是在目标函数上有所区别。

目标函数:XGboost的目标函数包含了两个部分,第一部分还是损失函数,第二部分就是正则项。而且这里的正则化项是由K颗树的正则化项相加而来。

正则项的作用主要是为了防止过拟合,提高准确率。

XGboost的损失函数: 

XGboost在损失函数项采用的是二阶求导,损失函数也就可以表示为如下:

其中g_i和ℎ_i分别是泰勒展开的一次式和二次式的系数。而且g_i和ℎ_i是不依赖于损失函数的形式的,只要这个损失函数满足二次可微即可。也就是说,XGboost是可以支持自定义损失函数的。

在迭代更新的过程中g_i和ℎ_i 是可以并行计算的,因此,XGboost可以在提高准确率的同时还可以提高运算速度。 

XGboost的正则化项:

XGboost的应用: 

近年来,在电子商务网站进行在线购物逐渐成为人们新的购物习惯。在线购物过程中,人们在最终决定购买某种商品前,通常会在电子商务平台留下大量的信息,这些信息通常反映了用户购物的行为模式。通过数据挖掘方法来分析用户的行为模式数据,有利于更好地了解用户的购物习惯和倾向性,从而为预测用户的购买行为提供可能。

将XGBoost引入到电子商务的商品推荐算法中,挖掘用户在电子商务平台的行为数据信息,建立分类预测模型,从而个性化地向用户推荐商品。结果表明,与传统机器学习算法相比,XGBoost具有速度快、准确度高等优势。

XGboost和GBDT的不同:

传统GBDT以CART作为基分类器,XGboost还支持线性分类器,这个时候XGboost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性 回归(回归问题)。

传统GBDT在优化时只用到一阶导数信息,XGboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。

XGboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。正则项降低了模型的复杂度,使学习出来的模型更加简单,防止过拟合,这也是XGboost优于传统GBDT的一个特性。

Shrinkage(缩减),相当于学习速率(XGboost中的eta)。XGboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。

列抽样 (column subsampling)。XGboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGboost异于传 统GBDT的一个特性。

XGboost代码实现:

from sklearn.datasets import load_iris
iris = load_iris()from xgboost.sklearn import XGBClassifier
xgb = XGBClassifier()X = iris['data']
y = iris['target']from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)xgb.fit(X_train,y_train)print(xgb.score(X_test,y_test))

0.9333333333333333

*****:注意XGboost不是集成在sklearn这个第三方库中

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

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

相关文章

【LeetCode: 2529. 正整数和负整数的最大计数 + 模拟 + 计数】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

【c 语言】结构体的定义格式及变量初始化

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

【计算机考研】408算法大题怎么练?

先说结论:基础阶段学好各个数据结构与,重点是数组、链表、树、图。然后强化阶段突破算法提 在基础阶段,并不需要过于专门地练习算法。相反,基础阶段的重点应该放在对各种数据结构原理的深入理解上。在我个人的经验中,…

网络协议——VRRP(虚拟路由冗余协议)原理与配置

1. VRRP概述 单网关出现故障后下联业务中断,配置两个及以上的网关时由于IP地址冲突,导致通讯时断时续甚至通信中断。VRRP组播类的网络层协议 2. 协议版本 VRRP v2: 支持认证,仅适用于IPv4网络 VRRP v3: 不支持认证, 适用于IPv4和IPv6两种网…

数据结构—图

图的基本概念 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:G(V,E),其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。 顶点 图中的数据元素,我们称之为顶点,图至少有…

Redis 八种常用数据类型常用命令和应用场景

5 种基础数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 3 种特殊数据类型:HyperLogLog&#xff0…

C语言自定义类型:联合与枚举的奇幻之旅

** 前言 ** 在C语言的世界中,数据类型犹如魔术师手中的魔法道具,各有其神奇之处。今天,我们就来揭开其中两种自定义类型——联合(union)和枚举(enum)的神秘面纱,带你一起探索它们背…

《荒野大镖客》游戏提示emp.dll文件丢失如何解决?

emp.dll它作为一种动态链接库(DLL)文件,在Windows操作系统中扮演着重要角色。当打开一个程序时,操作系统会将程序的代码和数据加载到内存中,并创建一个进程来运行该程序。在这个过程中,emp.dll负责将这些代…

Hot100【十一】:合并区间

// 先排个序 // 这里巧用链表&#xff0c;可以快速的获取到last&#xff0c;通过last数组的第二个元素和当前数组的第一个元素对比&#xff0c;如果当前数组的第一个元素<last数组的第二个元素, 就需要合并 class Solution { public int[][] merge(int[][] intervals) { // …

实现几何对象按照一定距离向外缓冲

1、首先&#xff0c;确保你已经引入了Turf.js库。你可以通过在HTML文件中添加以下代码来引入 <script src"https://cdn.jsdelivr.net/npm/turf/turf6.5.0/turf.min.js"></script>2、使用turf.buffer实现几何对象按照设定距离扩充 let originalCoordinat…

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&am…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

【资源分享】这个网站我愿称之为年度学术最伟大的发现

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

嵌入式学习51-单片机4

知识零碎&#xff1a; nop空指令 CRC校验 为了保证51单片与温度传感18b20 之间的高电平 采用一个上拉电阻改变电平的高低 温度寄存器原理

【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)

文章目录 前言AOP与Spring AOPAspect简单案例快速入门 一、Pointcutannotation 二、五种通知Advice1. Before前置通知2. After后置通知3. AfterRunning返回通知4. AfterThrowing异常通知5. Around环绕通知 总结 前言 在微服务流行的当下&#xff0c;在使用SpringCloud/Springb…

Vue和FastAPI实现前后端分离

前言 近期接触了一些开源大模型应用服务&#xff0c;发现很多用的都是FastAPI web框架&#xff0c;于是乎研究了一下它的优势&#xff0c;印象最深有两个&#xff1a;一个是它的异步处理性能比较好&#xff0c;二是它可以类似java swagger的API交互文档&#xff0c;这个对应前…

服务器远程桌面连接不上怎么办?

随着互联网的发展和远程办公的兴起&#xff0c;服务器远程桌面连接成为了许多企业和个人不可或缺的工具。偶尔我们可能会碰到服务器远程桌面连接不上的情况&#xff0c;这时候我们需要找到解决办法&#xff0c;确保高效地远程访问服务器。 天联组网——突破远程连接障碍 在我们…

性能优化 - 你知道dns-prefetch有什么用吗

难度级别:中级及以上 提问概率:50% 我们在HTML文档里写一个script标签,为src属性指定Javascript文件网络地址,这是一件再平凡不过的事情。当浏览器加载HTML文档,加载到这个script标签的时候,就会去下载Javascript文件。而在下载之前,就…

c# wpf LiveCharts 饼图 简单试验

1.概要 c# wpf LiveCharts 饼图 简单试验 2.代码 <Window x:Class"WpfApp3.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

element-ui的年份范围选择器,选择的年份需等于或小于当前年份,选择的年份范围必须在三年之内

写在前面 日期限制处理&#xff08;禁用&#xff09;&#xff0c;下面我以我这边的需求为例&#xff0c; 选择的年份需等于或小于当前年份 选择的年份范围必须在三年之内 1.限制起始日期小于截止日期 1&#xff09;根据用户选中的开始日期&#xff0c;置灰不可选的日期范围&…