Мне нужно создать матрицу путаницы следующим образом:
Truth - any value & Predicted - any value : True Positive
Truth - NaN & Predicted - NaN : True Negative
Truth - any value & Predicted - NaN : False Negative
Truth - NaN & Predicted - any value : False Positive
Это отличается от типичного расчета матрицы путаницы, поскольку у меня нет меток для сравнения. Есть ли простой способ сделать это в Python (даже если это означает вычисление значений TP/TN/FP/FN вручную)?
Заранее спасибо!
Я думаю, если вы определите свои ярлыки как:
Тогда ваша настройка оказывается простой задачей бинарной классификации, и вы можете без проблем использовать матрицу путаницы.
import numpy as np
from sklearn.metrics import confusion_matrix
pred = [np.nan, 234, 1, 0, np.nan, -23, 3.2]
truth = [np.nan, np.nan, 21, 1, 0, 21, np.nan]
# Convert your predictions and true values into labels
pred_labels = ~np.isnan(pred)
truth_labels = ~np.isnan(truth)
print(pred_labels)
# [False True True True False True True]
print(truth_labels)
# [False False True True True True False]
print(confusion_matrix(pred_labels, truth_labels))
# [[1 1]
# [2 3]]
И если вы хотите проверить TP, TN, FP, FN:
(tn, fp, fn, tp) = confusion_matrix(pred_labels, truth_labels).ravel()
print(tp) # 3
print(tn) # 1
print(fp) # 1
print(fn) # 2
NB: вы также можете использовать ~np.isfinite(x)
вместо np.isna(x)
, если хотите избежать бесконечных значений (np.inf
).
Я заметил, что когда все значения равны True (как для моих прогнозируемых, так и для меток истинности), функция .ravel() матрицы путаницы возвращает только одно число [[x]], где x — общее количество экспериментов (которое в этом случае все истинно положительные). Ожидается ли это?
Если предсказание и правда равны, я действительно могу найти такое же поведение, как и вы. Странно, что он также не выводит tn, fp, fn = 0.
@Ирина Я поняла, что произошло. Смотрите этот пост stackoverflow.com/questions/65248401/…
Я очень ценю это! Это прекрасно работает, когда у меня есть числовые значения, но они также могут быть строками или датами (поэтому я бы проверял пустые и непустые значения). Я сейчас работаю над этим сценарием. Спасибо!