我创建了一个自定义错误度量标准,该度量标准在运行XGBoost xgb.train时显示,但实际上对输出没有任何影响。据我所知,它只是为该回合打印自定义错误度量,而没有使用它来确定准确性。
我认为这是因为预测输出与使用默认误差度量时的输出完全相同。我还尝试将错误输出硬编码为静态1,以便输出应该是随机的,但结果完全相同。
我需要创建一个自定义目标函数以使自定义错误度量有效吗?
谢谢!
我的代码:
# xgboost fitting with arbitrary parameters
xgb_params_1 = list(
objective = "reg:linear",
eta = 0.2,
max.depth = 6,
booster = "gbtree"
)
evalerror <- function(preds, dtrain) {
labels <- getinfo(dtrain, "label")
score <- as.numeric((sum(preds[1:1000]) - sum(labels[1:1000] )) / sum(labels[1:1000]) )
return(list(metric="custom_error",value=1))
}
myWatch <- list(val=dvalid,train=dtrain)
# fit the model with the arbitrary parameters specified above
xgb_1 = xgb.train(data = dtrain,
params = xgb_params_1,
nrounds = 150,
nthread = 6,
verbose = T,
print_every_n = 50,
watchlist = myWatch,
early_stop_round = 1000,
eval_metric = evalerror,
disable_default_eval_metric = 1
)
# Perform a prediction
pred <- predict(xgb_1, dvalid)
results <- cbind(as.data.table(pred), as.data.table(data[year > trainEndDate,"total_installs"]))
#Compute test RMSE
sqrt(mean((results$pred - results$total_installs)**2))
打印的错误指标:
答案 0 :(得分:1)
自定义eval_metric
仅用于评估目的。它在每个回合中显示(使用手表时),对调整增强回合数很有用,并且在进行交叉验证以调整参数以最大化/最小化指标时可以使用它。我特别用它来调整学习速度,以使模型收敛更快,并减少回合。
自定义目标函数是完全不同的野兽,它与评估指标不同。它更像是模型的一种,例如分类,回归等。它推动了模型的收敛。如果您仍然需要,这里是xgboost regression objective的示例。