我正在尝试针对具有非常嘈杂的功能的问题运行 xgboost,并且有兴趣根据我定义的自定义 eval_metric 停止轮数。
根据领域知识,我知道当 eval_metric(根据训练数据评估)超过某个值时,xgboost 会过度拟合。而且我想只采用特定轮数的拟合模型,而不是进一步进行。
实现这一目标的最佳方法是什么?
这将在某种程度上符合早期停止标准,但不完全一致。
或者,是否有可能从中间轮中获得模型?
这是一个可以通过问题更好地解释的示例。(使用 xgboost 帮助文档附带的玩具示例并使用默认的 eval_metric)
library(xgboost)
data(agaricus.train, package='xgboost')
train <- agaricus.train
bstSparse <- xgboost(data = train$data, label = train$label, max.depth = 2, eta = 1, nthread = 2, nround = 5, objective = "binary:logistic")
这是输出
[0] train-error:0.046522
[1] train-error:0.022263
[2] train-error:0.007063
[3] train-error:0.015200
[4] train-error:0.007063
现在让我们从领域知识中说,我知道一旦训练误差低于 0.015(在这种情况下是第三轮),任何进一步的轮次只会导致过度拟合。我将如何在第三轮之后停止训练过程并掌握训练好的模型以使用它来预测不同的数据集?
我需要在许多不同的数据集上运行训练过程,并且我不知道要训练多少轮才能使错误低于固定数字,因此我无法将 nrounds 参数设置为预定值。我唯一的直觉是,一旦训练误差低于某个数字,我就需要停止进一步的训练。