在 XGBoost 中为分类设置应用增量学习时出错(python)

Posted

技术标签:

【中文标题】在 XGBoost 中为分类设置应用增量学习时出错(python)【英文标题】:Error when applying incremental learning in XGBoost for a classification setting (python) 【发布时间】:2018-08-15 16:10:20 【问题描述】:

Python 版本:3.5 // xgboost 版本:0.7.post3

大家好,

我正在尝试在 python 中使用 xgboost 模块 实现增量学习,其中我的目标变量是二进制。我想我应该设置参数“process_type”:“update”。问题是我遇到了一个我无法解决的错误。在这里,我使用来自 sklearn 的乳腺癌数据集放置了我的代码的示例实现,因此每个人都可以尝试一下。有谁知道我可以如何防止以下错误的发生?

from sklearn import datasets
import xgboost

X_all = datasets.load_breast_cancer().data
y_all = datasets.load_breast_cancer().target

X_first_half = X_all[0:280,:]
X_second_half = X_all[280:,:]
y_first_half = y_all[0:280]
y_second_half = y_all[280:]

model1 = xgboost \
    .train('objective': 'binary:logistic',
           dtrain=xgboost.DMatrix(X_first_half, y_first_half),
           xgb_model=None)

model2 = xgboost \
    .train('objective': 'binary:logistic',
            'process_type': 'update',
            'update': 'refresh',
            'refresh_leaf': True,
           dtrain=xgboost.DMatrix(X_second_half, y_second_half),
           xgb_model=model1)

我得到的错误是:

XGBoostError: b'[15:03:03] src/tree/updater_colmaker.cc:118:
Check failed: tree.param.num_nodes == tree.param.num_roots (19 vs. 1)
ColMaker: can only grow new tree\n\nStack trace returned 1 entries:\n[bt] (0)

【问题讨论】:

你明白 'process_type': 'update' 是做什么的吗? 我想我或多或少地理解了这个论点在做什么。基本上,我想通过批量添加新数据来更新以前的模型拟合。你知道如何修改之前的代码来实现这个吗?我遵循了与以下教程相同的过程,它试图实现与我相同的事情,但在回归设置而不是分类设置中:gist.github.com/ylogx/53fef94cc61d6a3e9b3eb900482f41e0 kwarg update 应该改为updater 【参考方案1】:

我认为他正在尝试实现一种批量训练,我的意思是使用新数据点进一步训练模型,而不向集成中添加更多树。换句话说,将当前的树/叶子更新为新的数据点。

来自文档:

process_type, [default='default']

一种要运行的提升过程。 选择:‘默认’、‘更新’ ‘default’:创建新树的正常提升过程。 ‘update’:从现有模型开始,只更新它的树。在每次提升迭代中,从初始模型中获取一棵树,为该树运行指定的更新插件序列,并将修改后的树添加到新模型中。新模型将具有相同或更少数量的树,具体取决于执行的提升迭代次数。目前,以下内置更新程序插件可以有意义地用于此进程类型:“刷新”、“修剪”。使用“更新”,不能使用创建新树的更新插件。

【讨论】:

这没有回答问题,它只是复制了process_type 的文档,而没有解释如何改进问题中的代码【参考方案2】:

这是一个老问题,但如果有人仍然面临同样的问题,请尝试调整 tree_method 参数。

我在增量训练旧模型时收到了相同的错误消息。就我而言,旧模型使用参数'tree_method': 'exact' 进行了训练,但我使用'tree_method': 'hist' 对其进行了更新。将tree_method改成exact后问题解决。

或者,如果您能够更新 xgboost,只需更新到 > 1.0 的版本也应该可以解决问题。作为低级别的num_roots 参数,在更高版本中导致此错误was removed。

(还记得将粘贴代码中的kwarg update 更改为updater,如评论中提到的@Fortunato。)

【讨论】:

以上是关于在 XGBoost 中为分类设置应用增量学习时出错(python)的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost 错误 - 提供分类类型时,DMatrix 参数 `enable_categorical` 必须设置为 `True`

机器学习--xgboost从初识到应用

机器学习分类算法之XGBoost(集成学习算法)

SQL Server 2005:在两个主键之一上设置自动增量时出错

技术分享 | 机器学习-浅谈XGBoost算法

GBDT XGBOOST的区别与联系