输出除修剪节点以外的其他节点' 0

时间:2016-09-08 15:14:57

标签: python xgboost

每次我使用xgboost(不仅仅是python),训练信息总是包含" 0修剪过的节点"在每一行。例如:

import pandas as pd
from sklearn import datasets
import xgboost as xgb
iris = datasets.load_iris()
dtrain = xgb.DMatrix(iris.data, label = iris.target)
params = {'max_depth': 10, 'min_child_weight': 0, 'gamma': 0, 'lambda': 0, 'alpha': 0}
bst = xgb.train(params, dtrain)

输出包括一长串语句,如

[11:08:18] src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 16 extra nodes, 0 pruned nodes, max_depth=5

我已经使用了几种调整参数组合,但我总是得到这个" 0修剪过的节点"信息。如何生成一些我得到一些修剪过的节点的情况?

1 个答案:

答案 0 :(得分:2)

您将使用正则化修剪节点!使用gamma参数!

目标函数包含两部分:训练损失和正则化。 XGBoost中的正则化由三个参数控制:alphalambdagammadoc):

  

alpha [default = 0]关于权重的L1正则化项,增加此值   价值会使模型更加保守。

     

lambda [default = 1]关于权重的L2正则化项,增加这个   价值会使模型更加保守。

     

gamma [default = 0]进一步减少所需的最小损失   树的叶节点上的分区。越大越多   保守的算法将是。范围:[0,∞]

alphabeta只是权重的L1和L2惩罚,不应影响修剪。

但是gamma是调整以获得修剪节点的参数。你应该增加它来获得修剪过的节点。注意它取决于目标函数,并且它可能需要高达10000或更高的值才能获得修剪的节点。调整伽玛很棒!它会使XGBoost收敛!这意味着在一定次数的迭代之后,训练和测试分数在随后的迭代中不会改变(新树的所有节点都将被修剪)。最后,控制套装是一个很好的开关!

请参阅Introduction to Boosted Trees以获取gamma的确切定义。