如何为10折交叉验证训练的神经网络分类模型绘制ROC与PR曲线
你可以按照以下步骤修改代码,完成ROC曲线和PR曲线的绘制:
步骤1:补充导入所需依赖库
在原有导入代码的基础上添加以下内容:
from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score import matplotlib.pyplot as plt
步骤2:初始化全局存储变量
在定义kfold的代码前,添加以下初始化代码,解决原代码未初始化acc_per_fold、loss_per_fold的问题,同时新增变量存储所有折的真实标签和预测概率:
acc_per_fold = [] loss_per_fold = [] # 存储所有折的测试集真实标签和预测正类概率 all_y_true = [] all_y_pred_proba = []
步骤3:修改10折交叉验证循环逻辑,保存每折预测结果
在每折训练完成、评估模型的代码块中,添加获取预测概率的逻辑,将结果存入全局变量:
history = model.fit(X[train], y[train], batch_size=10, epochs=150, verbose=0) # 新增:获取测试集的预测正类概率 y_pred_proba = model.predict(X[test], verbose=0).ravel() # 保存当前折的真实标签和预测概率 all_y_true.extend(y[test].tolist()) all_y_pred_proba.extend(y_pred_proba.tolist()) scores = model.evaluate(X[test], y[test], verbose=0) print(f'Score for fold {fold_no}: {model.metrics_names[0]} of {scores[0]}; {model.metrics_names[1]} of {scores[1]*100}%') acc_per_fold.append(scores[1] * 100) loss_per_fold.append(scores[0]) fold_no = fold_no + 1
步骤4:所有折训练完成后绘制ROC曲线
循环结束后添加以下代码绘制ROC曲线:
# 计算ROC曲线参数 fpr, tpr, _ = roc_curve(all_y_true, all_y_pred_proba) roc_auc = auc(fpr, tpr) # 绘制ROC曲线 plt.figure(figsize=(8,6)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.3f})') 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('10折交叉验证模型ROC曲线') plt.legend(loc="lower right") plt.show()
步骤5:绘制PR曲线
在ROC曲线代码后添加以下代码绘制PR曲线:
# 计算PR曲线参数 precision, recall, _ = precision_recall_curve(all_y_true, all_y_pred_proba) ap_score = average_precision_score(all_y_true, all_y_pred_proba) # 绘制PR曲线 plt.figure(figsize=(8,6)) plt.plot(recall, precision, color='darkgreen', lw=2, label=f'PR曲线 (AP = {ap_score:.3f})') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('召回率 (Recall)') plt.ylabel('精确率 (Precision)') plt.title('10折交叉验证模型PR曲线') plt.legend(loc="lower left") plt.show()
以上实现采用的是将所有折的测试集预测结果合并后计算整体曲线的方案,是10折交叉验证绘制性能曲线的常用方案。如果需要对比每折的性能差异,可在循环内每折单独计算对应指标后叠加绘制曲线即可。
内容的提问来源于stack exchange,提问作者solanga
相关产品推荐
相关产品推荐

