Всегда получаю AUC = 0,5

Я пытаюсь использовать сверточную нейронную сеть (CNN) для прогнозирования классов тестовых изображений следующим образом:

for root, dirs, files in os.walk(test_directory):
    for file in files:
        img = cv2.imread(root + '/' + file)
        img = cv2.resize(img,(512,512),interpolation=cv2.INTER_AREA)
        img = np.expand_dims(img, axis=0)
        img = img/255.0
        if os.path.basename(root) == 'nevus':
            label = 1
        elif os.path.basename(root) == 'melanoma':
            label = 0
        labels.append(label)
        img_class = model.predict_classes(img)
        img_class_probability = model.predict(img)
        prediction_probability = img_class_probability[0]
        prediction_probabilities.append(prediction_probability)
        prediction = img_class[0]
        if prediction == label:
            correct_classification = correct_classification + 1
        number_of_test_images = number_of_test_images + 1

fpr, tpr, thresholds = roc_curve(labels, prediction_probabilities)
auc_value = auc(fpr, tpr)

Я хотел бы спросить, почему у меня всегда AUC = 0,5? Может я что-то не так делаю?

Спасибо.


person Simplicity    schedule 06.01.2019    source источник
comment
Рассчитывали ли вы другие показатели, такие как точность, чувствительность, специфичность и какие баллы вы получили?   -  person Suleiman    schedule 06.01.2019
comment
@Suleiman Спасибо за добрый ответ. Я рассчитал точность, которая составила около 77%. Но кажется, что все прогнозируемые классы одинаковы (т.е. всегда меланома).   -  person Simplicity    schedule 06.01.2019
comment
Похоже, ваш код не включает модель. Пожалуйста, покажите нам код, который строит и обучает модель (включая выбор инициализаторов изученных параметров и оптимизатора)   -  person nanofarad    schedule 06.01.2019
comment
Если ваша модель всегда предсказывает один класс и у вас есть сбалансированный набор данных, то есть одинаковое количество невусов и меланом, это объясняет, почему AUC = 0,5.   -  person Suleiman    schedule 06.01.2019


Ответы (1)


В этом случае может случиться так, что пороги AUC установлены неправильно, что приводит к тому, что все выходные значения модели (оценка/вероятность) всегда будут одного и того же класса при всех выбранных порогах, поэтому AUC всегда будет 0,5.

Следующий пример иллюстрирует влияние порогов на AUC.

import tensorflow as tf # tf 2.0+

y_true = [0, 0, 1, 1, 1, 1]
y_pred = [0.001, 0.002, 0.003, 0.004, 0.005, 0.006]

#--------------------------------------------------------------
m1 = tf.keras.metrics.AUC(thresholds=[0.0, 0.5, 1.0])
m1.update_state(y_true, y_pred)

# when threshold=0.0 , y_class always be 1
# when threshold=0.5 , y_class always be 0
# when threshold=1.0 , y_class always be 0 

print('AUC={}'.format(m1.result().numpy())) 
# output: AUC=0.5


#--------------------------------------------------------------
m2 = tf.keras.metrics.AUC(thresholds=[0.0, 0.0045, 1.0])
m2.update_state(y_true, y_pred)

# when threshold=0.0    , y_class always be 1 
# when threshold=0.0045 , y_class will   be [0, 0, 0, 0, 1, 1]
# when threshold=1.0    , y_class always be 0 

print('AUC={}'.format(m2.result().numpy())) 
# output: AUC=0.75


#--------------------------------------------------------------
m3 = tf.keras.metrics.AUC(num_thresholds=300) 
# print(m3.thresholds)
m3.update_state(y_true, y_pred)

print('AUC={}'.format(m3.result().numpy())) 
# output: AUC=0.875
person FelixHo    schedule 11.06.2020