xgboost介绍,xgboost全称
1.说明当我们的训练数据非常大并且不断增加的时候,我们每次都是用足训练量。数据太多,时间太长。这时,我们可以使用增量训练:用新加入的数据对模型进行微调和修正。
2.总量和增量的区别使用增量训练时,最关心的问题是:总量和增量的区别,以此来确定增量训练的使用场景。
假设有200条数据,第一次训练150条,第二次训练50条,直接训练200条的区别在于,当第二次训练50条时,前150条数据不再存在,模型更拟合后面的数据。如果我们定期进行增量训练,数据越接近当前时间,对模型的影响越大,这就是我们想要的。但如果最后一批数据质量很差,可能会覆盖前面正确例子的训练结果,使模型产生偏差。
同样,如果我们把数据按时间分成几份,然后从早到晚训练几次模型,每个模型都是在前一个模型的基础上训练的,间接参与到后面例子的权重中。
Xgboost提供了两种增量训练方法,一种是在当前迭代树的基础上增加一棵新树,原树保持不变;另一种是当前迭代树的结构不变,重新计算叶节点的权重,也可以添加新的树。
对于现有的决策树,早期的训练示例决定了模型的结构(选择哪些特征和分裂点),后期的示例决定了最终的结果(叶节点的权重和新添加的树)。
总结起来有两个关键点:一是模型训练了一半,然后突然换了一批完全不同的数据继续训练,早期的数据已经无法修正模型;其次,树一旦形成,结构就不会改变。后续的训练只能增加新树,重新计算前一棵树的节点权重。
在我看来,应该尽量用全量的数据进行训练。如果数据太多,需要增量,就要尽量保证增量数据的质量和数量(均匀分布),以免模型出现偏差。
3.例程xgboost在源代码中有一个增量训练例程:tests/python/test _ training _ continuation . py,其中核心部分稍微修改如下:
#-*-编码:utf-8-*-从sklearn.datasets导入XG boost作为XG BF导入load _ digits #训练数据XGB _ params _ 01={ } digits _ 2 class=load _ digits(2)X _ 2 class=digits _ 2 class[ data ]y _ 2 class=digits _ 2 class[ target ]dt train _ 2 class=XGB。DMatrix(X_2class,label=y _ 2 class)gbdt _ 03=Xgb . train(Xgb _ params _ 01,dtrain_2class,Num _ boost _ round=3)# model print(gbdt _ 03 . get _ dump())# model gbdt _ 03a=Xgb . train(Xgb _ params _ 01,dtrain _ 2class,num _ boost _ round=7,Xgb _ model=gbdt _ 03)# Continue training print(gbdt _ 03a . get _ dump())4.分析训练函数train()中有一个参数xgb_model,可以填充旧的模型路径或者模型指针。指定此参数后,新模型将在旧模型的基础上进行训练。
从代码的角度来看,增量训练的逻辑主要在python层面。与普通的训练模型相比,它只是实现了用C底层的旧模型填充学习者,而不是初始化学习者。
回想一下上一篇文章讨论的训练过程:代入实例预测——比较预测结果与实际结果的差异(误差函数)和误差方向(误差函数导数)——添加新的决策树来改进模型。继续培训也是如此。
从上面代码的输出结果可以看出,第一次转储的决策树是三棵,第二次转储产生了十棵(第一次三棵加上第二次七棵),前三棵和前面的完全一样。也就是说,增量训练后,原模型中的所有树都没有变化,只是后面增加了更多的树。
如果在params中设置了 process _ type: update , update: refresh 和 refresh _ leaf: true,则前三棵树的结构保持不变,叶节点的权重会发生变化,最终结果是七棵树(前三棵树更新,后四棵树新建)。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。