Матрица смешения для случая нескольких классов, оценка всех метрик оценки - PullRequest
1 голос
/ 09 января 2020

Я занимаюсь самообучением в ML. Я пытаюсь обучить модель K-NN, и моя модель дала мне матрицу смешения ниже 7X7. Я вручную рассчитал точность для двух классов (A и B), но не уверен, Мой подход правильный или нет. Я хотел бы, чтобы кто-то еще там подтвердил свой результат, чтобы я написал программу для расчета 5 других классов.

Confusion Matrx : 

  A      B    C    D   E    F     G =  7 classes
[[ 238    1    2    0   41   11    0]
 [   0   25    0    0    3    1    0]
 [  21    1   32    0   17    4    0]
 [   0    0    0    7    9    3    0]
 [   7    0    0    0 3633    8    0]
 [  44    0    4    1  397  256    1]
 [   4    0    0    0    7    2    3]]


Class-A 
tp = 238
fp = 76  (Rest of the 'a' column e.g 21+0+7+44+4 = 76)
tn = 4414


    [25    0    0    3    1    0]
    [1    32    0   17    4    0]
    [0     0    7    9    3    0]
    [0     0    0 3633    8    0]
    [0     4    1  397  256    1]
    [0     0    0    7    2    3]

  Sum of all elements will be true negative = 4414

  fn = 55 (Rest of the 'a' rows element e.g 1+2+0+41+11+0 =55 )

  So class-A  confusion matrix will something look like below

  tp fp | 238 76
        |
  fn tn | 55 4414

  Class A Accuracy = tp+tn/tp+tn+fp+fn = 4652/4768 = 0.97

  Class B 
  tp = 25
  fp = 2
  tn = 4752

  [  238       2    0   41   11    0]
  [  21       32    0   17    4    0]
  [   0        0    7    9    3    0]
  [   7        0    0 3633    8    0]
  [  44        4    1  397  256    1]
  [   4        0    0    7    2    3]

  fn = 4

  So class-B  confusion matrix will something look like below

  tp fp | 2 76
        |
  fn tn | 4 4752

 Class B Accuracy = tp+tn/tp+tn+fp+fn = 4754/4834 = 0.98

Я пытался искать в Интернете, но не сделал найти любой расчет более 2X2 матрицы.

1 Ответ

2 голосов
/ 09 января 2020

Для случая с несколькими классами это можно использовать:


import numpy as np

cnf_matrix = np.array([[13,  0,  0],
                       [ 0, 10,  6],
                       [ 0,  0,  9]])

FP = cnf_matrix.sum(axis=0) - np.diag(cnf_matrix)  
FN = cnf_matrix.sum(axis=1) - np.diag(cnf_matrix)
TP = np.diag(cnf_matrix)
TN = cnf_matrix.sum() - (FP + FN + TP)

FP = FP.astype(float)
FN = FN.astype(float)
TP = TP.astype(float)
TN = TN.astype(float)


# Sensitivity, hit rate, recall, or true positive rate
TPR = TP/(TP+FN)
# Specificity or true negative rate
TNR = TN/(TN+FP) 
# Precision or positive predictive value
PPV = TP/(TP+FP)
# Negative predictive value
NPV = TN/(TN+FN)
# Fall out or false positive rate
FPR = FP/(FP+TN)
# False negative rate
FNR = FN/(TP+FN)
# False discovery rate
FDR = FP/(TP+FP)

# Overall accuracy
ACC = (TP+TN)/(TP+FP+FN+TN)

Идея кода: эти метрики представлены графически для общего случая с большим количеством классов в следующее изображение.

Multiclass Confusion Matrix

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