Я проводил тест с sklearn.metrics.confusion_matrix
, чтобы увидеть, что произойдет, если в массиве предсказания есть класс, которого нет в массивах меток и сопоставлений.
Мой код:
from sklearn.metrics import confusion_matrix as cm
a = ["positive\n", "positive\n", "negative\n", "positive\n", "negative\n"]
b = ["negative\n", "negative\n", "don't\n", "negative\n", "negative\n"]
m = ["positive\n", "negative\n"]
c = cm(a, b, m)
TN, FP, FN, TP = c.ravel()
print(c)
print("")
print("{} {} {} {}\n".format(TN, FP, FN, TP))
Результат:
[[0 3]
[0 1]]
0 3 0 1
Итак, урок don't
пропущен.
Но если вы посмотрите на документация для версии v0.21.2
, которую я установил, метод ravel()
«должен» выводить значения матрицы путаницы, как я написал: TN, FP, FN, TP. Вывод моего print
отличается. Кажется, что реальный вывод ravel()
перевернут: TP, FN, FP, TN. Верна ли моя мысль?
Нет никакой ошибки. Вы определили ярлыки:
m = ["positive\n", "negative\n"]
поэтому "positive\n"
отрицательное, а "negative\n"
положительное. И результат соответствует вашей спецификации.
Если вы измените m
таким образом:
m = ["negative\n", "positive\n"]
ты получишь:
1 0 3 0
для TN, FP, FN, TP
соответственно.
Нет ничего правильного или неправильного как такового. Чтобы понять процесс, постройте матрицу, где строки — это истинные классы, а столбцы — предсказанные классы. Затем заполните матрицу относительно предсказанных и истинных значений. И вы получите результат.
поэтому в случае двоичной классификации первый класс в массиве сопоставления должен быть «отрицательным» классом, чтобы получить правильные результаты
ravel()
, иначе я должен поменять местами возвращаемые значения? Но в итоге тот же результат, верно?