xgboost: gblinear 线性 booster 使用哪些参数?

3

在网上搜索后,我仍然对线性增强器 gblinear 的具体含义感到困惑,而且我并不是孤单的(参见)

根据文档,它只有3个参数: lambda, lambda_biasalpha - 也许应该说"额外的参数"。

如果我理解正确,那么线性增强器执行(相当标准的)线性提升(带有正则化)。在这种情况下,我只能理解上面的三个参数和 eta (提升率)。这也是在github上如何描述的。

尽管如此,我发现参数gammamax_depthmin_child_weight也会影响算法。

这怎么可能呢?是否有一个完全清晰的线性增强器的描述可以在网上找到?

请查看我的示例:

library(xgboost)

data(agaricus.train, package='xgboost')
data(agaricus.test, package='xgboost')
train <- agaricus.train
test <- agaricus.test

接下来是设置过程。
set.seed(100)
model <- xgboost(data = train$data, label = train$label, nrounds = 5, 
                 objective = "binary:logistic", 
                 params = list(booster = "gblinear", eta = 0.5, lambda = 1, lambda_bias = 1,gamma = 2,
                               early_stopping_rounds = 3))

提供

> [1]   train-error:0.018271  [2]   train-error:0.003071 
> [3]   train-error:0.001075  [4]   train-error:0.001075 
> [5]   train-error:0.000614

gamma=1

set.seed(100)
model <- xgboost(data = train$data, label = train$label, nrounds = 5, 
                 objective = "binary:logistic", 
                 params = list(booster = "gblinear", eta = 0.5, lambda = 1, lambda_bias = 1,gamma = 1,
                               early_stopping_rounds = 3))

导致
> [1]   train-error:0.013051  [2]   train-error:0.001842 
> [3]   train-error:0.001075  [4]   train-error:0.001075 
> [5]   train-error:0.001075

这是另一种“路径”。

max_depth 同理:

set.seed(100)
model <- xgboost(data = train$data, label = train$label, nrounds = 5, 
                 objective = "binary:logistic", 
                 params = list(booster = "gblinear", eta = 0.5, lambda = 1, lambda_bias = 1, max_depth = 3,
                               early_stopping_rounds = 3))

> [1]   train-error:0.016122  [2]   train-error:0.002764 
> [3]   train-error:0.001075  [4]   train-error:0.001075 
> [5]   train-error:0.000768

并且

set.seed(100)
model <- xgboost(data = train$data, label = train$label, nrounds = 10, 
                 objective = "binary:logistic", 
                 params = list(booster = "gblinear", eta = 0.5, lambda = 1, lambda_bias = 1, max_depth = 4,
                               early_stopping_rounds = 3))

> [1]   train-error:0.014740  [2]   train-error:0.004453 
> [3]   train-error:0.001228  [4]   train-error:0.000921 
> [5]   train-error:0.000614

在这方面,我认为xgboost R包的文档不可靠。虽然Python文档将lambda和alpha列为线性和树提升器的参数,但R包仅将它们列为线性提升器的参数。我认为在这种情况下跟随Python文档是合理的。 - user3283722
@user3283722 这是一个旧问题。我目前的理解是,lambda和alpha只对线性增强器有意义... - Richi W
1个回答

3

在运行gblinear时,我可以在跑步之间做一些深蹲,观察结果几乎每次都会改变,并声称做深蹲对算法有影响 :)

说正经的,gblinear目前使用的算法并不是你所说的“相当标准的线性增强”。导致随机性的原因是在每次迭代更新梯度时使用了无锁并行化('hogwild')。设置种子不会影响任何东西;只有在单线程(nthread=1)运行时才能获得一致可重现的结果。我也建议不要使用默认的nthread设置,因为它使用了最大可能数量的OpenMP线程,在许多系统上会因线程拥塞而导致速度明显变慢。 nthread 的值不能高于物理核心数。

这种自由的随机性可能会在某些情况下提高预测性能。然而,优点往往不足以抵消缺点。在某个时候,我将提交一个拉取请求,其中包括确定性并行化选项以及在每次增强轮中对特征选择进行一些额外控制的选项。

有关所有与booster训练相关的可用参数的真实信息,请参考gblinear的struct GBLinearTrainParam源代码和gbtree的struct TrainParam源代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接