我在 R 中使用 xgboost 包,并在 75 轮时提前停止。为了监控进度,我在每轮之后打印来自训练和测试集的 F1 分数。算法完成 75 轮后,xgboost 返回测试集上得分最高的模型,而不是训练集。我的猜测是这与 xgboost 的监控功能和监视列表参数有关
我在训练期间让算法访问测试集的意图(使用监视列表参数)是为了监控训练进度,而不是选择相对于测试集表现最好的分类器。那会是作弊吧?我的问题有两个:
- 这真的是作弊吗?
如果是作弊,
- 为什么它被编程到 xgboost 包中?
我在 R 中使用 xgboost 包,并在 75 轮时提前停止。为了监控进度,我在每轮之后打印来自训练和测试集的 F1 分数。算法完成 75 轮后,xgboost 返回测试集上得分最高的模型,而不是训练集。我的猜测是这与 xgboost 的监控功能和监视列表参数有关
我在训练期间让算法访问测试集的意图(使用监视列表参数)是为了监控训练进度,而不是选择相对于测试集表现最好的分类器。那会是作弊吧?我的问题有两个:
如果是作弊,
那不是作弊。如果您的测试集是您要对其进行预测的未来数据的代表性样本,那么您将希望那里的错误尽可能低!
相反,如果您在训练集上最大化性能,您可能会过拟合。增强算法很容易无意中记住其训练数据,而不是学习输入到输出的有意义的映射。
根据下面的评论,您描述的“测试集”实际上就像这里的验证集一样运作。
xgboost 中的 early stop 和 watchlist 参数可用于防止过拟合。如果监视列表有两个数据集,则算法将执行此处所述的保留验证。
将测试集放在关注列表中将导致算法选择对测试集具有最佳性能的模型,这可以被视为作弊。
我这样称呼我的算法
train <- data[selection,]
test <- data[-selection,]
watchlist <- list(train=train,test=test)
bstSparse <- xgb.train(data=train,
...,
watchlist=watchlist,
early_stopping_rounds=75)
但我应该这样称呼它
train_and_val <- data[selection,]
inds <- createDataPartition(temp_and_val$labels, p = 0.9)
train <- train_and_val[inds,]
validation <- train_and_val[-inds,]
test <- data[-selection,]
watchlist <- list(validation=validation,train=train)
bstSparse <- xgb.train(data=train,
...,
watchlist=watchlist,
early_stopping_rounds=75)
我发现这篇文章对于提早停止和 xgboost 非常有用