排序算法经典模型: 梯度提升决策树(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训练与预测

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_estimatorslearning_ratemax_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)。

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

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

相关文章

[MSSQL]自定义函数之从字符串提取数字

之前写过从字符串中提取字母。某些场景需要从字符串中提取字母。 -- ============================================= -- Author: <David Gong> -- Create date: <2024-01-24> -- Description: <获取字符串中的数字> -- =================================…

spring boot 嵌入chatGPT步骤

一、需要良好的网络 二、需要在OpenAI官网https://openai.com/注册用户&#xff0c;并获取一个api-key&#xff0c;sk开头的 验证是否可用网站&#xff1a;http://tools.lbbit.top/check_key_valid/ 三、spring boot 配置文件 openai.proxyHost127.0.0.1 openai.proxyPort7890…

基于SpringBoot Vue宠物领养系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

2024年视频号下载工具支持高清视频下载,多平台下载!

本人在互联网领域摸爬滚打了十数载&#xff0c;今天要为大家推荐一款我个人已经持续使用超过一年的视频下载工具。此工具以其出色的稳定性著称&#xff0c;因此&#xff0c;我决定将其分享给各位朋友们。今天&#xff0c;我就来具体介绍这款实用的视频号下载工具。 视频号下载工…

MySQL45道练习题

作业需要数据表SQL语句已给 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 select * from Student RIGHT JOIN (select t1.SId, class1, class2 from(select SId, score as class1 from sc where sc.CId 01)as t1, (select SId, score as …

C++中的引用

一、引用的概念 引用不是新定义一个变量&#xff0c;而是给已有变量取一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;而和它引用的变量共用一块内存空间。 注意&#xff0c;由于C兼容C&#xff0c;所以&既可以是引用符号&#xff0c;也可以是取地址 …

微信小程序(八)图片的设定

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.图片的三种常见缩放形式 2.图片全屏预览 源码&#xff1a; testImg.wxml <!-- 默认状态&#xff0c;不保证缩放比&#xff0c;完全拉伸填满容器 --> <image class"pic" mode"scaleTo…

​分享最新五十首养生音乐,养五脏,解抑郁,去烦恼【附养生音乐下载地址+最佳聆听时间)】

​分享最新五十首养生音乐,养五脏,解抑郁,去烦恼【附养生音乐下载地址最佳聆听时间&#xff09;】 在中国医学巨作《黄帝内经》中记载&#xff1a; 肝属木&#xff0c;在音为角&#xff0c;在志为怒&#xff1b; 心属火&#xff0c;在音为徴&#xff0c;在志为喜&#xff1b; …

STM32单片机学习5--STM32中断

文章目录 一、前言二、NVIC中断控制器2.1、NVIC结构体成员2.2、抢占优先级和响应优先级2.3、NVIC的优先级组 三、EXTI外部中断四、中断实战4.1、确定连线4.2、配置中断控制端口4.3、配置中断端口4.4、配置中断服务函数4.5、主函数调用 一、前言 单片机无系统执行逻辑&#xff…

Java面试题(4)

14.说一下HashMap的实现原理 HashMap概述&#xff1a;HashMap是基于哈希表的Map接口的非同步实现&#xff0c;以键值对的存储形式存在&#xff0c;且线程 不安全。此实现提供所有可选的映射操作&#xff0c;并允许使用空键值对&#xff0c;但并不保证映射的顺序&#xff0c;尤…

关于使用jdk8自带的日期类getDayOfWeek()的详细解释

问题引入 我们会发现getDayOfWeek()这个函数和其他自带函数不一样 直接写会报错 但是如果我们将他变成getDayOfWeek().getValue() 又能够正常运行,我们这次就来看看是为什么 解释 进入getDayOfWeek()源码查看 我们进入getDayOfWeek()的源码中查看 我们可以发现他给我们返回的…

vivado:关联notepad++

网上好多都要下插件&#xff0c;看了野火视频&#xff0c;直接在vivado里面加路径弄好的 2 3&#xff08;那个fonts and colors也经常用 改字体&#xff09; 4 5 以下是我的路径 D:/gongjuruanjian/notepad/Notepad/notepad.exe [file name] -n[line number] 把[file name] -…

上位机图像处理和嵌入式模块部署(自定义算法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们在使用opencv的时候&#xff0c;虽然大部分算法都不需要我们自己重头开始编写&#xff0c;但是总有一些关于我们自己产品的know-how&#xff0…

控制项目风险

一、风险预算 暴雪公司经理艾莉森&#xff0c;暴雪公司是一家小型工业企业&#xff0c;该公司的高管为了降低生产成本&#xff0c;决定搬迁工厂。项目经理明白实际情况与初始计划之间常常会有很大的出入。项目经理需要事先为一些事情做好准备&#xff0c;并在项目运作或预算方面…

python报错:TypeError: ‘str‘ object is not callable

错误打印&#xff1a; python 代码&#xff1a; datalist [];datadictTmp (};mch 48;for i in range(1,10):datadict.clear()mch 48 ## 报错位置 datadict[parent_ID] str(i)chr(mch)mch 1datadict[paymentMethod] str(i)chr(mch)mch 1datadict[payer] str(i)chr(mc…

kafka入门(八):kafka分区分配策略

kafka分区分配策略 参数&#xff1a; Kafka提供了消费者客户端参数partition.assignment.strategy来设置消费者与订阅主题之间的分区分配策略。 默认情况下&#xff0c;此参数的值为 org.apache.kafka.clients.consumer.RangeAssignor&#xff0c;即采用RangeAssignor分配策略…

【服务器】安装宝塔面板

目录 &#x1f33a;【前言】 &#x1f33c;【前提】连接服务器 &#x1f337;方式一 使用工具登录服务器如Xshell &#x1f337;方式二 阿里云直接连接 &#x1f33c; 1. 安装宝塔 &#x1f337;获取安装脚本 方式一 使用下面提供的脚本安装 方式二 使用官网提供的脚本…

notepad++ v8.5.3 安装插件,安装失败怎么处理?下载进度为0怎么处理?

notepad v8.5.3 安装插件&#xff0c;安装失败&#xff1f;下载进度为0&#xff0c;怎么处理&#xff1f; 安装 进度 进度条没有进度 &#xff0c;然后就退出了&#xff0c;自动打开程序&#xff0c;不知道什么问题&#xff0c;插件管理下面也没有插件显示 找到问题了&#x…

2024年最全春节攻略,外贸人看这一篇就够了

凡事预则立&#xff0c;不预则废--《礼记•中庸》 不知不觉春节将至&#xff0c;很多外贸公司以及工厂也都公布了放假时间&#xff0c;虽然放假时间有长有短。很多人应该都有点迫不及待想要快点放假&#xff0c;回家过春节。春节毕竟是我们每年最重大的节日&#xff0c;也是家…

梯度下降算法实现原理

文章目录 什么是梯度梯度下降算法(通过迭代解决目标函数最小值)代码实现拓展: 什么是梯度 在了解梯度之前,我们先了解一下导数: 用于描述曲线变换快慢的一个量,在几何意义上表示为函数的斜率,数学定义为: f ′ ( x ) lim ⁡ △ x → 0 f ( x △ x ) − f ( x ) △ x f(x) \…