我训练了一名CNN,将图像分为5类。但是,当我试图绘制每个类别相对于其他类别的ROC
曲线时,所有5个类别几乎都有一条对角线曲线,其AUC
约为0.5。我不知道出了什么问题。
该模型的准确率应该在86%左右。
代码如下:
import os, shutil
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.keras import models, layers, optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from sklearn.metrics import plot_confusion_matrix, accuracy_score
from sklearn.metrics import roc_curve, auc, roc_auc_score, RocCurveDisplay
from sklearn.preprocessing import label_binarize
import random
model = tf.keras.models.load_model('G:/Myxoid lesion/Myxoid_EN3_finetune4b')
model.summary()
data_dir='G:/Myxoid lesion/Test/'
batch_size = 64
img_height = 300
img_width = 300
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
seed = 123,
image_size=(img_height, img_width),
batch_size=batch_size)
model.compile(optimizer = optimizers.Adam(lr=0.00002),
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics = ['sparse_categorical_accuracy'])
correct = np.array([], dtype='int32')
# Get the labels of test_ds
for x, y in test_ds:
correct = np.concatenate([correct, y.numpy()])
# Get the prediction probabilities for each class for each test image
prediction_prob = tf.nn.softmax(model.predict(test_ds))
num_class = 5
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(num_class):
fpr[i], tpr[i], _ = roc_curve(correct, prediction_prob[:,i], pos_label=i)
roc_auc[i] = auc(fpr[i], tpr[i])
plt.figure()
lw = 2
for i in range(num_class):
plt.plot(fpr[i],tpr[i],
color=(random.random(),random.random(),random.random()),
label='{0} (AUC = {1:0.2f})'''.format(labels[i], roc_auc[i]))
plt.plot([0, 1], [0, 1], 'k--', lw=lw)
plt.legend(loc="lower right")
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC analysis')
plt.show()
"prediction_prob"变量包含:
array([[6.3877934e-09, 6.3617526e-06, 5.5736535e-07, 4.9789862e-05,
9.9994326e-01],
[6.5260068e-08, 8.8882577e-03, 3.9350948e-06, 9.9110776e-01,
4.0252076e-11],
[2.7514220e-04, 2.9315910e-05, 1.6688553e-04, 9.9952865e-01,
3.5938730e-10],
...,
[1.1131389e-09, 9.8325908e-01, 3.4283744e-06, 1.6737511e-02,
7.3243338e-12],
[1.4697845e-08, 4.7125661e-05, 1.4077022e-03, 6.4052530e-02,
9.3449265e-01],
[9.9999940e-01, 1.3071107e-07, 4.3149896e-07, 4.7902233e-08,
9.2861301e-09]], dtype=float32)>
而“正确”变量包含每个测试图像的正确标签:
array([0, 1, 4, ..., 4, 2, 4])
我想我遵循了scikit-learn
网站上提到的内容。
生成的tpr[i]和fpr[i]变量变为线性相关,因此AUC变为0.5
我认为在生成tpr[I]和fpr[I]时存在问题?有人能解决这个问题吗?
谢谢!
如果我以这种方式生成标签和预测,那么我可以得到正确的ROC曲线:
prediction_prob = np.array([]).reshape(0,5)
correct = np.array([], dtype='int32')
for x, y in test_ds:
correct = np.concatenate([correct, y.numpy()])
prediction_prob = np.vstack([prediction_prob, tf.nn.softmax(model.predict(x))])
然而,如果我从模型中得到预测。predict(test_ds),预测的顺序与原始数据集不同,因此它与原始标签不匹配。我不确定这是否是tensorflow中的“bug”,或者对此有其他解释。
此外,我无法获得微平均值(尽管这对我的目标并不重要)
fpr["micro"], tpr["micro"], _ = roc_curve(correct.ravel(), prediction_prob.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
它给出了以下错误:
raise ValueError("{0} format is not supported".format(y_type))
ValueError: multiclass format is not supported
我试图计算真阳性率和假阳性率,然后手工绘制roc曲线,因为我想检查我从sklearn获得的roc曲线。度量roc_曲线函数。但是我得到的fpr(在x轴上)和tpr(在y轴上)的roc曲线似乎是互换的。我正在做一个梯度下降的二元分类器,有两个标签正负。用于tpr、fpr计算的tensorflow代码的相关部分如下所示:
如何解决composer中的分段错误?安装后会发生这种情况 /c/ProgramData/ComposerSetup/bin/composer:第18行:1024分段错误php"${dir}/composer.phar"$*
我正在y_test并y_pred混淆矩阵。我的数据用于多标签分类,因此行值是一种热编码。 我的数据有30个标签,但在输入混淆矩阵后,输出只有11行和列,这让我很困惑。我想我应该有一辆30X30的。 它们的格式是numpy数组。(y\u test和y\u pred是我使用dataframe.values将其转换为numpy数组的数据帧) y\U测试。形状 y_test y\u预测。形状 y\u预测
本文向大家介绍浅谈ROC曲线的最佳阈值如何选取,包括了浅谈ROC曲线的最佳阈值如何选取的使用技巧和注意事项,需要的朋友参考一下 为了获取ROC曲线的最佳阈值,需要使用一个指标--约登指数,也称正确指数。 借助于matlab的roc函数可以得出计算。 至此计算结束了。 补充拓展:利用阈值分割目标图像 一.全局阈值 方法一:OTSU方法 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的
将以下代码转换为typescript时出错。 错误TS2339:属性样式在元素类型上不存在。 当我为如下相同的值分配所需值时 那么误差在元素上,那就是 错误TS2322:类型“Element | null”不可分配给类型“{style:any;}”。类型“null”不可分配给类型“{style:any;}”。
问题内容: 在下面的代码中,我有两个相同的条件赋值操作,一个返回类型为Double的对象,第二个返回字符串“ Integer”。 为什么完全相同的表达式返回两个不同的东西? 问题答案: 好吧,这是因为条件运算符的JLS规范: 否则,如果第二个和第三个操作数的类型可以转换(第5.1.8节)为数字类型,则有几种情况: … 否则,将二进制 数值提升(第 5.6.2节 )应用于操作数类型,条件表达式的类型