每次我使用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修剪过的节点"信息。如何生成一些我得到一些修剪过的节点的情况?
答案 0 :(得分:2)
您将使用正则化修剪节点!使用gamma
参数!
目标函数包含两部分:训练损失和正则化。
XGBoost中的正则化由三个参数控制:alpha
,lambda
和gamma
(doc):
alpha [default = 0]关于权重的L1正则化项,增加此值 价值会使模型更加保守。
lambda [default = 1]关于权重的L2正则化项,增加这个 价值会使模型更加保守。
gamma [default = 0]进一步减少所需的最小损失 树的叶节点上的分区。越大越多 保守的算法将是。范围:[0,∞]
alpha
和beta
只是权重的L1和L2惩罚,不应影响修剪。
但是gamma
是调整以获得修剪节点的参数。你应该增加它来获得修剪过的节点。注意它取决于目标函数,并且它可能需要高达10000或更高的值才能获得修剪的节点。调整伽玛很棒!它会使XGBoost收敛!这意味着在一定次数的迭代之后,训练和测试分数在随后的迭代中不会改变(新树的所有节点都将被修剪)。最后,控制套装是一个很好的开关!
请参阅Introduction to Boosted Trees以获取gamma
的确切定义。