массивы TP, TN, FP и FN в Python - PullRequest
       0

массивы TP, TN, FP и FN в Python

0 голосов
/ 01 апреля 2020

Мои результаты прогноза выглядят так:

TestArray

[1,0,0,0,1,0,1,...,1,0,1,1],
[1,0,1,0,0,1,0,...,0,1,1,1],
[0,1,1,1,1,1,0,...,0,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],

PredictionArray

[1,0,0,0,0,1,1,...,1,0,1,1],
[1,0,1,1,1,1,0,...,1,0,0,1],
[0,1,0,1,0,0,0,...,1,1,1,1],
.
.
.
[1,1,0,1,1,0,1,...,0,1,1,1],

это размер массивов, которые у меня есть

TestArray.shape

Out[159]: (200, 24)

PredictionArray.shape

Out[159]: (200, 24)

Я хочу получить TP, TN, FP и FN для этих массивов

Я пробовал этот код

cm=confusion_matrix(TestArray.argmax(axis=1), PredictionArray.argmax(axis=1))
TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]
print(TN,FN,TP,FP)

, но результаты, которые я получил

TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]
print(TN,FN,TP,FP)

125 5 0 1

Я проверил форму см

cm.shape

Out[168]: (17, 17)

125 + 5 + 0 + 1 = 131, и это не равно числу столбцов, которые у меня есть, что 200

Я ожидаю иметь 200, так как каждая ячейка в массиве должна быть TF, TN, FP, TP, поэтому общее число должно быть 200

Как это исправить?

Вот пример проблемы

import numpy as np
from sklearn.metrics import confusion_matrix


TestArray = np.array(
[
[1,0,0,1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1],
[0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,1,0,1,1],
[1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0],
[0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,1,1,1],
[0,0,0,0,1,1,0,1,1,0,0,1,0,1,1,0,1,1,1,1],
[1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,0,0,1,0,0],
[1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1],
[0,0,0,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,1,1],
[1,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0],
[1,1,0,1,1,1,1,0,1,0,1,0,1,1,1,1,0,1,0,0]
])

TestArray.shape



PredictionArray = np.array(
[
[0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,1],
[0,1,0,0,1,0,1,1,0,0,0,1,1,0,0,1,1,0,0,1],
[1,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0],
[0,1,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,1],
[0,0,1,0,0,1,0,1,1,1,0,1,1,1,0,0,1,1,0,1],
[1,0,0,1,0,1,1,1,1,0,0,1,0,1,1,1,0,1,1,0],
[1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,0,1,0,1],
[0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,1,1],
[1,0,1,1,0,0,0,1,0,1,0,1,1,1,1,0,0,0,1,0],
[1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1,0,0]
])

PredictionArray.shape

cm=confusion_matrix(TestArray.argmax(axis=1), PredictionArray.argmax(axis=1))
TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]

print(TN,FN,TP,FP)

Вывод

5 0 2 0 

= 5 + 0 + 2 + 0 = 7 !!

Есть 20 столбцов в массиве и 10 строк

, но cm дает всего 7 !!

1 Ответ

2 голосов
/ 01 апреля 2020

При использовании np.argmax матрицы, которые вы вводите sklearn.metrics.confusion_matrix, больше не являются двоичными, так как np.argmax возвращает индекс первого возникшего максимального значения. В этом случае вдоль axis=1.

Вы не получите хороших или истинных позитивов / хитов, истинных негативов / правильных отклонений и т. Д. c., Когда ваш прогноз не является двоичным .

Вы должны обнаружить, что sum(sum(cm)) действительно равняется 200.


Если каждый индекс массивов представляет собой индивидуальный прогноз, то есть вы пытаетесь получить TP / TN / FP / FN для в общей сложности 200 (10 * 20) прогнозов с результатом 0 или 1 для каждого прогноза, затем вы можете получить TP / TN / FP / FN путем сглаживания массивов перед разбирая их до confusion_matrix. То есть вы можете изменить TestArray и PreditionArry на (200,), например:

cm = confusion_matrix(TestArray.reshape(-1), PredictionArray.reshape(-1))

TN = cm[0][0]
FN = cm[1][0]
TP = cm[1][1]
FP = cm[0][1]

print(TN, FN, TP, FP, '=', TN + FN + TP + FP)

, что возвращает

74 28 73 25 = 200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...