我使用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个单左树?
答案 0 :(得分:1)
我想我现在可以回答我自己的问题......考虑到我使用的超参数值,这种行为是可以预期的。
有13个预测变量且colsample_bylevel
= 0.25,每棵树只抽取3个预测变量,这些预测变量可能不足以导致分裂。设置colsample_bylevel
= 1.0会增加具有拆分的树的数量,但仍有一些只包含一个叶节点。
参数gamma
和min_child_weight
控制叶节点的数量。设置colsample_bylevel
= 1.0,gamma
= 0和min_child_weight
= 0,250个树中除1个之外的所有树都包含拆分。