You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动