如何求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分数的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用yardstick包的roc_auc函数和pr_auc函数分别计算二分类(binary)模型在ROC曲线下方的面积和PR曲线下方的面积AUC值(area under the curve)