Xgboost之增量学习
日常处理数据过程中,我们会遇到新数据的增加这个问题,我们既想增加新数据,又想利用原先的模型,迁移学习和增量学习就应运而生了
增量学习可以分为3类:样本增量学习(SIL),类别增量学习(CIL),特征增量学习(FIL)
1、SIL
问题:由于新数据的各种原因,样本的特征值可能会改变,每个类别的比例也会改变。这些都会影响分类的准确率。
任务:因此,需要确保在现有知识的情况下,通过新样本的增量学习来提取新知识,融合新旧知识以提高分类的准确性。
2、 CIL
任务:识别新类,并将其加入现有类别的集合中,提升分类的准确性和智能。
3、FIL
一些新的属性特征能够将分类提升到一个很大的程度,并提升分类准确率。
任务:在现有特征空间的基础上,加入新的属性特征,构建新的特征空间,提升分类准确率。
Xgboost提供两种增量训练的方式,一种是在当前迭代树的基础上增加新树,原树不变;另一种是当前迭代树结构不变,重新计算叶节点权重,同时也可增加新树。
对于已存在的决策树,早期训练的实例决定了模型的结构(选择哪些特征及分裂点),后期的实例决定最终的结果(叶节点的权重和新加入的树)。
两个重点:
第一,模型训练了一半,突然换了一批完全不同的数据继续训练,早期数据不再能再校正模型;
第二,树一旦形成,结构就不再变化,后续的训练只能增加新树和重新计算前树的节点权重。
xgboost源码中有增量训练的例程:tests/python/test_training_continuation.py,其中核心部分稍做修改如下【1,3】:
# -*- coding: utf-8 -*-
import xgboost as xgb
from sklearn.datasets import load_digits # 训练数据
xgb_params_01 = {}
digits_2class = load_digits(2)
X_2class = digits_2class['data']
y_2class = digits_2class['target']
dtrain_2class = xgb.DMatrix(X_2class, label=y_2class)
gbdt_03 = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=3) # 训练三棵树的模型
print(gbdt_03.get_dump()) # 显示模型
gbdt_03a = xgb.train(xgb_params_01, dtrain_2class, num_boost_round=7, xgb_model=gbdt_03) # 在原模型基础上继续训练
print(gbdt_03a.get_dump())
增量学习与迁移学习
在概念上,增量学习与迁移学习最大的区别就是对待旧知识的处理,增量学习在学习新知识的同时需要尽可能保持旧知识,不管它们类别相关还是不相关的,而迁移学习则只是借助旧知识来学习新知识,学习完成后只关注在新知识上的性能,不再考虑在旧知识上的性能。
这个链接还需要重视一波,提供了很多xgboost的使用方法
xgboost/test_training_continuation.py at master · dmlc/xgboost (github.com)
1.Xgboost之增量学习_xieyan0811的博客-CSDN博客_xgboost 增量训练
2.浅谈迁移学习,增量学习Chris_zhangrx的博客-CSDN博客增量学习和迁移学习
3.xgboost/test_training_continuation.py at master · dmlc/xgboost (github.com)