R使用multi_roc绘制多分类SVM的ROC曲线因测试集缺类报错咨询
报错触发的核心逻辑
multi_roc函数计算单类ROC时,需要某一类同时存在正例、负例才能通过插值生成连续的曲线坐标。你的测试集中没有任何ok类的真实样本,对应ok_true列全为0,计算ok类的ROC时,所有样本都被标记为负例,最终插值环节仅能得到1个有效点,不满足内置approx()函数要求的“至少2个非NA值才能插值”的条件,直接触发计算错误。
注:这种场景下强行计算ok类的ROC本身没有统计意义——没有真实标签作为参照,你根本无法判断模型输出的ok类预测概率是高是低、是对是错,算出来的曲线没有任何参考价值。
可选处理方案
- 方案1:剔除无真实样本类别的相关列,仅评估有真实标签的类别
这是最符合统计逻辑的处理方式:把测试集中不存在真实样本的ok_pred_svm、ok_true两列从结果数据框中删除,仅保留bad、good两类的预测值和真实标签,再调用multi_roc就可以正常计算,完全规避报错。
参考代码:# 过滤掉无真实样本的ok类维度 eval_results <- results %>% dplyr::select(-ok_pred_svm, -ok_true) # 正常调用函数计算ROC multi_roc_svm <- multi_roc(eval_results, force_diag = TRUE) - 方案2:手动绘制分类器的整体多类性能曲线
如果需要展示三类分类器的整体ROC表现,可以跳过multi_roc的强制逐类计算环节,手动构建坐标绘制:- 对测试集中有真实标签的
bad、good两类,分别计算不同概率阈值下的TPR、FPR值 - 结合训练集中三类的样本占比(类权重),计算宏平均、微平均的ROC坐标
- 用ggplot直接绘制单类ROC + 平均ROC曲线,在图注中标注“ok类因测试集无对应真实样本,未单独输出曲线”即可。
- 对测试集中有真实标签的
避坑提醒:不要为了绕开报错,手动给全0的
ok_true列强行加几个正例标签,这种操作会让ROC指标完全失真,最终的评估结果没有任何可信度。
内容的提问来源于stack exchange,提问作者icedcoffee
相关产品推荐
相关产品推荐

