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


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

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

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

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

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

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

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

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

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

  • Усереднене макро1qj=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.