Матрица путаницы с несколькими метками - PullRequest
0 голосов
/ 21 сентября 2019

Я работаю с многокомпонентной классификацией на фактических данных и прогнозируемых данных из моего классификатора.Фактические данные состоят из трех классов (с1, с2 и с3), и таким же образом прогнозируемые данные также состоят из трех классов (с1, с2 и с3).Данные следующие:

Actual_data     Predicted_data
c1 c2 c3         c1 c2 c3
1  1  0          1  1  1
1  1  0          1  0  1
1  0  1          0  1  1
0  1  1          1  0  0
1  0  0          1  1  0
1  1  1          1  0  1

В классификации с несколькими метками документ может принадлежать более чем одному классу.В приведенных выше данных 1 представляет документ принадлежит определенному классу, а 0 представляет документ не принадлежит конкретному классу.

Первая строка Actual_data представляет документ принадлежит классу c1 и c2 и не принадлежит классуc3.Точно так же первая строка предикатных_данных, представляющих документ, принадлежит классам с1, с2 и с3.

Изначально я использовал R-программирование для нахождения матрицы путаницы между фактическими данными и прогнозируемыми данными.Я сохранил эти фреймы данных в y_actual и y_predict.

y_actual<-as.matrix(Actual_data)
y_predict<-as.matrix(Predicted_data)
xtab<-table(y_actual,y_predict)

Выходная таблица xtab равна

            y_predict
 y_actual     0 1
            0 1 5
            1 5 7

Затем я создал матрицу путаницы с использованием пакета каретки R, который приведен ниже

library(caret) 
confusionMatrix(xtab)
Confusion Matrix and Statistics
                   y_predict
           y_actual 0 1
                  0 1 5
                  1 5 7

               Accuracy : 0.4444          
                 95% CI : (0.2153, 0.6924)
     No Information Rate : 0.6667          
     P-Value [Acc > NIR] : 0.9856          

              Kappa : -0.25           
 Mcnemar's Test P-Value : 1.0000          

            Sensitivity : 0.16667         
            Specificity : 0.58333         
         Pos Pred Value : 0.16667         
         Neg Pred Value : 0.58333         
             Prevalence : 0.33333         
         Detection Rate : 0.05556         
   Detection Prevalence : 0.33333         
      Balanced Accuracy : 0.37500         

       'Positive' Class : 0  

В этом случае у меня нет матрицы путаницы с несколькими метками, вместо этого я получил матрицу путаницы с двоичными метками.Мне нужна запутанная матрица с c1, c2, c3 в y-фактическом, а также y-предсказывать вместо 0,1 в y-фактическом и y-предсказывать.

Затем я искал в интернете пакет utimlиспользуется для классификации по нескольким меткам в R, но это не обеспечивает желаемый результат.Затем я попробовал пакет Python Scikit для классификации по нескольким меткам, код приведен ниже.

import numpy as np
from sklearn.metrics import multilabel_confusion_matrix
y_actual = np.array([[1, 1, 0],
                     [1, 1, 0],
                     [1, 0, 1],
                     [0, 1, 1],
                     [1, 0, 0],
                     [1, 1, 1]])
y_predict = np.array([[1, 1, 1],
                      [1, 0, 1],
                      [0, 1, 1],
                      [1, 0, 0],
                      [1, 1, 0],
                      [1, 0, 1]])
matrix = multilabel_confusion_matrix(y_actual, y_predict)
print(matrix)
print(classification_report(y_actual,y_predict))

Вывод программы:

    [[[0 1]
      [1 4]]

    [[0 2]
      [3 1]]

    [[1 2]
      [1 2]]]
              precision    recall  f1-score   support

           0       0.80      0.80      0.80         5
           1       0.33      0.25      0.29         4
           2       0.50      0.67      0.57         3

   micro avg       0.58      0.58      0.58        12
   macro avg       0.54      0.57      0.55        12
weighted avg       0.57      0.58      0.57        12
 samples avg       0.53      0.61      0.54        12

В этом случае я тоже не являюсьполучить выходной ярлык мудрым.Может ли кто-нибудь помочь мне, какой пакет нужно использовать, чтобы получить матрицу путаницы с несколькими метками для вышеуказанных фактических и прогнозируемых данных на любой платформе (R-программирование, Python или Weka).На выходе матрица путаницы должна быть матрицей 3 * 3 для c1, c2 и c3 для y_actual и y_predict.

                    y_predict
    y_actual       c1 c2 c3
                c1 4
                c2    1
                c3       2

Здесь диагональный элемент предполагает, что на самом деле он принадлежит c1, а классификатор предсказал, что он принадлежит c1.Аналогично для с2 и с3.Мой вопрос заключается в том, как получить другие значения матрицы путаницы, поскольку это классификация по нескольким меткам.Эта проблема не является проблемой классификации нескольких классов, это проблема классификации нескольких меток.

1 Ответ

0 голосов
/ 21 сентября 2019

Вы можете использовать функцию multilabel_confusion_matrix из sklearn следующим образом:

import numpy as np
from sklearn.metrics import multilabel_confusion_matrix, classification_report

y_true = np.array([[1, 0, 1],
                   [0, 1, 0]])
y_pred = np.array([[1, 0, 0],
                   [0, 1, 1]])
matrix = multilabel_confusion_matrix(y_true, y_pred)
print(matrix)
print(classification_report(y_true,y_pred))
...