Значение ROC AUC равно 0 - PullRequest
       40

Значение ROC AUC равно 0

0 голосов
/ 14 февраля 2019

Я обучил двоичный классификатор, но я думаю, что моя кривая ROC неверна.

Это вектор, который содержит метки:

y_true= [0, 1, 1, 1, 0, 1, 0, 1, 0]

, а второй вектор - оценкаvector

y_score= [
    0.43031937, 0.09115553, 0.00650781, 0.02242869, 0.38608587, 
    0.09407699, 0.40521139, 0.08062053, 0.37445426
]

Когда я строю свою кривую ROC, я получаю следующее:

enter image description here

Я думаю, что код правильный,но я не понимаю, почему я получаю эту кривую и почему списки tpr, fpr и threshold имеют длину 4. Почему мой AUC равен нулю?

fpr [0.   0.25 1.   1.  ]
tpr [0. 0. 0. 1.]
thershold [1.43031937 0.43031937 0.37445426 0.00650781]

Мой код:

import sklearn.metrics as metrics

fpr, tpr, threshold = metrics.roc_curve(y_true, y_score)
roc_auc = metrics.auc(fpr, tpr)

# method I: plt
import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()

1 Ответ

0 голосов
/ 14 февраля 2019

Об AUC следует помнить, что на самом деле важно расстояние от 0,5.Если у вас очень низкий AUC, это просто означает, что ваши «положительные» и «отрицательные» ярлыки поменялись местами.

Если посмотреть на ваши оценки, становится ясно, что низкий балл (меньше, чем ~ 0,095) означает 1, а все, что выше этого порога, равно 0. Итак, у вас на самом деле отличный двоичный классификатор!

Проблема в том, что по умолчанию более высокие оценки ассоциируются с меткой 1. Таким образом, вы отмечаете баллы с высокими баллами как 1 вместо 0.Таким образом, вы ошибаетесь 100% времени.В этом случае просто переключите свои прогнозы, и вы будете правы в 100% случаев.

Простое решение состоит в том, чтобы использовать аргумент pos_label для sklearn.metrics.roc_curve.В этом случае вы хотите, чтобы ваш положительный ярлык был 0.

fpr, tpr, threshold = metrics.roc_curve(y_true, y_score, pos_label=0)
roc_auc = metrics.auc(fpr, tpr)
print(roc_auc)
#1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...