在 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 kwargupdate
应该改为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`