[机器学习]XGBoost---增量学习多阶段任务学习

news2024/9/25 23:16:03

一 说明

  当我们的训练数据非常多,并且还在不断增加时,每次都用全量训练,数据过多,时间过长,此时就可以使用增量训练:用新增的数据微调校正模型。

二 全量与增量的差异

 在使用增量训练时,最关心的问题是:全量和增量的差别,从而确定增量训练的使用场景。

 假设有200条数据

  1. 第一次训练150条,第二次训练50条,

  1. 直接用200条训练

差异在于:在第二次训练50条时,前150条数据已经不存在了,模型更拟合于后面的数据。如果我们定期增量训练,那么离当前时间越近的数据对模型影响越大,这也是我们想要的结果。但如果最后一批数据质量非常差,就可能覆盖之前的正确实例的训练结果,把模型带偏。

  同理,如果我们按时间把数据分成几部分,然后按从早到晚的顺序多次训练模型,每个模型在上一个模型基础上训练,也间接地参加了后期实例的权重。

 XGBoost提供两种增量训练的方式,

  • 一种是在当前迭代树的基础上增加新树,原树不变;

  • 一种是当前迭代树结构不变,重新计算叶节点权重,同时也可增加新树。

  对于已存在的决策树,早期训练的实例决定了模型的结构(选择哪些特征及分裂点),后期的实例决定最终的结果(叶节点的权重和新加入的树)。

  综上,两个重点:第一,模型训练了一半,突然换了一批完全不同的数据继续训练,早期数据不再能再校正模型;第二,树一旦形成,结构就不再变化,后续的训练只能增加新树和重新计算前树的节点权重。

 尽量用全量数据训练,如果数据太多,必须增量时,尽量保证增量数据的质量和数量(均匀分布),以免带偏模型。

三. 例子

import xgboost as xgb
from sklearn.datasets import load_digits  # 训练数据
from sklearn.model_selection import train_test_split

X, y = load_digits(n_class=2, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, shuffle=True, stratify=y,
                                                    random_state=100)

dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)

print("-+-" * 25)
params1 = {'tree_method': 'hist'}
model1 = xgb.train(params1, dtrain, num_boost_round=3)  # 训练2棵树的模型
print(len(model1.get_dump()))
for leaf in model1.get_dump():
    print(leaf)

print("-+-" * 25)
params2 = {'tree_method': 'hist'}
model2 = xgb.train(params2, dtest, num_boost_round=5, xgb_model=model1)  # 在原模型基础上继续训练
print(len(model2.get_dump()))
for leaf in model2.get_dump():
    print(leaf)

print("-+-" * 25)
##当前迭代树的结构不变,重新计算叶节点权重,
params3 = {'tree_method': 'hist'}
params3["updater"] = "refresh"
params3["process_type"] = "update"
params3["refresh_leaf"] = True
# 则3棵树结构不变,叶节点权重改变,最终结果一共3棵树
# 特别注意这里的num_boost_round <=原始模型的boost_nums 否则汇报错
model3 = xgb.train(params3, dtest, num_boost_round=3, xgb_model=model1)  # 在原模型基础上继续训练
print(len(model3.get_dump()))
for leaf in model3.get_dump():
    print(leaf)

import xgboost as xgb
from sklearn.datasets import load_digits  # 训练数据
from sklearn.model_selection import train_test_split

X, y = load_digits(n_class=2, return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, shuffle=True, stratify=y,
                                                    random_state=100)

# dtrain = xgb.DMatrix(X_train, label=y_train)
# dtest = xgb.DMatrix(X_test, label=y_test)

print("-+-" * 25)
params1 = {'tree_method': 'hist', "n_estimators": 3}
model1 = xgb.XGBClassifier(**params1)
model1.fit(X_train, y_train)
print(len(model1.get_booster().get_dump()))
for leaf in model1.get_booster().get_dump():
    print(leaf)

print("-+-" * 25)
params2 = {'tree_method': 'hist', "n_estimators": 3}
model2 = xgb.XGBClassifier(**params2)
model2.fit(X_test, y_test, xgb_model=model1.get_booster())
print(len(model2.get_booster().get_dump()))
for leaf in model2.get_booster().get_dump():
    print(leaf)

print("-+-" * 25)
params3 = {'tree_method': 'hist', "n_estimators": 3}
params3["updater"] = "refresh"
params3["process_type"] = "update"
params3["refresh_leaf"] = True
# 则3棵树结构不变,叶节点权重改变,最终结果一共3棵树
# 特别注意这里的num_boost_round <=原始模型的boost_nums 否则汇报错
model3 = xgb.XGBClassifier(**params3)
model3.fit(X_test, y_test, xgb_model=model1.get_booster())
print(len(model3.get_booster().get_dump()))
for leaf in model3.get_booster().get_dump():
    print(leaf)

四. 分析

  训练函数train()中有个参数xgb_model,可填写旧模型路径,或者模型指针,指定该参数后,新模型在旧模型的基础上训练。

   从代码上看,增量训练的逻辑主要在python层面,和普通的训练模型比,只是在c++底层实现了用旧模型填充learner,而非初始化learner。

   回想一下前篇讨论过的训练过程:代入实例预测->对比预测结果和实际结果差异(误差函数)及误差方向(误差函数导数)->添加新决策树改进模型。继续训练也是如此。

 从上面代码的输出结果可以看到

第一次dump的决策树是3棵,

第二次dump出8棵(第一次3棵加第二次5棵)其中的前3棵与之前完全一样。就是说增量训练后,原来模型中的所有树都没变,只是在后面追加了更多的树。

第三次dump出3棵,3棵树结构不变,叶节点权重改变

五 多任务训练

老板说要这个模型对A这个目标有区分度但是你对B的区分度也得有(一个模型要A标签上效果不错,同时也要在B标签上有不错效果)

  1. 总体来说通过两阶段任务的学习获得了两个任务的适应性

2.  第2阶段的模型可能损失另外主任务的区分度(相当于预测A目标效果会下降,可接受范围內,但是预测B目标效果会提高)

  1. 对于不同的样本空间的学习任务也提供了一种方式来进行训练,对于相近或相似任务可能存在提升(待验证)

https://zhuanlan.zhihu.com/p/320010888

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

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

相关文章

矩阵通高效监管企业新媒体矩阵,账号集中管理与运营数据分析

越来越多的企业在全网布局旗下账号&#xff0c;希望通过社媒传播矩阵&#xff0c;以内容连接产品与用户&#xff0c;达成增加销售线索或扩大品牌声量的目的。构建矩阵的优势在于&#xff0c;内容能多元发展&#xff0c;聚集不同平台流量&#xff1b;多种营销渠道自主掌控&#…

高并发系统设计之限流

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录限流算法计数器算法滑动窗口漏桶算法令牌桶算法限流算法实现Guava RateLimiter实现限流令牌预分配预热限流Nginx 限流limit_connlimit_req黑白名单限流这篇文章来讲讲限流&#xff0c;在高并发系统中…

【包装工单批次编号不存在】和【MES没有样品单报工数据】

包装工单批次编号不存在 今天在做数据的时候,发现一个诡异的问题,有几个包装工单明细里没有批次编号。 我问了下假捻的同事,他们说很奇怪,有的时候有,有的时候没有。 我又咨询了供应商,供应商说不可能没有,批次编号的业务逻辑是通过物料编码+区分号+等级+包装方式 4个…

多模态机器学习入门——文献阅读(一)Multimodal Machine Learning: A Survey and Taxonomy

文章目录说明论文阅读AbstractIntroductionIntroduction总结Applications&#xff1a;A Historical Perspective补充与总结3 MULTIMODAL REPRESENTATIONS总结Joint Repersentations&#xff08;1&#xff09;总结和附加(一)Joint Repersentations&#xff08;2&#xff09;总结…

问题总结:Map存入的数据丢失类型任意

发现问题&#xff1a;Map存入的数据丢失类型 经常会使用 Map<String&#xff0c;Object> 来用于存储键值对的数据&#xff0c;由于我们使用 Object 类型来接收数字&#xff0c;但是有些时候会出现map并不知道我们传入的是 Long 还是 Integer 。也就是出现数据类型丢失的…

变分推断 | MATLAB实现VBMC变分贝叶斯蒙特卡洛模拟的贝叶斯推断

变分推断 | MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断 目录 变分推断 | MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断效果一览基本介绍研究内容模型描述模型设计参考资料效果一览 基本介绍 MATLAB实现变分贝叶斯蒙特卡洛模拟的贝叶斯推断。变分贝叶斯蒙特卡洛(VBMC)是…

6年测试经验老鸟:做不好自动化测试,还谈什么高薪?

提起自动化测试&#xff0c;可谓仁者见人&#xff0c;智者见智&#xff0c;心中五味杂陈啊&#xff01;你从任何一个招聘渠道来看最近两年对测试岗位的要求&#xff0c;几乎都要求会自动化测试。而不少人一直认为手工测试才是王道&#xff0c;工作中有的时候也用不到程序&#…

摆烂三年,我从普通二本到春招华为OD上岸啦

萌妹镇楼 年前拿到的意向书 答读者问 薪资情况 定级D2,13K2K,两个月年终奖&#xff0c;周六加班双倍工资&#xff0c;下个月发。每年一次加薪&#xff0c;OD转华为一次加薪。 加班强度 124晚9点&#xff0c;35晚6点&#xff0c;项目紧急的话&#xff0c;周六会安排加班 转…

依赖倒转原则和里氏代换原则详解

初学依赖倒转原则和里氏代换原则时&#xff0c;由于笔者水平有限&#xff0c;并没有看懂书上的专业术语的解释&#xff0c;经过反复摸索和学习&#xff0c;发现里氏代换原则和依赖倒转原则可以一言以蔽之&#xff1a; 里氏代换原则&#xff1a;开发时以抽象为核心&#xff0c;…

CMake常用指令

CMake常用指令一、前言二、基本指令2.1、ADD_DEFINITIONS2.&#xff12;、ADD_DEPENDENCIES2.3、ADD_TEST 与ENABLE_TESTING 指令。2.4、AUX_SOURCE_DIRECTORY2.5、CMAKE_MINIMUM_REQUIRED2.6、EXEC_PROGRAM2.7、FILE 指令2.8、INCLUDE 指令2.9、其他指令三、FIND_系列指令四、…

云计算 概念与技术

如果我倡导的计算机在未来得到使用&#xff0c;那么有一天&#xff0c;计算也可能像电话一样成为共用设施。计算机应用将成为一全新的、重要的产业的基础。 ——John McCarthy 云计算的概念 定义 Garther公司的定义 一种计算方式&#xff0c;能通过Internet技术将可扩展的和…

内核模块调试常用命令整理

一、 模块加载 1.1 最简单的一个驱动 static int __init my_driver_init( void ) {printk("init my_driver\n");return 0; }static void __exit my_driver_exit( void ) {printk("exit my_driver\n"); }module_init( my_driver_init ); module_exit( my_…

Xamarin.Forsm for Android 显示 PDF

背景 某些情况下&#xff0c;需要让用户阅读下发的文件&#xff0c;特别是红头文件&#xff0c;这些文件一般都是使用PDF格式下发&#xff0c;这种文件有很重要的一点就是不能更改。这时候就需要使用原文件进行展示。 Xamarin.Forms Android 中的 WebView 控件是不能直接显示的…

R统计绘图-NMDS、环境因子拟合(线性和非线性)、多元统计(adonis2和ANOSIM)及绘图(双因素自定义图例)

这个推文也在电脑里待了快一年了&#xff0c;拖延症患者&#xff0c;今天终于把它发出来了。NMDS分析过程已经R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程中写过了。最近又重新看了《Numerical Ecology with R》一书,巩固一下知识&#xff0c;正好重新整理了一下发出…

火山引擎推出一站式小程序监控方案

背景 小程序作为轻量级的应用发展迅速&#xff0c;国内已有多家小程序厂商相继推出。为了洞察用户真实体验及程序自身运行状况&#xff0c;监控已成为开发套件中必不可少的一环。随着业务愈来愈复杂&#xff0c;各厂商小程序管理后台免费提供的监控能力逐渐满足不了大部分业务…

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…

功能性材料深入超级赛道,赋能多行业迭代升级

中国国际胶粘剂及密封剂展览会深耕胶粘剂、密封剂和胶粘带行业26年&#xff0c;是行业认可的、优质的贸易与技术交流平台。展会连接了十几个行业的买家和卖家&#xff0c;包括汽车、电子、新能源、轨道交通、工业等重要领域&#xff0c;为客户提供封装、粘合、散热、装配制造等…

拿下宁王、迪王的湖南裕能,还能“狂飙”多远?

文|智能相对论作者|Kinki近日&#xff0c;磷酸铁锂正极材料龙头湖南裕能正式登陆A股&#xff0c;上市当天市值超过了400亿元&#xff0c;投资者中一签可赚1.49万元&#xff0c;可谓近年低迷的资本市场中一支“大肉签”。不过在 “开门红”之后&#xff0c;湖南裕能的股价便一路…

leetcode16. 最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&#xff1a;2 …

linux服务器上Docker中安装jenkins

前言 Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插件来支持构建、部署、自动化&#xff0c; 满足任何项目的需要。 本文主要提供通过docker安装jenkins镜像&#xff0c;并配置nginx反向代理页面配置和使用。通过jenkins完成项目的自动部署。 我在安装之前…