如何使用MLeval基于测试数据集绘制ROC曲线及解决名称属性报错
报错根源
names属性长度不匹配的报错,完全是传入evalm的输入格式不符合MLeval的硬性校验规则触发:
MLeval要求输入数据框必须满足两个结构要求:
- 最后一列是固定命名为
obs的真实标签列,不允许使用其他任意列名 - 其余列每列对应一个模型的预测概率,列名即为可视化时展示的模型名称
当前代码中data.frame(pred, test$class)生成的数据框,第二列是系统自动命名的test.class,并非要求的obs,函数内部尝试重命名列时,就会出现命名长度与实际列数不匹配的错误。
修正实现代码
# 加载数据 train <- readRDS(paste0("Data/train.rds")) test <- readRDS(paste0("Data/test.rds")) # 构建类别因子,训练集和测试集标签格式统一对齐 train$class <- factor(ifelse(train$class == 1, 'yes', 'no'), levels = c('no', 'yes')) test$class <- factor(ifelse(test$class == 1, 'yes', 'no'), levels = c('no', 'yes')) # 设置训练控制参数 ctrl <- trainControl(method = "cv", number = 5, returnResamp = 'none', summaryFunction = twoClassSummary(), classProbs = T, savePredictions = T, verboseIter = F) gbmGrid <- expand.grid(interaction.depth = 10, n.trees = 18000, shrinkage = 0.01, n.minobsinnode = 4) # 训练梯度提升机模型 set.seed(5627) gbm <- train(class ~ ., data = train, method = "gbm", metric = "ROC", tuneGrid = gbmGrid, verbose = FALSE, trControl = ctrl) # 预测测试集正类概率 pred <- predict(gbm, newdata = test, type = "prob")[,"yes"] # 构造符合MLeval规范的输入数据框 eval_input <- data.frame( GBM_test = pred, obs = test$class ) # 生成测试集ROC曲线 roc <- evalm(eval_input)
关键注意事项
- 禁止将未手动指定列名的向量直接拼入输入数据框,系统自动生成的
test.xxx格式列名一定会触发MLeval的内部校验错误 obs列必须为双水平因子类型,不能是原始数值标签、无水平对齐的字符串标签,否则函数会无法识别正负类,导致AUC计算失败- 若需在同一张图中叠加多个模型的测试集ROC曲线,仅需在数据框中依次新增对应模型的预测概率列,保持最后一列为
obs即可,无需调整其他参数
内容的提问来源于stack exchange,提问作者SB21
相关产品推荐
相关产品推荐

