Расчет точности для мультиклассовой классификации - PullRequest
0 голосов
/ 17 марта 2020

Рассмотрим задачу классификации трех классов со следующей матрицей путаницы.

cm_matrix = 
                predict_class1    predict_class2    predict_class3
                 ______________    ______________    ______________

Actual_class1         2000                 0                 0     
Actual_class2           34              1966                 0     
Actual_class3            0                 0              2000   



Multi-Class Confusion Matrix Output
                     TruePositive    FalsePositive    FalseNegative    TrueNegative
                     ____________    _____________    _____________    ____________

    Actual_class1        2000             34                0              3966    
    Actual_class2        1966              0               34              4000    
    Actual_class3        2000              0                0              4000    

Я использовал формулу:

Accuracy Of Each class=(TP ./total instances of that class)

(формула основана на ответе здесь: Путаница вычисления точности индивидуального класса )

Sensitivity=TP./TP+FN ;

Реализация этого в Matlab:

acc_1  = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100
acc_2  = 100*(cm_matrix(2,2))/sum(cm_matrix(2,:)) =  100*(1966)/(34+1966+0) = 98.3
acc_3  = 100*(cm_matrix(3,3))/sum(cm_matrix(3,:)) = 100*(2000)/(0+0+2000) = 100

sensitivity_1 = 2000/(2000+0)=1 = acc_1
sensitivity_2 =  1966/(1966+34) = 98.3 = acc_2
sensitivity_3 = 2000/2000 = 1 = acc_3

Вопрос1) Является ли моя формула для точности каждого класса правильно? Для расчета точности каждого отдельного класса, скажем, для положительного класса, я должен взять TP в числителе. Аналогично, для точности только отрицательного класса я должен учитывать TN в числителе в формуле для точности. Применима ли эта же формула к бинарной классификации? Является ли моя реализация правильной?

Вопрос2) Правильна ли моя формула чувствительности? Тогда почему я получаю такой же ответ, как и у отдельных классов?

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Вопрос1) Правильна ли моя формула для точности каждого класса?

Нет, вы используете формулу для Чувствительность (Напомним). См. Ниже.

Для расчета точности каждого отдельного класса, скажем, для положительного класса, я должен взять TP в числителе. Аналогично, для точности только отрицательного класса я должен учитывать TN в числителе в формуле для точности. Применима ли эта же формула к бинарной классификации? Правильно ли реализована моя реализация?

Точность - это отношение количества правильно классифицированных экземпляров к общему количеству экземпляров. TN, или число экземпляров, правильно определенных как , а не , находящихся в классе, также являются правильно классифицированными экземплярами. Вы не можете просто оставить их.

Точность также обычно используется только для оценки всего классификатора для всех классов, а не отдельных классов. Однако вы можете обобщить формулу точности для обработки отдельных классов, как это сделано здесь для вычисления средней точности классификации для мультиклассового классификатора. (См. Также ссылочную статью .)

Формула, которую они используют для каждого класса:

enter image description here

Как видите, она идентична обычной формуле точности, но мы учитываем только оценки TP и TN отдельного класса (знаменатель по-прежнему является общим числом наблюдений). Применяя это к вашему набору данных, мы получим:

acc_1 = (2000+3966)/(2000+34+0+3966) = 0.99433
acc_2 = (1966+4000)/(1966+0+34+4000) = 0.99433
acc_3 = (2000+4000)/(2000+0+0+4000)  = 1.00000

Это, по крайней мере, имеет более интуитивный смысл, поскольку первые два класса имели неправильно классифицированные экземпляры, а третий - нет. Являются ли эти меры полезными - это другой вопрос.


Вопрос2) Правильна ли моя формула чувствительности?

Да, чувствительность задается как:

TP / TP+FN

, что представляет собой отношение правильно идентифицированных экземпляров как находящихся в этом классе к общему количеству экземпляров в классе . В двоичном классификаторе вы по умолчанию вычисляете чувствительность для положительного класса. Чувствительность к отрицательному классу - это уровень ошибок (также называемый ошибкой или ошибочно-отрицательным уровнем в статье в Википедии) и просто:

FN / TP+FN === 1 - Sensitivity

FN - не более чем TP для отрицательного класса! (Значение TP также обращено вспять.) Поэтому естественно распространить это на все классы, как вы сделали.

Тогда почему я получаю тот же ответ, что и точность отдельных классов?

Поскольку вы используете одну и ту же формулу для обоих.

Посмотрите на свою матрицу путаницы:

cm_matrix = 
                predict_class1    predict_class2    predict_class3
                 ______________    ______________    ______________

Actual_class1         2000                 0                 0     
Actual_class2           34              1966                 0     
Actual_class3            0                 0              2000

TP для класса 1, очевидно, 2000

cm_matrix(1,1)

FN - сумма двух других столбцов в этой строке. Поэтому TP + FN - это сумма строки 1

sum(cm_matrix(1,:) 

. Именно эту формулу вы использовали для точности.

acc_1  = 100*(cm_matrix(1,1))/sum(cm_matrix(1,:)) = 100*(2000)/(2000+0+0) = 100
0 голосов
/ 18 марта 2020

Ответ на вопрос 1. Кажется, что точность используется только в двоичной классификации, отметьте эту ссылку . Вы ссылаетесь на ответ на этом сайте, но это касается и бинарной классификации (т.е. классификация только на 2 класса). Похоже, у вас более двух классов, и в этом случае вам следует попробовать что-то еще или классификацию «один против всех» для каждого класса (для каждого класса прогноз разбора для class_n и non_class_n).

Ответ на вопрос 2. Та же проблема, эта мера подходит для бинарной классификации, которая не относится к вашему случаю.

Формула для чувствительности:

TP./(TP + FN)

Формула для точности:

(TP)./(TP+FN+FP+TN)

См. Документацию здесь .

ОБНОВЛЕНИЕ

И если вы хотите использовать sh матрицу путаницы, у вас есть:

TP по диагонали, на уровне класса FN сумма всех значений в столбце класса. В функции getvalues начните отсчет строк из объявления функции и проверьте строки 30 и 31:

TP(i)=c_matrix(i,i);
FN(i)=sum(c_matrix(i,:))-c_matrix(i,i);
FP(i)=sum(c_matrix(:,i))-c_matrix(i,i);
TN(i)=sum(c_matrix(:))-TP(i)-FP(i)-FN(i);

Если вы примените формулу точности, вы получите после вычисления и упрощения:

accuracy = c_matrix(i,i) / sum(c_matrix(:))

Чувствительность, которую вы получите после упрощения:

sensitivity =  c_matrix(i,i) / sum(c_matrix(i,:))

Если вы хотите лучше понять, просто проверьте ссылки, которые я вам отправил.

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