xgboost:线性增强器 gblinear 中使用了哪些参数?

xgboost: which parameters are used in the linear booster gblinear?

在网上看,我仍然对线性增压器 gblinear 到底是什么感到困惑,但我不是 alone

documentation 之后它只有 3 个参数 lambda、lambda_biasalpha - 也许它应该说 "additional parameters".

如果我理解正确,那么线性增强器会进行(相当标准的)线性增强(带正则化)。 在这种情况下,我只能理解上面的 3 个参数和 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

这是另一个 "path".

类似于 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

我不妨在gblinear 运行之间做一些深蹲,观察结果几乎每次都在变化,并声称做深蹲对算法有影响:)

严肃地说,gblinear 目前使用的算法不是您的"rather standard linear boosting"。造成随机性的是在每次迭代期间更新梯度时使用无锁并行化('hogwild')。设置种子不会影响任何东西;并且只有在 运行 单线程 (nthread=1) 时,您才能获得始终如一的可重现结果。我还建议不要使用默认的 nthread 设置 运行 它使用最大可能数量的 OpenMP 线程,因为在许多系统上它会由于线程拥塞而导致速度慢得多。 nthread 需要不高于物理核心数。

这种自由随机性可能会在某些情况下提高预测性能。但是,优点通常不会超过缺点。在某个时候,我将提交一个拉取请求,其中包含一个确定性并行化选项和一个在每个增强轮次中对功能选择进行一些额外控制的选项。

有关特定于助推器训练的所有可用参数的基本事实,请参阅 gbtree struct GBLinearTrainParam for gblinear and to the source of struct TrainParam 的来源。