在进行分类设置(Python)的XGBoost增量学习时出现错误。

3

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' 的作用吗? - Eran Moshe
我认为我更或多或少地理解了这个参数的作用。基本上,我想通过分批添加新数据来更新先前的模型拟合。您知道如何修改以前的代码以实现此目的吗?我已经按照以下教程的相同过程进行了操作,该教程尝试在回归设置而不是分类设置中实现与我相同的事情:https://gist.github.com/ylogx/53fef94cc61d6a3e9b3eb900482f41e0 - Daniel Bestard
1
kwarg update 应该改为 updater - Fortunato
2个回答

0

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

当我增量训练旧模型时,我遇到了相同的错误消息。在我的情况下,旧模型是使用参数{'tree_method': 'exact'}进行训练的,但我正在使用{'tree_method': 'hist'}进行更新。将tree_method更改为exact后,问题得到解决。

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

(还要记得像@Fortunato在评论中提到的那样,将kwarg update更改为updater


-2

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

从文档中:

process_type,[默认值=“default”]

要运行的增强过程类型。 选择:{‘default’,‘update’} ‘default’:创建新树的正常增强过程。 ‘update’:从现有模型开始,仅更新其树。在每个增强迭代中,从初始模型中取出一棵树,对该树运行指定的更新程序插件序列,并将修改后的树添加到新模型中。新模型将具有相同或更少的树,具体取决于执行的增强迭代数。目前,以下内置更新程序插件可以与此过程类型有意义地使用:“refresh”,“prune”。使用“update”时,不能使用创建新树的更新程序插件。


3
这并没有回答问题,只是复制了关于process_type的文档,没有解释如何改进问题中的代码。 - Fortunato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接