如何基于Weka命令行输出的多分类预测结果绘制ROC曲线
基于Weka预测结果绘制ROC曲线的实现方案
ROC曲线的绘制只需要两列核心数据:真实类别标签(Actual列) 和 正类的预测概率(prediction列),不需要预测分类结果和误差列。
Python实现步骤
步骤1:导入依赖库
import pandas as pd from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt
步骤2:读取并预处理数据
# 读取Weka输出的结果文件,csv格式为例,arff格式可使用scipy.io.arff读取 df = pd.read_csv("weka_prediction_result.csv") # 真实标签编码为0/1二值格式,替换为你自己的类别映射规则 df['Actual'] = df['Actual'].map({'yes': 1, 'no': 0}) # 提取真实标签和正类预测概率 y_true = df['Actual'].values y_score = df['prediction'].values
步骤3:计算ROC曲线参数和AUC值
# 计算假阳性率fpr、真阳性率tpr、分类阈值 fpr, tpr, thresholds = roc_curve(y_true, y_score) # 计算AUC值 roc_auc = auc(fpr, tpr)
步骤4:绘制ROC曲线
plt.figure(figsize=(8, 6)) # 绘制ROC曲线 plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})') # 绘制随机猜测参考线 plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') # 格式设置 plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend(loc="lower right") plt.show()
R语言可选实现方案
# 加载依赖包 library(pROC) library(ggplot2) # 读取数据 df <- read.csv("weka_prediction_result.csv") # 转换真实标签为因子类型 df$Actual <- as.factor(df$Actual) # 计算ROC对象和AUC值 roc_obj <- roc(df$Actual, df$prediction) auc_value <- auc(roc_obj) # 绘制ROC曲线 ggroc(roc_obj, color = "darkorange", linewidth = 1) + geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "navy") + labs(title = "ROC Curve", x = "False Positive Rate", y = "True Positive Rate") + annotate("text", x = 0.75, y = 0.25, label = paste0("AUC = ", round(auc_value, 2))) + theme_minimal()
注意事项
- 如果是多分类任务,需要对每个类别分别做one-vs-rest处理后绘制对应ROC曲线
- 要确保
prediction列对应的是正样本的预测概率,不要拿负样本概率计算,否则AUC值会小于0.5,出现这种情况可以用1 - y_score转换后再计算 - 如果Weka输出的结果是ARFF格式,Python可以用
scipy.io.arff.loadarff()读取,R可以用foreign::read.arff()读取
内容的提问来源于stack exchange,提问作者wasif khan
相关产品推荐
相关产品推荐

