Як обчислити точність / відкликання для класифікації багаторівневих класів?


72

Мені цікаво, як обчислити точність і відкликати заходи для багаторівневої класифікації багаторівневих, тобто класифікації, де існує більше двох міток і де кожен екземпляр може мати кілька міток?


1
багатозначна частина робить це набагато складніше, і мене теж це цікавить. Я думаю, що це не стосується проблем із багатозначними позначеннями, але мені взагалі не вірять.
— користувач798719

1
Насправді всі проблеми з багаторівневою міткою є багатокласовими, тому ви можете використовувати пакет utiml в R, наприклад, або Mulan в Java.
— Адріано Ріволлі

Відповіді:


19

Іншим популярним інструментом для вимірювання продуктивності класифікатора є ROC / AUC ; цей теж має розширення для багатьох класів / мульти-етикетки: див. [Hand 2001]

[Hand 2001]: просте узагальнення площі під кривою ROC до задач класифікації декількох класів


Це популярно, але може бути баггі. Я не повністю їй довіряю. stats.stackexchange.com/questions/93901/…
— EngrStudent

3
Ніколи не змінюйте переповнення стека! Хлопець задає проблему, більшість голосованих відповідей насправді не відповідає на його запитання, але вказує на якийсь інший інструмент / бібліотеку, що було б краще
— ragvri

Так, як ця відповідь може мати +20? Він навіть не містить слів точності та нагадування.
— Саймон Дірмайє

якщо ви добре подумаєте, то зрозумієте, що акуратність та відкликання насправді захоплені AUC.
— oDDsKooL

16

Ось декілька обговорень теми форуму курсу про матрицю плутанини та вимірювання точності / відкликання в багатьох класах.

Основна ідея полягає в тому, щоб обчислити всю точність і згадати всі класи, а потім оцінити їх середнє для отримання єдиного реального вимірювання числа.

Матриця плутанини полегшує обчислення точності та відкликання класу.

Нижче наведено декілька основних пояснень щодо матриці плутанини, скопійованої з цього потоку:

Матриця плутанини - це спосіб класифікації справжніх позитивних, істинних негативів, помилкових позитивних та помилкових негативів, коли існує більше 2 класів. Він використовується для обчислення точності та відкликання, а отже, f1-балів для задач, що займаються різними класами.

Фактичні значення представлені стовпцями. Прогнозовані значення представлені рядками.

Приклади:

10 прикладів навчання, яких насправді 8, класифікуються (прогнозуються) неправильно, як 5
13 прикладів навчання, які насправді 4, класифікуються неправильно як 9

Матриця плутанини

см =
     0 1 2 3 4 5 6 7 8 9 10
     1 298 2 1 0 1 1 3 1 1 0
     2 0 293 7 4 1 0 5 2 0 0
     3 1 3 263 0 8 0 0 3 0 2
     4 1 5 0 261 4 0 3 2 0 1
     5 0 0 10 0 254 3 0 10 2 1
     6 0 4 1 1 4 300 0 1 0 0
     7 1 3 2 0 0 0 264 0 7 1
     8 3 5 3 1 7 1 0 289 1 0
     9 0 1 3 13 1 0 11 1 289 0
    10 0 6 0 1 6 1 2 1 4 304

Для класу x:

  • Справжнє позитивне: діагональне положення, см (х, х).

  • Хибне додатне: сума стовпця х (без основної діагоналі), сума (см (:, х)) - см (х, х).

  • Помилковий мінус: сума рядка x (без основної діагоналі), сума (cm (x, :), 2) -cm (x, x).

Ви можете обчислити точність, відкликання та оцінку F1 за формулою курсу.

Усереднення по всіх класах (з або без зважування) дає значення для всієї моделі.


2
У вас перекинуті оси. Виходячи з того, що ви написали, ваша CM повинна бути перенесена.
— Spacey

@Tarantula Чому ти так вважаєш? Я думаю, що він правильний.
— shahensha

@shahensha Спробуйте це для одного стовпця, це неправильно.
— Космічний

1
Посилання на тему Coursera розірвано
— shark8me

8
я не вірю, що ця відповідь справляється з багатозначною проблемою. це стосується багатокласних проблем. Яке поняття хибного позитивного чи хибного негативного в багатозначних задачах?
— користувач798719

13

Для класифікації на декількох марках у вас є два шляхи. Спочатку розглянемо наступне.

  • n - кількість прикладів.
  • Yi - присвоєння основної мітки правди прикладу ..ith
  • xi - приклад .ith
  • h(xi) - передбачувані мітки для прикладу .ith

На основі прикладу

Показники обчислюються у розрахунку на кожну точку даних. Для кожної передбачуваної мітки обчислюється лише її оцінка, а потім ці показники агрегуються за всіма точками даних.

  • Точність = , Коефіцієнт кількості прогнозованого є правильним. Чисельник знаходить, скільки міток у передбачуваному векторі є спільним із основною істиною, а коефіцієнт обчислює, скільки передбачуваних справжніх міток насправді знаходиться в основній істині.1n∑i=1n|Yi∩h(xi)||h(xi)|
  • Нагадаємо = , відношення кількості дійсних міток було передбачено Чисельник знаходить, скільки міток у передбачуваному векторі є спільним із основним істиною (як зазначено вище), потім знаходить відношення до кількості фактичних міток, тому отримує, яка частка фактичних міток була передбачена.1n∑i=1n|Yi∩h(xi)||Yi|

Є й інші показники.

На основі етикетки

Тут все робиться на етикетках. Для кожної мітки обчислюються метрики (наприклад, точність, відкликання), а потім ці метричні показники агрегуються. Отже, у цьому випадку ви закінчуєте обчислення точності / виклику для кожної мітки протягом усього набору даних, як і для двійкової класифікації (оскільки кожна мітка має двійкове призначення), а потім агрегуєте її.

Найпростіший спосіб - представити загальну форму.

Це лише розширення стандартного еквівалента в багатьох класах.

  • Усереднене макро1q∑j=1qB(TPj,FPj,TNj,FNj)

  • Мікро середнє значенняB(∑j=1qTPj,∑j=1qFPj,∑j=1qTNj,∑j=1qFNj)

Тут - справжні позитивні, помилкові позитивні, справжні негативні та хибні негативні підрахунки відповідно лише для мітки . j t hTPj,FPj,TNj,FNjjth

Тут означає будь-яку метрику на основі матриці плутанини. У вашому випадку ви підключите стандартні формули точності та нагадування. Для макро середнього значення ви передаєте підрахунок на одну мітку, а потім підсумовуєте, для мікро середнього значення ви спочатку оцінюєте підрахунки, а потім застосовуєте свою метричну функцію.B

Ви можете бути зацікавлені , щоб подивитися в код для метрики мульт-мітки тут , яка входить до складу пакету млдр в R . Також вам може бути цікаво заглянути в бібліотеку мультиварок Java MULAN .

Це приємний документ для ознайомлення з різними показниками: Огляд алгоритмів навчання з мітками


Було б добре, якби ви могли дати посилання на достовірність показників, які ви написали, як деякі посилання на вікіпедію. Посилання, які ви згадали, - це частина кодування метрик або дослідницької роботи ..
— hacker315

2
Документ з оглядом вже пов'язаний в кінці відповіді (Огляд алгоритмів навчання, що належить до багатьох міток) ieeexplore.ieee.org/document/6471714 . Це добре відомі показники в літературі, на основі яких здійснюються реалізації. Я не впевнений, як я можу продемонструвати справжність.
— фоксис

8

Я не знаю про мульти-етикетку, але для класифікації mutli-клас ці посилання вам допоможуть

Це посилання пояснює, як побудувати матрицю плутанини, яку можна використовувати для обчислення точності та виклику для кожної категорії

І це посилання пояснює, як обчислити заходи micro-f1 та macro-f1 для оцінки класифікатора в цілому.

сподіваюся, що ви знайшли це корисним.


4
Ключовий момент: існує кілька можливих дійсних способів обчислення цих показників (наприклад, мікро-F1 проти макро-F1), оскільки існує кілька способів визначити, що правильно. Це залежить від вашої заявки та критеріїв дійсності.
— Джек Таннер

Ахмед: Дякую за посилання! @JackTanner Чи могли б ви мати посилання на це (для випадку багатокласової класифікації на багато міток)?
— Вам

1
@MaVe, вибачте, посилань немає. Це просто з особистого досвіду. Ви потрапите туди просто, подумавши про те, що є, скажімо, справжнім позитивом та помилковим позитивом для ваших цілей.
— Джек Таннер


1

це посилання допомогло мені .. https://www.youtube.com/watch?v=HBi-P5j0Kec Я сподіваюся, що це допоможе і вам

скажіть розподіл, як показано нижче

    A   B   C   D
A   100 80  10  10
B   0    9   0   1
C   0    1   8   1
D   0    1   0   9

точність для A була б

P (A) = 100/100 + 0 + 0 +0 = 100

P (B) = 9/9 + 80 + 1 + 1 = 9/91 psst ... по суті прийняти справжній позитив класу і розділити на дані стовпців на рядки

згадати для себе було б

R (A) = 100 / 100+ 80 + 10 + 10 = 0,5

R (B) = 9 / 9+ 0 + 0 + 1 = 0,9

psst ... по суті прийняти справжній позитив класу і розділити на дані рядків на стовпці

як тільки ви отримаєте всі значення, візьміть середню макрокоманду

avg (P) = P (A) + P (B) + P (C) + P (D) / 4

avg (R) = R (A) + R (B) + R (C) + R (D) / 4

F1 = 2 * avg (P) * avg (R) / avg (P) + avg (R)


0

Ознайомтеся з цими слайдами з сайту cs205.org у Гарварді . Як тільки ви потрапите в розділ "Заходи помилок", відбувається обговорення точності та відкликання в налаштуваннях багатьох класів (наприклад, одна проти всіх або один проти одного) та матриці плутанини. Матриці плутанини - це те, що вам тут справді хочеться

FYI, в пакеті програмного забезпечення Python scikits.learn є вбудовані методи автоматичного обчислення таких речей, як матриця плутанини з класифікаторів, підготовлених за даними багатокласових даних. Можливо, він може безпосередньо обчислити графіки точності нагадування і для вас. Варто подивитися.


4
На жаль, посилання на слайди мертва, і я міг знайти слайди в іншому місці.
— f3lix

Він поповниться, коли потрапить на цю лекцію цьогорічного курсу. Якби я міг скопіювати PDF у постійне місце посилання, я би, але не можу, тому періодичне розривання неминуче і не знайдеться іншого місця, де можна знайти нотатки, вони характерні для цього курсу.
— ely

sklearn не підтримує мультитикетку для матриці плутанини github.com/scikit-learn/scikit-learn/isissue/3452
— Franck Dernoncourt

0

З Ozgur et al (2005) можна побачити, що слід обчислити точність та відкликання, дотримуючись звичайних виразів, але замість усереднення по загальній кількості N екземплярів у вашому наборі даних слід використовувати N = [екземпляри принаймні однієї мітки з клас, про який йдеться].

тут згадується посилання: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf


0

Точно так само, як і в загальному випадку, з наборами:

http://en.wikipedia.org/wiki/F1_score

http://en.wikipedia.org/wiki/Precision_and_recall

Ось прості функції Python, які роблять саме так:

def precision(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1


def recall(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    return len(i) / len(y_true)


def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    if p + r == 0:
        return 0
    else:
        return 2 * (p * r) / (p + r)


if __name__ == '__main__':
    print(f1(['A', 'B', 'C'], ['A', 'B']))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.