如何找到该CNN模型(keras)的ROC曲线和AUC得分



我在keras中的CNN代码如下:

from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
classifier = Sequential()
#1st Conv layer
classifier.add(Convolution2D(64, (9, 9), input_shape=(64, 64, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(4,4)))
#2nd Conv layer
classifier.add(Convolution2D(32, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2,2)))
#Flattening
classifier.add(Flatten())
# Step 4 - Full connection
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dropout(0.1))
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dropout(0.2))
classifier.add(Dense(units = 128, activation = 'relu'))
classifier.add(Dense(units = 2, activation = 'softmax'))
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
#Fitting dataset
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True)
test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory('dataset/training_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'categorical')
test_set = test_datagen.flow_from_directory('dataset/test_set',
target_size = (64, 64),
batch_size = 32,
class_mode = 'categorical')
classifier.fit_generator(
training_set,
steps_per_epoch=(1341+3875)/32,
epochs=15,
validation_data=test_set,
validation_steps=(234+390)/32)

无论我在哪里看到使用sklearn.metrics中的roc_curve,它都会使用x_train、y_train、x_test、y_test等参数,我知道这些参数可以是Panda DataFrames,但在我的情况下并非如此。我如何绘制ROC曲线并获得像这里这样的细胞神经网络模型训练的AUC分数?

我让它工作起来了。我所要做的就是将从preds = classifier.predict(test_set)获得的preds的数据类型与从labels = test_set获得的true_labels进行匹配。Preds基本上是一个numpy.ndarray,包含具有np.float32值的单个元素列表。将标签转换为相同的格式和形状可以使roc_curve正常工作。

此外,我必须在fpr, tpr, threshold = roc_curve(true_labels, preds)中添加第三个变量阈值,这样就不会出现ValueError:太多的值无法解压缩错误。

实际上,如果查看sklearn.metrics.roc_curve的文档(几乎对于每个sklearn度量(,它们不会将模型(图像(的输入作为参数,只会使用真实标签和预测标签。因此,在你对测试集进行推断后,在keras中(我只是猜测(,它有点像

preds = classifier.predict(batch)

您将过程曲线称为

fpr, tpr = roc_curve(true_labels,preds)

很可能你必须改变类型,因为它们是张量。

EDIT:我已经检查了flow_from_directory上的keras文档,并在(x,y) = (images,labels)上生成了一个迭代器,所以如果你想进行某种训练后分析,你应该使用这样的东西来获得标签:

labels = []
for _,y in test_set:
labels.extend(list(y))

如果您只有两个类,请将class_mode更改为binary

要计算ROC AUC,您需要分数,而不是最终分类/决策的结果。

由于您的模型有一个以两个神经元(classifier.add(Dense(units = 2, activation = 'softmax'))(为最后一层的softmax,因此这是一种多类分类,其中类的数量为2。但是,函数roc_curve仅限于在二进制分类问题中使用。因此,您不能将其与softmax一起使用。

您可以将2个神经元和softmax替换为一个神经元和sigmoid。然后,在二进制分类问题中使用roc_curve是安全的。

还有另一个名为roc_auc_score的函数,其参数multi_class将多类分类问题转换为多个二进制问题。例如,auc_roc = roc_auc_score(labels, classifier.predict(...), multi_class='ovr')。然而,这只返回AUC分数,不能帮助绘制ROC曲线。

最新更新