R语言XGBoost参数详解
引言
XGBoost算法在Kaggle和天池数据科学竞赛中备受数据科学竞赛者的推崇,据说在Kaggle数据科学竞赛中有一半的获奖者使用了XGBoost算法。下面主要介绍XGBoost算法的参数。
XGBoost算法原理
参数详解
本篇博客的目的是尽最大可能讲清楚XGBoost中的每一个参数
,当然如果哪里有不对的地方欢迎大家指正出来
.
对于主要参数的一些解读:
控制过拟合
eta(学习率)
:学习率是用来约束booster
的预测值,比如在XGBoost
模型中第一个booster
对第一个样本的预测值为4.0,如果设置eta
的值为0.1
,那么对于第一个样本的预测在此学习率下是0.4
.
max_depth
:控制树的深度,当树的深度过大时存在过拟合问题,同时XGBoost
会使用大量的内存.
min_child_weight
:最小的叶节点的权重,如果在树的某一次分裂中使得分裂后叶节点的weight
小于min_child_weight
,则停止这一步的分裂.
gamma
:在一棵树的叶节点上创建一个新的分支时要求的最小loss减少值.
抽样使得模型更加稳健
subsample
:训练实例中的子样本比例,如果将subsample
设置为0.5,将意味着在训练过程中XGBoost
会随机抽取50%
的数据进行训练.并且在之后的每次建立新的树模型时都会抽50%
的样本.
colsample_bytree
:在创建一棵树的同时对列进行抽样.
colsample_bylevel
:控制每一层的采样比例.
colsample_bynode
:控制叶节点分裂时的采样比例.
lambda
:在线性分类器中对权重的L2正则化的值.
alpha
:在线性分类器中对权重的L1正则化的值.
lambda_bias
:在线性分类器中对偏差L1正则化的值.
学习任务参数
reg:squarederror
:均方根误差, 1 n ∑ i = 1 n ( y i − y i ^ ) 2 \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_{i}-\hat{y_{i}})^{2}} n1∑i=1n(yi−yi^)2.
reg:squaredlogerror
:均方根对数误差, 1 n ∑ i = 1 n ( l o g ( y i + 1 ^ ) − l o g ( y i + 1 ) ) 2 \sqrt{\frac{1}{n}\sum_{i=1}^{n}(log(\hat{y_{i}+1})-log(y_{i}+1))^{2}} n1∑i=1n(log(yi+1^)−log(yi+1))2.
reg:logistic
:分类问题中的logistic函数.
reg:pseudohubererror
:Pseudo Huber损失函数.
binary:logistic
:二分类问题中逻辑回归输出概率.
binary:logitraw
:二分类问题中逻辑回归输出经过logistic转换前的值.
binary:hinge
:svm的目标函数,其输出是0或者1.
count:poisson
:计数数据的泊松回归,输出为泊松分布的均值.
survival:cox
:半参数COX回归
multi:softmax
:多分类问题中的softmax回归.
multi:softprob
:softmax的输出为ndata*nclass
.
rank:pairwise
:pairwise模型
rank:ndcg
:listwise模型
rank:map
:pointwise模型
reg:tweedie
:tweedie回归
base_score
:对于所有样本预测为正样本的全局偏置(the initial prediction score of all instances, global bia)。如果迭代次数够多,改变这个参数对结果不会有影响。
eval_metric
:验证数据的评估指标,具体请参考以下链接:
XGBoost参数
verbosity
:打印信息的详细程度.
nthread
:并行计算的核数。默认使用最大.
watchlist
:用于评估模型性能的训练集与测试集.
nrounds
:基模型的数量.
callbacks
:在每次的建立基模型之后会对基模型进行回调。其中包括参数,预测值等。
以上主要是回顾了XGBoost
中的一些主要参数,希望可以帮助到大家.
示例
> library(xgboost)
> data(agaricus.train, package='xgboost')
> data(agaricus.test, package='xgboost')
> dtrain <- with(agaricus.train, xgb.DMatrix(data, label = label))
> dtest <- with(agaricus.test, xgb.DMatrix(data, label = label))
> watchlist <- list(train = dtrain, eval = dtest)
>
> param <- list(max_depth = 2, eta = 1, verbosity = 0, nthread = 2,
+ objective = "binary:logistic", eval_metric = "auc")
> bst <- xgb.train(param, dtrain, nrounds = 2, watchlist)
[1] train-auc:0.958228 eval-auc:0.960373
[2] train-auc:0.981413 eval-auc:0.979930
>
> str(bst)
List of 9
$ handle :Class 'xgb.Booster.handle' <externalptr>
$ raw : raw [1:5756] 7b 4c 00 00 ...
$ niter : num 2
$ evaluation_log:Classes ‘data.table’ and 'data.frame': 2 obs. of 3 variables:
..$ iter : num [1:2] 1 2
..$ train_auc: num [1:2] 0.958 0.981
..$ eval_auc : num [1:2] 0.96 0.98
..- attr(*, ".internal.selfref")=<externalptr>
$ call : language xgb.train(params = param, data = dtrain, nrounds = 2, watchlist = watchlist)
$ params :List of 7
..$ max_depth : num 2
..$ eta : num 1
..$ verbosity : num 0
..$ nthread : num 2
..$ objective : chr "binary:logistic"
..$ eval_metric : chr "auc"
..$ validate_parameters: logi TRUE
$ callbacks :List of 2
..$ cb.print.evaluation:function (env = parent.frame())
.. ..- attr(*, "call")= language cb.print.evaluation(period = print_every_n)
.. ..- attr(*, "name")= chr "cb.print.evaluation"
..$ cb.evaluation.log :function (env = parent.frame(), finalize = FALSE)
.. ..- attr(*, "call")= language cb.evaluation.log()
.. ..- attr(*, "name")= chr "cb.evaluation.log"
$ feature_names : chr [1:126] "cap-shape=bell" "cap-shape=conical" "cap-shape=convex" "cap-shape=flat" ...
$ nfeatures : int 126
- attr(*, "class")= chr "xgb.Booster"
> bst$evaluation_log
iter train_auc eval_auc
1: 1 0.9582280 0.9603733
2: 2 0.9814132 0.9799301
根据最终的结果可以看到随着基模型数量的增加,对训练集与测试集的预测越来越好。
使用自定义的评价函数检测模型的预测效果
:
> logregobj <- function(preds, dtrain) {
+ labels <- getinfo(dtrain, "label")
+ preds <- 1/(1 + exp(-preds))
+ grad <- preds - labels
+ hess <- preds * (1 - preds)
+ return(list(grad = grad, hess = hess))
+ }
> evalerror <- function(preds, dtrain) {
+ labels <- getinfo(dtrain, "label")
+ err <- as.numeric(sum(labels != (preds > 0)))/length(labels)
+ return(list(metric = "error", value = err))
+ }
>
> param <- list(max_depth = 2, eta = 1, verbosity = 0, nthread = 2,
+ objective = logregobj, eval_metric = evalerror)
> bst <- xgb.train(param, dtrain, nrounds = 2, watchlist)
[1] train-error:0.046522 eval-error:0.042831
[2] train-error:0.022263 eval-error:0.021726
>
同样的随着基模型数量的增加,模型的错误率也在下降。
对不同的基模型设置不同的学习率
:
> param <- list(max_depth = 2, eta = 1, verbosity = 0, nthread = 2,
+ objective = "binary:logistic", eval_metric = "auc")
> my_etas <- list(eta = c(0.5, 0.1))
> bst <- xgb.train(param, dtrain, nrounds = 2, watchlist,
+ callbacks = list(cb.reset.parameters(my_etas)))
[1] train-auc:0.958228 eval-auc:0.960373
[2] train-auc:0.992347 eval-auc:0.994009
early_stopping_rounds
:
bst <- xgb.train(param, dtrain, nrounds = 25, watchlist,
early_stopping_rounds = 4)
[1] train-auc:0.958228 eval-auc:0.960373
Multiple eval metrics are present. Will use eval_auc for early stopping.
Will train until eval_auc hasn't improved in 4 rounds.
[2] train-auc:0.981413 eval-auc:0.979930
[3] train-auc:0.997070 eval-auc:0.998518
[4] train-auc:0.998757 eval-auc:0.998943
[5] train-auc:0.999298 eval-auc:0.999830
[6] train-auc:0.999585 eval-auc:1.000000
[7] train-auc:0.999585 eval-auc:1.000000
[8] train-auc:0.999916 eval-auc:1.000000
[9] train-auc:0.999916 eval-auc:1.000000
[10] train-auc:1.000000 eval-auc:1.000000
Stopping. Best iteration:
[6] train-auc:0.999585 eval-auc:1.000000
以下就是关于XGBoost
的部分示例,后续会借助Kaggle
数据科学竞赛的例子来比较XGBoost、lightGBM、catBoost
三种集成算法的效果。