Sklearn框架下Sequential卷积神经网络模型的预测概率获取与ROC曲线手动绘制方案
关于Sklearn手写数字CNN模型绘制ROC曲线的问题与解决方案
嗨,咱们一步步来解决你的问题——首先得澄清一点:你说的是用Sklearn的手写数字数据集,但模型是Keras/TensorFlow的Sequential卷积神经网络对吧?毕竟Sklearn本身没有Sequential CNN模型,这也是你用predict_proba()失败的原因,因为这个方法是Sklearn模型的专属接口,而Keras/TensorFlow的模型有自己的概率获取方式。
一、获取CNN模型的预测概率
对于Keras的Sequential模型,你需要用model.predict()方法来获取每个样本的类别概率:
- 手写数字是10分类任务,所以
model.predict(X_test)会返回一个形状为(测试样本数, 10)的数组,每一行对应一个样本在0-9这10个类别上的概率。 - 如果要绘制某个特定类别的ROC曲线(比如识别数字"5"),你需要把该类别设为正类,其他类别设为负类:
import numpy as np # 假设你的模型是model,测试集特征是X_test,真实标签是y_test y_probs = model.predict(X_test) # 提取数字"5"对应的概率列作为score score = y_probs[:, 5] # 将真实标签二值化:等于5的是1,其他是0 y_true = np.where(y_test == 5, 1, 0)
二、不用手动构建混淆矩阵也能快速画ROC曲线
你贴的手动遍历阈值的代码确实比较繁琐,其实Scikit-learn提供了现成的roc_curve()函数,可以直接帮你计算FPR和TPR,代码更简洁也更可靠:
from sklearn.metrics import roc_curve import matplotlib.pyplot as plt # 用上面得到的y_true和score计算FPR、TPR和阈值 fpr, tpr, thresholds = roc_curve(y_true, score) # 绘制ROC曲线 plt.figure(figsize=(8, 6)) plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve') 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('ROC Curve for Digit 5') plt.legend(loc="lower right") plt.show()
三、适配你提供的手动ROC代码
如果你坚持想用自己写的手动实现代码,只需要把代码里的score和y替换成上面获取的score和y_true就行,直接代入就能正常运行,不需要额外构建混淆矩阵。
另外补充一点:对于多分类任务的ROC分析,通常是针对每个类别绘制one-vs-rest的ROC曲线,或者计算micro/macro平均的ROC AUC值,但绘制曲线时单个类别单独展示会更清晰。
内容的提问来源于stack exchange,提问作者Jean-Luc Poulton
相关产品推荐
相关产品推荐

