You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的强制逐类计算环节,手动构建坐标绘制:
    1. 对测试集中有真实标签的bad、good两类,分别计算不同概率阈值下的TPR、FPR值
    2. 结合训练集中三类的样本占比(类权重),计算宏平均、微平均的ROC坐标
    3. 用ggplot直接绘制单类ROC + 平均ROC曲线,在图注中标注“ok类因测试集无对应真实样本,未单独输出曲线”即可。

避坑提醒:不要为了绕开报错,手动给全0的ok_true列强行加几个正例标签,这种操作会让ROC指标完全失真,最终的评估结果没有任何可信度。

内容的提问来源于stack exchange,提问作者icedcoffee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 01:06:05