如何找到这个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')



无论我在哪里看到 sklearn.metrics 中使用 roc_curve,它都需要 x_train、y_train、x_test、y_test 等参数,我知道这些参数可以是 pandas DataFrames,但在我的情况下并非如此。如何绘制 ROC 曲线并获得用于 CNN 模型训练的 AUC 分数?


拉莫斯之舞
浏览 187回答 3
3回答

噜噜哒

我让它工作了。我所要做的就是将获得的 preds 的数据类型preds = classifier.predict(test_set)与我获得的 true_labels 相匹配labels = test_set。Preds 基本上是一个 numpy.ndarray 包含具有 np.float32 值的单个元素列表。将标签转换为相同的格式和形状使 roc_curve 正常工作。此外,我必须添加第三个变量阈值,fpr, tpr, threshold = roc_curve(true_labels, preds)因此不会弹出 ValueError: too many values to unpack 错误。

蓝山帝景

实际上,如果查看 sklearn.metrics.roc_curve 的文档(以及几乎每个 sklearn 指标),他们不会将模型(图像)的输入作为参数,它只需要真实标签和预测标签。因此,在您对测试集进行推断之后,在 keras 中(这里我只是猜测)类似于preds = classifier.predict(batch)您将 roc_curve 称为fpr, tpr = roc_curve(true_labels,preds)可能你必须改变类型,因为它们是张量。编辑:我已经检查了 keras 文档flow_from_directory并产生了一个迭代器,(x,y) = (images,labels)所以如果你想做某种训练后分析,你应该使用这样的东西来获取标签:labels = [] for _,y in test_set:     labels.extend(list(y))如果您只有两个类,请将 class_mode 更改为binary

阿晨1998

要计算 ROC AUC,您需要分数,而不是最终分类/决策的结果。classifier.add(Dense(units = 2, activation = 'softmax'))由于您的模型有一个以两个神经元( 所以,你不能将它与 softmax 一起使用。您可以用一个神经元和 sigmoid 替换您的 2 个神经元和 softmax。然后,roc_curve在二元分类问题中使用是安全的。还有另一个名为roc_auc_score的函数,它具有multi_class将多类分类问题转换为多个二元问题的参数。例如,auc_roc = roc_auc_score(labels, classifier.predict(...), multi_class='ovr')。但是,这只会返回 AUC 分数,它不能帮助您绘制 ROC 曲线。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python