Python xgboost:一些树只包含一个叶子节点(没有拆分)

时间:2018-03-09 06:47:36

标签: python-3.x xgboost

我使用xgboost 0.6中的Python 3.6.3包(在macOS Sierra 10.12.6上运行)拟合了极限渐变增强模型。当我检查树的转储时,我注意到许多树不包含任何分裂 - 它们只是单叶节点:

params={'colsample_bylevel':0.25,'gamma':3,'learning_rate':0.2,'max_depth':2,'n_estimators':250,'reg_alpha':0.5,'reg_lambda':3,'subsample':0.5}
model = XGBClassifier(**params, seed=12345, nthread=1, silent=True)
model.fit(X, y) # X and y are numpy arrays (13 predictors and an outcome)

tree_dump = model.get_booster().get_dump()
tree_dump[0]
Out[765]: '0:leaf=-0.387394\n'
tree_dump[1]
Out[766]: '0:leaf=-0.322484\n'
tree_dump[2]
Out[767]: '0:leaf=-0.285089\n'
tree_dump[3]
Out[768]: '0:leaf=-0.26167\n'
tree_dump[4]
Out[769]: '0:leaf=-0.240752\n'
tree_dump[5]
Out[770]: '0:leaf=-0.226565\n'
tree_dump[6]
Out[771]: '0:[f0<6.28879] yes=1,no=2,missing=1\n\t1:[f5<6.08075] yes=3,no=4,missing=3\n\t\t3:leaf=-0.21372\n\t\t4:leaf=0.00931895\n\t2:leaf=-0\n'

如上所示,前6棵树只是树叶。

这种行为是正常的吗?如果是这样,有多棵单叶树有什么意义?当然这些都可以减少到1个单左树?

1 个答案:

答案 0 :(得分:1)

我想我现在可以回答我自己的问题......考虑到我使用的超参数值,这种行为是可以预期的。

有13个预测变量且colsample_bylevel = 0.25,每棵树只抽取3个预测变量,这些预测变量可能不足以导致分裂。设置colsample_bylevel = 1.0会增加具有拆分的树的数量,但仍有一些只包含一个叶节点。

参数gammamin_child_weight控制叶节点的数量。设置colsample_bylevel = 1.0,gamma = 0和min_child_weight = 0,250个树中除1个之外的所有树都包含拆分。