如何使用TensorFlow绘制ROC曲线与混淆矩阵?
在TensorFlow测试环节绘制ROC曲线与混淆矩阵的实操方案
嘿,我懂你这种感觉——训练和测试代码都跑通了,Python也没报错,但就是卡在这两个关键评估指标的可视化上对吧?其实结合TensorFlow和scikit-learn就能轻松搞定,我给你一步步拆解,先整个极简可复现的模型框架,再把ROC曲线和混淆矩阵的代码嵌到测试环节里,你直接套到自己的逻辑里就行。
一、先搞个极简可复现的模型(方便你测试)
首先给你整个超简单的二分类模型+模拟数据,你可以直接跑通,之后替换成自己的训练好的模型和测试集就行:
import tensorflow as tf from tensorflow.keras import layers, models from sklearn.metrics import roc_curve, auc, confusion_matrix, ConfusionMatrixDisplay import matplotlib.pyplot as plt # 构建极简二分类模型 def build_simple_model(): model = models.Sequential([ layers.Dense(32, activation='relu', input_shape=(10,)), layers.Dense(16, activation='relu'), layers.Dense(1, activation='sigmoid') # 二分类用sigmoid,多分类换softmax ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) return model # 生成模拟测试数据(替换成你自己的测试集) X_test = tf.random.normal((1000, 10)) y_test = tf.random.uniform((1000,), minval=0, maxval=2, dtype=tf.int32)
二、测试环节绘制混淆矩阵
混淆矩阵需要先拿到模型预测的类别标签,再用sklearn的工具计算并绘图,直接嵌入你的test_neural_network函数里就行:
def test_neural_network(model, X_test, y_test): # 1. 获取模型预测结果 y_pred_probs = model.predict(X_test, verbose=0) # 二分类:用0.5作为阈值转成类别标签 y_pred = (y_pred_probs > 0.5).astype(int) # 要是多分类的话,改成下面这句: # y_pred = tf.argmax(model.predict(X_test), axis=1).numpy() # 2. 计算并绘制混淆矩阵 cm = confusion_matrix(y_test, y_pred) # 这里的display_labels替换成你自己的类别名称,比如['猫','狗'] disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=[0, 1]) disp.plot(cmap=plt.cm.Blues) plt.title("Confusion Matrix") plt.show()
三、测试环节绘制ROC曲线
ROC曲线需要用到模型输出的预测概率(不是直接的类别标签),用sklearn计算FPR、TPR和AUC后绘图:
def plot_roc_curve(model, X_test, y_test): # 获取预测概率并展平成一维数组 y_pred_probs = model.predict(X_test, verbose=0).ravel() # 计算ROC曲线参数 fpr, tpr, thresholds = roc_curve(y_test, y_pred_probs) roc_auc = auc(fpr, tpr) # 绘制ROC曲线 plt.figure() plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {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 (ROC) Curve') plt.legend(loc="lower right") plt.show()
四、多分类任务的适配(如果需要)
要是你做多分类任务,ROC曲线需要用「one-vs-rest」的方式绘制,给你个示例代码:
def plot_multiclass_roc(model, X_test, y_test, n_classes): y_pred_probs = model.predict(X_test, verbose=0) # 把真实标签转为one-hot编码 y_test_onehot = tf.keras.utils.to_categorical(y_test, n_classes) fpr = dict() tpr = dict() roc_auc = dict() # 循环每个类别计算ROC参数 for i in range(n_classes): fpr[i], tpr[i], _ = roc_curve(y_test_onehot[:, i], y_pred_probs[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) # 绘制所有类别的ROC曲线 plt.figure() colors = ['aqua', 'darkorange', 'cornflowerblue'] for i, color in zip(range(n_classes), colors): plt.plot(fpr[i], tpr[i], color=color, lw=2, label=f'ROC curve of class {i} (area = {roc_auc[i]:.2f})') plt.plot([0, 1], [0, 1], 'k--', lw=2) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Multi-class ROC Curve') plt.legend(loc="lower right") plt.show()
快速测试整个流程
把上面的代码串起来跑一遍,验证没问题后替换成你自己的模型和数据:
# 初始化并训练极简模型(替换成你自己训练好的模型) model = build_simple_model() model.fit(tf.random.normal((2000,10)), tf.random.uniform((2000,),0,2,dtype=tf.int32), epochs=5, batch_size=32) # 调用测试和绘图函数 test_neural_network(model, X_test, y_test) plot_roc_curve(model, X_test, y_test) # 要是多分类,比如3分类,调用下面这句: # plot_multiclass_roc(model, X_test, y_test, n_classes=3)
核心逻辑就是:TensorFlow负责输出预测概率/标签,scikit-learn负责计算评估指标,matplotlib负责可视化,整个流程非常顺畅,你只需要把模拟部分替换成自己的实际代码就行。
内容的提问来源于stack exchange,提问作者CodeNoob




