R语言XGBoost自定义评估指标返回值恒为0问题排查
问题原因
- XGBoost使用
objective = "binary:logistic"时,训练过程中传入feval自定义评估函数的preds参数是未经过sigmoid激活的对数几率(log-odds)值,并非你最后调用predict输出的0~1区间概率值。 - 你写的判定逻辑
preds-0.05<0.20要求预测值大于0.25才会返回非0结果,但训练阶段拿到的log-odds值远低于0.25,所有值都会被判定为0,因此迭代过程中指标全程显示为0。
解决方案
在自定义评估函数中先将传入的log-odds值转换为0~1概率值,R中可以直接调用plogis()函数完成该转换。
修改后的代码
仅需要替换你原有的my_metric函数即可:
my_metric <- function(preds, dtest){ # 先把log-odds转为概率 preds_prob <- plogis(preds) g <- c(0.75,1.5) c <- ifelse(preds_prob - 0.05 < 0.20, 0, preds_prob) d <- c * g result_matrix <- sum(d) return(list(metric = "result", value = result_matrix)) }
修改后重新运行代码,第100轮的评估指标值就会和你预期的0.3299713一致。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

