如何求CNN模型(keras)的ROC曲线和AUC分数

Posted

技术标签:

【中文标题】如何求CNN模型(keras)的ROC曲线和AUC分数【英文标题】:How to find the ROC curve and AUC score of CNN model (keras) 【发布时间】:2021-03-12 02:26:47 【问题描述】:

我是深度学习的新手。我正在尝试为以下代码生成 ROC 曲线。我正在使用 keras。班级大小为10,图像为大小为100* 100* 3的RGB图像。

我浏览了[此链接][1]。我的问题也一样,但我找不到真正的标签。我是这个领域的新手,所以请帮助我。 我还查看了 [This for true label][2]。

我的程序的代码sn-p是:

target_size=(100,100,3)

train_generator = train_datagen.flow_from_directory('path',
    target_size=target_size[:-1],
    batch_size=16,
    class_mode='categorical',
    subset='training',
    seed=random_seed)

valid_generator = ...

test_generator = ...
n_classes = len(set(train_generator.classes))



input_layer = keras.layers.Input(shape=target_size)

conv2d_1 = keras.layers.Conv2D(filters=64, kernel_size=(3,3), strides=1, padding='same', 
activation='relu',
                       kernel_initializer='he_normal')(input_layer)

batchnorm_1 = keras.layers.BatchNormalization()(conv2d_1)
maxpool1=keras.layers.MaxPool2D(pool_size=(2,2))(batchnorm_1)


conv2d_2 = keras.layers.Conv2D(filters=32, kernel_size=(3,3), strides=1, padding='same', 
activation='relu',
                       kernel_initializer='he_normal')(maxpool1)
batchnorm_2 = keras.layers.BatchNormalization()(conv2d_2)

maxpool2=keras.layers.MaxPool2D(pool_size=(2,2))(batchnorm_2)


flatten = keras.layers.Flatten()(maxpool2)
dense_1 = keras.layers.Dense(256, activation='relu')(flatten)

dense_2 = keras.layers.Dense(n_classes, activation='softmax')(dense_1)



model = keras.models.Model(input_layer, dense_3)

model.compile(optimizer=keras.optimizers.Adam(0.001),
      loss='categorical_crossentropy',
      metrics=['acc'])
model.summary()

model.fit_generator(generator=train_generator, validation_data=valid_generator,
            epochs=200)
            
score = model.evaluate_generator(test_generator)

print(score)

现在请帮助我获得 AUC 分数和 ROC 曲线。 [1]:How to find the ROC curve and AUC score of this CNN model (keras) [2]:Getting true labels for keras predictions

【问题讨论】:

这能回答你的问题吗? How to compute Receiving Operating Characteristic (ROC) and AUC in keras? 见我的 cmets here 【参考方案1】:

添加此代码。希望它有效。

import numpy as np
from sklearn import metrics

x, y = test_generator.next()
prediction = model.predict(x)

predict_label1 = np.argmax(prediction, axis=-1)
true_label1 = np.argmax(y, axis=-1)

y = np.array(true_label1)

scores = np.array(predict_label1)
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=9)
roc_auc = metrics.auc(fpr, tpr)


plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
 lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, 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)')
plt.legend(loc="lower right")
plt.show()

【讨论】:

【参考方案2】:

score 函数默认不提供 roc 和 auc 的分数,我们要单独计算。您可以检查以下代码片段来计算 roc 和 auc 分数并在那里绘制值。

from sklearn.metrics import roc_curve
y_pred_keras = model.predict(X_test).ravel()
fpr_keras, tpr_keras, thresholds_keras = roc_curve(y_test, y_pred_keras)

from sklearn.metrics import auc
auc_keras = auc(fpr_keras, tpr_keras)

import matplotlib.pyplot as plt
plt.figure(1)
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr_keras, tpr_keras, label='Keras (area = :.3f)'.format(auc_keras))
plt.plot(fpr_rf, tpr_rf, label='RF (area = :.3f)'.format(auc_rf))
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC curve')
plt.legend(loc='best')
plt.show()

【讨论】:

以上是关于如何求CNN模型(keras)的ROC曲线和AUC分数的主要内容,如果未能解决你的问题,请参考以下文章

分类模型评估之ROC-AUC曲线和PRC曲线

如何在自动编码器模型上绘制ROC曲线并计算AUC?

R语言使用yardstick包的roc_auc函数和pr_auc函数分别计算二分类(binary)模型在ROC曲线下方的面积和PR曲线下方的面积AUC值(area under the curve)

人工智能——分类器性能指标之ROC曲线AUC值

人工智能——分类器性能指标之ROC曲线AUC值

使用sklearn画二分类模型ROC曲线,PR曲线