相关问题here和here。调整xgboost(即nrounds)的常用方法是使用执行k-fold交叉验证的xgb.cv,例如:
require(xgboost)
data(iris)
set.seed(1)
index = sample(1:150)
X = as.matrix(iris[index, 1:4])
y = as.matrix(as.numeric(iris[index, "Species"])) - 1
param = list(eta=0.1, objective="multi:softprob")
xgb.cv(params=param, data=X, nrounds=50, nfold=5, label=y, num_class=3)
> train.merror.mean train.merror.std test.merror.mean test.merror.std
> 1: 0.021667 0.009501 0.040000 0.043461
> 2: 0.018333 0.006972 0.033333 0.047141
> 3: 0.018333 0.006972 0.033333 0.047141
> 4: 0.018333 0.006972 0.033333 0.047141
无论如何,我想调整xgboost提供验证集。使用xgb.cv
无法做到这一点。看来这可以使用xgb.train
:
require(xgboost)
data(iris)
set.seed(1)
index = sample(1:150)
indexTrain = index[1:100]
indexValid = index[101:150]
Xtrain = as.matrix(iris[indexTrain, 1:4])
Xvalid = as.matrix(iris[indexValid, 1:4])
yTrain = as.numeric(iris[indexTrain, "Species"]) - 1
yValid = as.numeric(iris[indexValid, "Species"]) - 1
train = xgb.DMatrix(Xtrain, label=yTrain)
valid = xgb.DMatrix(Xvalid, label=yValid)
param = list(eta=0.1, objective="multi:softprob")
watchlist = list(eval=valid, train=train)
model = xgb.train(params=param, data=train, nround=40, watchlist=watchlist,
num_class=3)
>[0] eval-merror:0.060000 train-merror:0.020000
>[1] eval-merror:0.060000 train-merror:0.030000
>[2] eval-merror:0.060000 train-merror:0.020000
>[3] eval-merror:0.060000 train-merror:0.020000
事实上,在使用xgb.traing进行训练时,可以观察控制台中打印的评估错误。无论如何,由于model
的唯一属性是handle
和raw
,似乎此信息丢失了。
问题1:如何检索控制台中打印的验证错误的向量?
问题2:如何检索单个验证错误的标准错误的向量,例如xgb.cv
产生的错误?
EDIT1:在第58和59行here中,作者似乎能够提取验证错误。无论如何,我无法适应对虹膜数据集做同样的事情。
EDIT2:另一个(未答复的)严格相关的问题here