Расчет точности для многоклассовой классификации

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

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) Верна ли моя формула для определения чувствительности? Тогда почему я получаю тот же ответ, что и точность отдельных классов?


person Sm1    schedule 17.03.2020    source источник
comment
Почему вы сомневаетесь в этих формулах? Какие исследования вы провели? Как ваши исследования привели к вашему замешательству или, по крайней мере, не смогли его развеять? Не дало ли ваше применение этих формул значимых результатов? Каков ваш фактический вопрос, потому что я примерно на 95% уверен, что вы опубликовали не это.   -  person beaker    schedule 17.03.2020
comment
Пожалуйста, смотрите мой обновленный вопрос, где я подробно объяснил. Проблема в том, что везде приводится формула для общей точности класса (TP + TN./ TP+FP+FN+TN). Я не смог найти ссылку для расчета формулы для точности отдельных классов для классификации нескольких классов. Поэтому мне пришлось заимствовать ссылку из Matlab. В формуле общей точности знаменатель имеет TN, но для точности отдельного класса не должно быть TN, насколько я понимаю. Должно быть, я ошибся с формулой чувствительности отдельных классов для случая многоклассовой классификации.   -  person Sm1    schedule 17.03.2020
comment
Поэтому я разместил сообщение, так как мне негде найти ссылку для случая с несколькими классами.   -  person Sm1    schedule 17.03.2020
comment
Если вы посмотрите на ссылку Википедии в другом вопросе, ваша формула точности неверна. Должно быть TP+TN / TP+TN+FP+FN.   -  person beaker    schedule 17.03.2020
comment
@beaker: Формула, которую вы написали, предназначена для расчета точности всей матрицы путаницы: number of correct prediction / total samples. Если нужно рассчитать точность отдельных классов, то, возможно, следует учитывать только: number of correct prediction for class1/number of samples in class Аналогично для других классов. Я думаю, что эту формулу можно распространить на случай с несколькими классами, поскольку я наконец нашел набор инструментов. Но в этом наборе инструментов есть две проблемы: mathworks.com/matlabcentral /обмен файлами/   -  person Sm1    schedule 18.03.2020
comment
(1) (1) если бы вы могли видеть второй switch case под функцией getvalues формулу для расчета точности отдельного класса: есть for loop и эти переменные используются RefereceResult.AccuracyOfSingle=(TP ./ P)' = TP/TP+FN; и другая точность accuracy=(TP)./(P+N); Так что знаменатель другой. Я не знаю почему. (2) Формула для чувствительности приведена та же, что и для точности.   -  person Sm1    schedule 18.03.2020
comment
TP/TP+FN — отзыв. Я понятия не имею, почему случайный интернет-парень назвал это точностью.   -  person beaker    schedule 18.03.2020
comment
@beaker: спасибо, что нашли время посмотреть на этот код. Действительно, знаменатель точности неверен. Но если я использую здравый смысл для точности каждого класса, то это будет: правильные прогнозы для этого класса/всего экземпляров, принадлежащих этому классу. По совпадению мой ответ совпадает с ответами от запуска кода. Однако чувствительность и точность для каждого класса будут одинаковыми. Это может быть еще одно совпадение. Я показал работу в вопросе, чтобы показать свою точку зрения. Если можно, ответьте на мой вопрос. Правильно ли моя реализация и ответы?   -  person Sm1    schedule 18.03.2020
comment
Полностью получите свой гнев и разочарование. Извини   -  person Sm1    schedule 18.03.2020
comment
@beaker: Буду очень признателен за ответ. Ева Я думала, что индивидуальная точность класса подобна чувствительности или отзыву. Но они отличаются, как указано в этом сообщении: researchgate.net/post/ Способ для каждого класса рассчитывается совпадение с моим расчетом в фрагментах кода реализации Matlab. Однако по какому-то стечению обстоятельств мои индивидуальные значения точности класса становятся такими же, как отзыв, хотя формула отличается.   -  person Sm1    schedule 18.03.2020


Ответы (2)


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

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

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

TP./(TP + FN)

Формула точности такова:

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

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

ОБНОВЛЕНИЕ

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

ТП по диагонали, на уровне класса ФН сумма всех значений в столбце класса. В функции 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,:))

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

person Catalina Chircu    schedule 17.03.2020
comment
Спасибо за ответ. Должен быть способ найти точность и индивидуальную чувствительность отдельных классов, принимая во внимание диагональный элемент, как в этом примере: mathworks.com/matlabcentral/fileexchange/ Если бы вы могли увидеть второй switch case под функцией getvalues, вы бы увидели формулу для расчета точности отдельного класса: for loop и эти переменные используются RefereceResult.AccuracyOfSingle=(TP ./ P)' = TP/TP+FN; - person Sm1; 18.03.2020
comment
Теперь эта формула аналогична чувствительности, но отличается от той, что у вас есть. - person Sm1; 18.03.2020
comment
Спасибо, что нашли время пройти по этой ссылке Matlab. Но меня смутило то, что в формуле для чувствительности, похоже, есть ошибка, поэтому ответ для чувствительности = точность для отдельных классов. Также не могли бы вы написать математическую формулу для точности отдельных классов, поскольку этот код предоставляет две формулы, и я не знаю, какая из них верна: точность = (TP)./(TP+FN+FP+TN) или (TP ./ TP+FN)? - person Sm1; 18.03.2020
comment
Ваша формула точности неверна, но ваша формула чувствительности верна. Обе формулы верны в коде Matlab. Вы также можете найти эти формулы в ссылке, которую я вам отправил. Пожалуйста, нажмите на нее, она содержит более подробную информацию. - person Catalina Chircu; 18.03.2020
comment
Не могли бы вы указать правильную формулу для точности отдельных классов. В этом коде MATlab есть 2 формулы, какую из них вы считаете правильной? (TP)./(TP+FN+FP+TN) или (TP ./ TP+FN)? Кроме того, при использовании этой формулы значения точности и чувствительности будут такими же, как указано и выработано в моем вопросе. Тогда это совпадение? - person Sm1; 18.03.2020
comment
Я уже ответил на это. Пожалуйста, внимательно прочитайте мой ответ. У вас есть все в нем. - person Catalina Chircu; 18.03.2020
comment
@beaker: Обновлено. - person Catalina Chircu; 18.03.2020
comment
Спасибо за обновление вашего ответа. Формула точности для каждого предоставленного вами класса имеет в знаменателе общее количество экземпляров. Я думаю, что точность для каждого класса должна быть количеством правильных прогнозов для этого класса/всего экземпляров для этого класса, а не для всех экземпляров. Точность отдельных классов = чувствительность для каждого класса, как указано @beaker. Таким образом, формула должна быть такой же. Не могли бы вы проверить. Я просмотрел ссылки и, исходя из этого, я думаю, что знаменатель должен быть экземпляром, принадлежащим этому классу. - person Sm1; 18.03.2020
comment
Я думаю, вам следует внимательно прочитать документацию по этому вопросу, чтобы полностью понять концепции здесь. Вы можете прочитать страницы по ссылкам, которые я отправил, и другим ссылкам, которые вы можете найти. стакан предоставил ту же формулу точности, что и я, и в TP+TN / TP+TN+FP+FN у вас есть TP+TN+FP+FN=all_the_occurences. С другой стороны, я вижу из вашего предыдущего сообщения, что вы нашли ответ, поэтому я не понимаю, в чем именно вам нужна помощь. Пожалуйста, будьте точнее или попробуйте написать формулу, выражающую вашу мысль. - person Catalina Chircu; 18.03.2020

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

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

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

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

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

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

введите здесь описание изображения

Как видите, она идентична обычной формуле точности, но мы учитываем только оценки 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

ФН не более чем ТП для негативного класса! (Смысл TP также меняется на противоположный.) Поэтому естественно распространить это на все классы, как вы это сделали.

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

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

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

cm_matrix = 
                predict_class1    predict_class2    predict_class3
                 ______________    ______________    ______________

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

ТП для 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
person beaker    schedule 18.03.2020
comment
Спасибо за ваш ответ и ссылку. Однако другой ответ здесь stackoverflow.com/questions/51255247/ использует другую формулу (которую я использовал в мультиклассовой классификации) для точности отдельных классов. Он не поставил TN в числителе. Он ответил, что точность индивидуального класса - это TP of that class/total instances in that class Пример был для двоичной классификации. Я думал, что то же самое применимо к мультиклассу. - person Sm1; 18.03.2020
comment
Вероятно, это была ошибка. Вы не поставили TN в числителе в своем примере, Крис не поставил его в своем. Вам придется спросить его, почему он так поступил. Всякий раз, когда вы получаете совет от случайных интернет-людей, вы должны самостоятельно изучить его и посмотреть, имеет ли смысл их совет. В данном случае для меня нет. Между прочим, я случайный пользователь Интернета, так что вам придется убедиться, что мой совет имеет смысл. Но я не собираюсь сидеть здесь и пытаться выбить каждую формулу из каждой ссылки, которую вы можете придумать. - person beaker; 18.03.2020
comment
Верно, я понимаю вашу точку зрения, я тоже должен провести исследование. Вот еще одна ссылка, в которой приводится та же формула для точности отдельных классов, о которой я говорю. Формула вызывается как точность пользователя gis.humboldt.edu /OLM/Courses/GSP_216_Online/lesson6-2/ Матрица путаницы перевернута по сравнению с моей, поэтому формула представляет собой TP/общее количество столбцов, где общее количество столбцов указывает количество экземпляров этого класса. - person Sm1; 18.03.2020
comment
Ты действительно не только что сделал это, не так ли? :-) - person beaker; 18.03.2020
comment
Пожалуйста, не поймите меня неправильно, я не намерен обидеть вас или кого-либо. Я здесь, чтобы учиться, но меня не очень убеждают ни ответы, ни ваша точка зрения. Таким образом, я просто ищу и исследую, чтобы найти правильный ответ. - person Sm1; 19.03.2020
comment
Хорошо. Сомневайтесь во всем. Если вы найдете подход, который лучше подходит для вашей ситуации, отлично! Пишите, буду рад узнать что-то новое. И если у вас есть какие-либо вопросы по моим рассуждениям, я буду рад уточнить, где я могу. - person beaker; 19.03.2020