排序算法经典模型: 梯度提升决策树(GBDT)的应用实战
目录
一、Boosting训练与预测
二、梯度增强的思想核心
三、如何构造弱学习器和加权平均的权重
四、损失函数
五、梯度增强决策树
六、GBDT生成新特征
主要思想
构造流程
七、梯度增强决策树以及在搜索的应用
7.1 GDBT模型调参
7.1.1 框架层面参数
n_estimators
subsample
7.1.2 分类/回归树层面参数
最大特征数max_features
决策树最大深度max_depth
部节点再划分所需最小样本数min_samples_split
叶子节点最少样本数min_samples_leaf
7.2 K折交叉验证找到最佳超参数
交叉验证的优点
交叉验证的缺点
基于k折交叉验证的网格搜索法
7.3 GBDT在推荐系统中的排序算法示例
一、Boosting训练与预测

Boosting训练过程为串型,基模型按次序一一进行训练,基模型的训练集按照某种策略每次都进行一定的更新。对所有基模型预测的结果进行线性综合产生最终的预测结果
GBDT是将梯度下降和 Boosting 方法结合的算法。它采用决策树模型,并定义一个损失函数,通过梯度下降来优化模型。
二、梯度增强的思想核心
梯度增强首先还是增强算法的一个扩展,也是希望能用一系列的弱学习器来达到一个强学习器的效果,从而逼近目标变量的值,也就是我们常说的标签值。而根据加性模型的假设,这种逼近效果是这些弱学习器的一个加权平均。也就是说,最终的预测效果,是所有单个弱学习器的一个平均效果,只不过这个平均不是简单的平均,而是一个加权的效果。
三、如何构造弱学习器和加权平均的权重
梯度增强采用了一个统计学或者说是优化理论的视角,使得构造这些部分变得更加直观。
梯度增强的作者们意识到,如果使用“梯度下降”(Gradient Descent)来优化一个目标函数,最后的预测式可以写成一个加和的形式。也就是,每一轮梯度的值和一个叫“学习速率”(Learning Rate)的参数共同叠加起来形成了最后的预测结果。这个观察非常重要,如果把这个观察和我们的目标,也就是构造弱学习器的加权平均联系起来看,我们就会发现,其实每个梯度的值就可以认为是一个弱学习器,而学习速率就可以看作是某种意义上的权重
首先,这是一个迭代算法。每一轮迭代,我们把当前所有学习器的加权平均结果当作这一轮的函数值,然后求得针对某一个损失函数对于当前所有学习器的参数的一个梯度。然后,我们利用某一个弱学习器算法,可以是线性回归模型(Linear Regression)、对数几率模型(Logistic Regression)等来拟合这个梯度。最后,我们利用“线查找”(Line Search)的方式找到权重。说得更直白一些,那就是我们尝试利用一些简单的模型来拟合不同迭代轮数的梯度。
四、损失函数
损失函数是用来量化模型预测值与实际值之间差异的函数。在训练模型时,损失函数的值被用来通过优化算法(如梯度下降)调整模型参数,目标是最小化这个损失值

对于GBDT来说,如果是用于回归问题,那么通常选择平Squared Error Loss(方误差损失);如果是用于分类问题,尤其是二分类问题,通常选择Logistic Regression Loss(逻辑回归损失)。请注意,GBDT用于多分类问题时,会使用对数损失的多分类版本。
五、梯度增强决策树
梯度增强决策树就是利用决策树,这种最基本的学习器来当作弱学习器,去拟合梯度增强过程中的梯度。然后融合到整个梯度增强的过程中,最终,梯度增强决策树其实就是每一轮迭代都拟合一个新的决策树用来表达当前的梯度,然后跟前面已经有的决策树进行叠加。在整个过程中,决策树的形状,比如有多少层、总共有多少节点等,都是可以调整的或者学习的超参数。而总共有多少棵决策树,也就是有多少轮迭代是重要的调节参数,也是防止整个学习过程过拟合的重要手段。
六、GBDT生成新特征
主要思想
GBDT每棵树的路径直接作为LR输入特征使用
构造流程
用已有特征训练GBDT模型,然后利用GBDT模型学习到的树来构造新特征。构造的新特征向量是取值0/1的,向量的每个元素对应于GBDT模型中树的叶子结点。当一个样本点通过某棵树最终落在这棵树的一个叶子结点上,那么在新特征向量中这个叶子结点对应的元素值为1,而这棵树的其他叶子结点对应的元素值为0。新特征向量的长度等于GBDT模型里所有树包含的叶子结点数之和。
新特征向量反映了数据点在所有决策树中的路径信息,可以帮助线性模型(如逻辑回归)更好地捕捉数据点的复杂结构和模式,因为决策树能够捕捉非线性关系,而这种关系现在被编码到新特征向量中供线性模型使用。这样的技术常被用于提高模型在各种任务中的表现,尤其是在那些线性模型不足以捕捉数据复杂性的场景中。
七、梯度增强决策树以及在搜索的应用
7.1 GDBT模型调参
7.1.1 框架层面参数
n_estimators
弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说取值太小容易欠拟合;太大又容易过拟合,一般选择一个适中的数值。
subsample
即子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用;如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。
7.1.2 分类/回归树层面参数
最大特征数max_features
默认是“None”,即 考虑所有的特征数。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比。一般来说,如果样本特征数不多,比如小于50,可以用默认的“None”,如果特征数非常多,需要进行网格搜索。
决策树最大深度max_depth
默认可以不输入,此时决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多则需要限制最大深度,取值取决于数据的分布。常用的可以取值10-100之间。
部节点再划分所需最小样本数min_samples_split
如果某节点的样本数少于min_samples_split,则不会继续再进行划分。 默认是2.
如果样本量不大,不需要调节这个值。如果样本量数量级非常大,则推荐增大这个值。
叶子节点最少样本数min_samples_leaf
如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要调节这个值。如果样本量数量级非常大,则推荐增大这个值。
7.2 K折交叉验证找到最佳超参数
- 选择K的值(比如10),将数据集分成K等份
- 使用其中的K-1份数据作为训练数据进行模型的训练
- 使用一种度量测度在另外一份数据(作为验证数据)衡量模型的预测性能
交叉验证的优点
- 交叉验证通过降低模型在一次数据分割中性能表现上的方差来保证模型性能的稳定性
- 交叉验证可以用于选择调节参数、比较模型性能差别、选择特征
交叉验证的缺点
交叉验证带来一定的计算代价,尤其是当数据集很大的时候,导致计算过程会变得很慢
基于k折交叉验证的网格搜索法
GridSearchCV,其作用是自动调参。将每个参数所有可能的取值输入后可以给出最优化的结果和参数。但是该方法适合于小数据集,对于大样本很难得出结果。
此时可以使用基于贪心算法的坐标下降进行快速调优:先拿当前对模型影响最大的参数调优,直到最优化,再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,时间效率较高。
以下是一个使用 GridSearchCV
优化 GBDT 参数的简单例子
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier# 定义 GBDT 模型
gbdt = GradientBoostingClassifier()# 定义参数网格
param_grid = {'n_estimators': [100, 200, 300],'learning_rate': [0.01, 0.1, 0.2],'max_depth': [3, 4, 5]
}# 创建 GridSearchCV 对象
grid_search = GridSearchCV(gbdt, param_grid, cv=5, scoring='accuracy')# 拟合/训练模型
grid_search.fit(X_train, y_train)# 获取最佳参数组合和模型
best_parameters = grid_search.best_params_
best_model = grid_search.best_estimator_
在这个例子中,GridSearchCV
用于找到 GBDT 模型的最佳超参数,如 n_estimators
、learning_rate
和 max_depth
。通过这种方式,GridSearchCV
提供了一个方便的方法来提高 GBDT 模型的性能。
7.3 GBDT在推荐系统中的排序算法示例
import numpy as np
import pandas as pd
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split# 生成模拟的推荐系统数据集
# 假设有10个特征,这些特征描述了用户和物品的各种属性和交互
X = np.random.rand(1000, 10) # 特征矩阵,每行代表用户-物品对的特征
y = np.random.rand(1000) # 目标变量,代表用户对物品的评分或偏好# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化 GBDT 模型
gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)# 训练模型
gbdt.fit(X_train, y_train)# 使用模型进行预测
predictions = gbdt.predict(X_test)# 将预测结果和测试集的特征合并,模拟实际推荐场景
recommended_items = pd.DataFrame(X_test, columns=[f'feature_{i}' for i in range(X_test.shape[1])])
recommended_items['predicted_rating'] = predictions# 对每个用户推荐评分最高的物品
# 在实际应用中,你需要一个用户ID来分组,这里我们简化为按行分组
recommended_items.sort_values(by='predicted_rating', ascending=False, inplace=True)# 展示每个用户推荐的最高评分物品
recommended_items_per_user = recommended_items.groupby('feature_0', as_index=False).first()
print(recommended_items_per_user)
在上述代码中,X
表示特征矩阵,y
表示目标变量。我们首先使用 train_test_split
分割数据集,然后创建和训练一个GBDT模型。这个模型用来预测用户对物品的评分。最后,我们展示了如何使用这个模型来为用户推荐评分最高的物品。
请注意,这是一个高度简化的示例。在实际推荐系统中,你会有一个用户ID与物品ID,并且你会根据这些ID来构建特征,然后进行排序和推荐。特征可能包括用户的历史行为,物品的内容特征,用户和物品的交互历史等。另外,排序模型的评估可能会使用更复杂的指标,如平均准确率均值(Mean Average Precision)或归一化折扣累积增益(NDCG)。
相关文章:

排序算法经典模型: 梯度提升决策树(GBDT)的应用实战
目录 一、Boosting训练与预测 二、梯度增强的思想核心 三、如何构造弱学习器和加权平均的权重 四、损失函数 五、梯度增强决策树 六、GBDT生成新特征 主要思想 构造流程 七、梯度增强决策树以及在搜索的应用 7.1 GDBT模型调参 7.1.1 框架层面参数 n_estimators su…...

【揭秘】ForkJoinTask全面解析
内容摘要 ForkJoinTask的显著优点在于其高效的并行处理能力,它能够将复杂任务拆分成多个子任务,并利用多核处理器同时执行,从而显著提升计算性能,此外,ForkJoinTask还提供了简洁的API和强大的任务管理机制,…...

如何利用数据压缩提高高性能存储的效率?
在当前信息爆炸的时代,大数据存储和管理成为了各大企业和组织面临的重要挑战之一。高性能存储系统的效率对于数据处理和应用的性能至关重要。而数据压缩技术的应用可以在一定程度上提高高性能存储的效率。 数据压缩技术的作用 数据压缩是通过对数据进行编码和压缩…...

前端工程化之:webpack1-2(安装与使用)
一、webpack简介 webpack中文网 webpack 是基于模块化的打包(构建)工具,它把一切视为模块它通过一个开发时态的入口模块为起点,分析出所有的依赖关系,然后经过一系列的过程(压缩、合并),最终生成运行时态的文件。 webpack的特点&a…...

MySQL索引类型及数据结构【笔记】
1 索引类型 返回面试宝典 主键索引(PRIMARY):数据列不允许重复,不允许为NULL,一个表只能有一个主键。 唯一索引(UNIQUE):数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引…...

成熟的内外网数据交换方案,如何实现跨网传输?
网络迅速发展,我们可以从网络上查找到各式各样的信息,但是同时网络安全问题也随之严重。近几年,各种有关网络安全的新闻不断被报道,数据泄露给很多企业带来了严重打击,不仅是经济损失,严重者还会对企业的声…...

python11-Python的字符串之repr
有时候,我们需要将字符串与数值进行拼接,而 Python 不允许直接拼接数值和字符串,程序必须先将数值转换成字符串。 为了将数值转换成字符串,可以使用str0或repr()函数,例如如下代码。 # !/usr/bin/env python# -*- co…...

python小项目:口令保管箱
代码: #! python3 # python 编程-----口令保管箱passwords{emails: F7minlBDDuvMJuxESSKHFhTxFtjVB6,blog:VmALvQyKAxiVH5G8v01if1MLZF3sdt,luggage:12345,} import sys,pyperclip if len(sys.argv)<2:print(usage:python python3文件[accout]-copy accout pass…...

微认证 openEuler社区开源贡献实践
文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman,1983年9月推出GNU项目,并发起自由软件运动(free software movement或free/open…...

紫光展锐M6780丨超分辨率技术——画质重构还原经典
上一期,我们揭秘了让画质更加炫彩的AI-PQ技术。面对分辨率较低的老电影,光有高饱和度的色彩是不够的,如何能够提高视频影像的分辨率,使画质更加清晰,实现老片新看? 本期带大家揭晓紫光展锐首颗AI8K超高清智…...

《Python 简易速速上手小册》第6章:Python 文件和数据持久化(基于最新版 Python3.12 编写)
注意:本《Python 简易速速上手小册》 核心目的在于让零基础新手「快速构建 Python 知识体系」 文章目录 <mark >注意:本《Python 简易速速上手小册》<mark >核心目的在于让零基础新手「快速构建 Python 知识体系」 6.1 文件读写操作6.1.1 打…...

华为机考入门python3--(4)牛客4-字符串分隔
分类:字符串 知识点: 复制符号* 复制3个0 0*3 000 字符串截取 截取第i位到j-1位 str[i:j] 题目来自【牛客】 input_str input().strip()# 先补齐 if len(input_str) % 8 ! 0: input_str 0 * (8 - len(input_str) % 8) # 每8个分 out…...

Unity MonoBehaviour 生成dll
dllllllllllllll🥓 🥙vs创建类库项目🧀添加UnityEngine、UnityEditor引用🍕添加MonoBehaviour类🦪设置dll生成路径🍿生成dll🍔使用dll中的Mono类 🥙vs创建类库项目 🧀添加…...

基于Python flask MySQL 猫眼电影可视化系统设计与实现
1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站,拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而,由于数据的复杂性和数据来源的多样性,如何有效地采集、存储和展示这些数…...

【新课上架】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战
01 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性,同时提高性能。本课程基于当前主流版本Oracle 19cOEL7.9解析如何搭建2节点RAC对1节点单机的DATA GU…...

gdb调试std::list和std::vector等容器的方法
GDB中print方法并不能直接打印STL容器中保存的变量,其实只要http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt这个文件保存为~/.gdbinit 就可以使用它提供的方法方便调试容器 指定启动文件:~/.gdbinit,下面的方法任选其一。…...

python stomp 转发activemq topic消息
import pysimplestomp 连接到ActiveMQ的Topic: # 连接ActiveMQ服务器 server "tcp://localhost:61613" topic "/topic/your_topic"# 连接到ActiveMQ的Topic destination f"destination://{topic}" connection pysimplestomp.con…...

Spring Boot使用AOP
一、为什么需要面向切面编程? 面向对象编程(OOP)的好处是显而易见的,缺点也同样明显。当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录、性能监控等,如果采用面向对象编程的方法&…...

C语言通过IXMLHttpRequest以get或post方式发送http请求获取服务器文本或xml数据
做过网页设计的人应该都知道ajax。 Ajax即Asynchronous Javascript And XML(异步的JavaScript和XML)。使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发…...

QtRVSim(二)一个 RISC-V 程序的解码流程
继上一篇文章简单代码分析后,本文主要调研如何实现对指令的解析运行。 调试配置 使用 gdb 工具跟踪调试运行。 c_cpp_properties.json 项目配置: {"name": "QtRvSim","includePath": ["${workspaceFolder}/**&quo…...

x-cmd pkg | httpx - 为 Python 设计的下一代 HTTP 客户端库
目录 简介首次用户功能特点进一步探索 简介 HTTPX 是一个为 Python 设计的下一代 HTTP 客户端库,由 Tom Christie 创建。它提供了同步和异步的 API,并支持 HTTP/1.1 和 HTTP/2 协议。与 Requests 库类似,但增加了对异步请求的支持和 HTTP/2 …...

代码随想录算法训练营第四十二天(动态规划篇)|62. 不同路径
62. 不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 思路 dp[i][j]: 从0到位置[i, j]共有dp[i][j]条路径。 dp[i][j] dp[i-1][j] dp[i][j-1] 到位置[i,j],可以从它的上面或者左边来,所以路径和为这两个方向的路…...

YOLO 全面回顾:从最初的YOLOv1到最新的YOLOv8、YOLO-NAS,以及整合了 Transformers 的 YOLO
YOLO 全面回顾 综述评估指标YOLO v1YOLO v2YOLO v3YOLO v4YOLOv5 与 Scaled-YOLOv4 YOLORYOLOXYOLOv6YOLOv7DAMO-YOLOYOLOv8PP-YOLO, PP-YOLOv2, and PP-YOLOEYOLO-NASYOLO with Transformers 综述 论文:https://arxiv.org/pdf/2304.00501.pdf 代码:gi…...
Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2)
Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin(2) 在 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心,Kotlin-CSDN博客 …...

同为科技(TOWE)自动控制循环定时插座
随着科技的发展,智能化家居已成为我们生活的重要组成部分。作为国内领先的智能家居品牌,同为科技(TOWE)推出的自动控制循环定时插座,无疑将科技与生活完美地结合在一起。 1.外观设计 同为科技(TOWE&#x…...

游戏设计模式
单列模式 概念 单例模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供一个访问该实例的全局节点。 优点 可以派生:在单例类的实例构造函数中可以设置以允许子类派生。受控访问:因为单例类封装他的唯一实例…...

CUBEMX与FreeRTOS在Arm Compiler 6下的配置方法
在嵌入式开发中,STM32是一种广泛使用的微控制器。为了提高开发效率,我们通常会利用ST公司提供的STM32CubeMX工具来配置硬件,并结合FreeRTOS这一实时操作系统来进行多任务处理。本文将深入探讨如何在这一框架下,使用Arm Compiler 6…...

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart
每次提交代码时,AS这个老妈子总爱唠叨一堆warning,这些Warning都在讲什么? 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中,android:drawableStart和app:drawableStartCompat是两个用于设置…...

C# wpf 实现任意控件(包括窗口)更多调整大小功能
WPF拖动改变大小系列 第一节 Grid内控件拖动调整大小 第二节 Canvas内控件拖动调整大小 第三节 窗口拖动调整大小 第四节 附加属性实现拖动调整大小 第五章 拓展更多调整大小功能(本章) 文章目录 WPF拖动改变大小系列前言一、添加的功能1、任意控件Drag…...

Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2
返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers7地图库依赖,编写简单的xyz高德地图显示…...