Во-первых, спасибо, что прочитали мой вопрос - надеюсь, это подходящее место для этого.
Я с нуля кодирую вычисления чувствительности, специфичности и точности на основе путаницы. У меня есть следующая матрица путаницы для 4 классов.
True Class
1 2 3 4
1 [[ 0 1 3 0]
Predicted 2 [ 0 181 23 0]
Class 3 [ 0 17 53 14]
4 [ 0 3 22 77]]
Когда я использую Sklearn.metrics.classification_report, это то, что я получаю:
precision recall f1-score support
0.00 0.00 0.00 4
0.89 0.89 0.89 204
0.52 0.63 0.57 84
0.85 0.75 0.80 102
Однако, для точности и отзыва я получаю (то есть, значения для точности и отзыва переворачиваются ):
precision recall
0.0 nan
0.887 0.896
0.631 0.524
0.755 0.846
Для каждого класса я вычисляю следующие истинные положительные, ложные положительные, отрицательные и ложные отрицательные значения:
class Tp Fp Tn Fn
1 0 4 390 0
2 181 23 169 21
3 53 31 262 48
4 77 25 278 14
Используемые формулы ( https://en.wikipedia.org/wiki/Confusion_matrix):
sensitivity/recall = true_positives / (true_positives + false_negatives)
precision = true_positives/(true_positives+false_positives)
Где я иду не так, конечно, проблема классификации sklearn не может быть проблемой, я что-то неправильно читаю?
Редактировать: моя функция для вычисления значений точности и отзыва, полученная из матрицы путаницы из sklearn.metrics.confusion_matrix и списка номеров классов, например для классов 1-3: [1, 2, 3] классов.
def calc_precision_recall(conf_matrix, class_labels):
# for each class
for i in range(len(class_labels)):
# calculate true positives
true_positives =(conf_matrix[i, i])
# false positives
false_positives = (conf_matrix[i, :].sum() - true_positives)
# false negatives
false_negatives = 0
for j in range(len(class_labels)):
false_negatives += conf_matrix[j, i]
false_negatives -= true_positives
# and finally true negatives
true_negatives = (conf_matrix.sum() - false_positives - false_negatives - true_positives)
# print calculated values
print(
"Class label", class_labels[i],
"T_positive", true_positives,
"F_positive", false_positives,
"T_negative", true_negatives,
"F_negative", false_negatives,
"\nSensitivity/recall", true_positives / (true_positives + false_negatives),
"Specificity", true_negatives / (true_negatives + false_positives),
"Precision", true_positives/(true_positives+false_positives), "\n"
)
return