【问题标题】:Python xgboost: some trees contain only a single leaf node (no splits)Python xgboost:一些树只包含一个叶子节点(没有分裂)
【发布时间】:2018-08-17 16:31:18
【问题描述】:

我使用Python 3.6.3 中的xgboost 0.6 包安装了一个极端梯度提升模型(在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 棵单左树吗?

【问题讨论】:

    标签: python-3.x xgboost


    【解决方案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 棵之外都包含拆分。

    【讨论】:

    • 你从哪里来的那些超参数。 . .他们对我来说似乎很糟糕。
    • @EranMoshe 我通过 10 倍交叉验证选择了它们。为什么说它们很糟糕?
    • 'colsample_bylevel':0.25 我通常会选择 0.75,但这取决于您拥有多少功能。 'learning_rate':0.2 可能会像 0.1 或 0.05 一样降低,并使用更多的 n_estimators 和“early_stopping”。关于 'reg_alpha':0.5,'reg_lambda':3 我不太了解。我没有在我的模型中调整它们
    • @EranMoshe 感谢您的建议!我确实尝试了您建议的超参数值(更高的列采样、更低的学习率和更多的树),但这些值是基于交叉验证 AUC 的最佳值。
    猜你喜欢
    • 2021-01-02
    • 2020-11-19
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2018-05-21
    • 2017-02-24
    相关资源
    最近更新 更多