全正类别预测集绘制ROC曲线出现警告及空图的解决方法问询
问题原因
ROC曲线和AUC指标的计算逻辑依赖测试集中同时存在**正样本(标签1,异常)和负样本(标签0,正常)**两类数据:
假阳性率(FPR)的计算公式为 FPR = 假阳性样本数 / 总真实负样本数,你当前测试集全为正样本,总真实负样本数为0,FPR无法计算,因此scikit-learn会抛出UndefinedMetricWarning警告,输出的fpr、tpr结果无效,绘制的ROC图自然为空。
解决方法
1. 优先调整测试集(最合理方案)
在测试集中补充标签为0的正常样本,确保测试集同时覆盖两类数据,再运行原有ROC绘制代码即可正常出图。
如果只是临时测试代码功能,可以临时给y_test和preds补充少量负样本测试,示例代码如下:
import matplotlib.pyplot as plt import sklearn.metrics as metrics # 补充负样本后的测试集 y_test = [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0] # 对应预测结果,可根据实际情况调整 preds = [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1] fpr, tpr, threshold = metrics.roc_curve(y_test, preds) roc_auc = metrics.auc(fpr, tpr) plt.title('Receiver Operating Characteristic') plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc) plt.legend(loc = 'lower right') plt.plot([0, 1], [0, 1],'r--') plt.xlim([0, 1]) plt.ylim([0, 1]) plt.ylabel('True Positive Rate') plt.xlabel('False Positive Rate') plt.show()
2. 更换适配单类场景的评估指标
如果当前阶段确实无法获取带负样本的测试集,不要强行使用ROC/AUC指标,可更换为适配当前场景的评估方式:
- 直接计算分类准确率:当前所有预测结果和真实标签一致,准确率为100%,可直接作为当前阶段的效果参考
- 后续收集到含负样本的测试集后,再使用ROC/AUC、PR曲线等二分类通用指标评估效果
内容的提问来源于stack exchange,提问作者Fabio
相关产品推荐
相关产品推荐

