멀티 클래스 멀티 라벨 분류에 대한 정밀도 / 호출을 계산하는 방법은 무엇입니까?


72

멀티 클래스 멀티 라벨 분류 (예 : 두 개 이상의 레이블이있는 분류 및 각 인스턴스가 여러 레이블을 가질 수있는 분류)에 대한 정밀도 및 리콜 측정을 계산하는 방법이 궁금합니다.


1
다중 레이블 부분이 훨씬 어려워지고 나도 이것에 관심이 있습니다. 나는 그것이 다중 레이블 문제에는 적용되지 않지만 나를 전혀 믿지 않는다고 생각합니다.
user798719

1
실제로 모든 다중 레이블 문제는 다중 클래스이므로 R에서 utiml 패키지를 사용하거나 Java에서 Mulan을 사용할 수 있습니다.
Adriano Rivolli

답변:


19

분류기 성능을 측정하는 또 다른 널리 사용되는 도구는 ROC / AUC입니다 . 이것 역시 멀티 클래스 / 멀티 라벨 확장을 가지고있다 : [Hand 2001] 참조

[Hand 2001] : ROC 곡선 아래 영역을 여러 클래스 분류 문제로 간단하게 일반화


인기가 있지만 버그가 될 수 있습니다. 나는 그것을 완전히 신뢰하지 않습니다. stats.stackexchange.com/questions/93901/…
EngrStudent

3
스택 오버플로를 변경하지 마십시오! 가이는 대부분 실제로 자신의 질문에 대답하지 않는 대답을 투표를하지만, 더 나은 것 다른 도구 / 라이브러리 지적 문제 요청
ragvri

예,이 답변의 +20은 어떻게 되나요? 그것은 정확성과 기억이라는 단어조차 포함하지 않습니다.
Simon Dirmeier

당신이 철저히 생각한다면 정확성과 리콜이 실제로 AUC에 의해 포착된다는 것을 알 수 있습니다.
oDDsKooL

16

다음 은 혼동 행렬 및 다중 등급 정밀 / 호출 측정에 대한 강의 포럼 스레드에 대한 설명입니다.

기본 아이디어는 모든 정밀도를 계산하고 모든 클래스를 리콜 한 다음 평균을 계산하여 단일 실수 측정 값을 얻는 것입니다.

혼동 행렬을 사용하면 클래스의 정밀도와 리콜을 쉽게 계산할 수 있습니다.

아래는 해당 스레드에서 복사 한 혼동 행렬에 대한 기본 설명입니다.

혼동 행렬은 클래스가 2 개 이상일 때 진 양성, 진 음성, 오 탐지 및 거짓 음성을 분류하는 방법입니다. 정밀도와 리콜을 계산하는 데 사용되므로 멀티 클래스 문제의 경우 f1 점수입니다.

실제 값은 열로 표시됩니다. 예측 된 값은 행으로 표시됩니다.

예 :

실제로 8 개의 10 개의 훈련 예가 5로 잘못 분류 (예측 됨) 5
실제로는 4 개의 훈련 예가 9로 잘못 분류 됨

혼란 매트릭스

cm =
     012 34 5678 9 10
     1 298 2111011 3110
     209393 10 5 2 0 0
     3 1 263 0 0 3 0 2
     4 1 5261 26 34 3 1
     50000 254 3 0 10 2 1
     6 012 1 300 30010
     7 1 3 2 0 260 0 7 1
     8 3 5 3 7 7 0 289 1 0
     9 1 3 1111 11 1 289 0
    10 6 0 1 6 112 4 304

클래스 x의 경우 :

  • 진정한 양수 : 대각선 위치, cm (x, x).

  • False positive : 열 x의 합 (주 대각선 제외), 합 (cm (:, x))-cm (x, x).

  • 거짓 음수 : 행 x의 합 (주 대각선 제외), 합 (cm (x, :), 2) -cm (x, x).

코스 공식에 따라 정밀도, 리콜 및 F1 점수를 계산할 수 있습니다.

가중치가 있거나없는 모든 클래스의 평균을 계산하면 전체 모델에 대한 값이 제공됩니다.


2
축이 뒤집어졌습니다. 작성한 내용에 따라 CM을 바꿉니다.
Spacey

@Tarantula 왜 그렇게 생각하십니까? 나는 그가 옳다고 생각합니다.
shahensha

@shahensha 한 열에 사용해보십시오. 잘못되었습니다.
Spacey

1
Coursera 스레드로의 링크가 끊어짐
shark8me

8
이 답변이 다중 레이블 문제를 처리한다고 믿지 않습니다. 그것은 다중 클래스 문제에 적용됩니다. 다중 레이블 문제에서 오 탐지 또는 오 탐지의 개념은 무엇입니까?
user798719

13

다중 레이블 분류의 경우 두 가지 방법이 있습니다. 먼저 다음을 고려하십시오.

  • n
  • Yiith
  • xiith
  • 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)

TPj,FPj,TNj,FNjjth

B

당신은 멀티 포트 라벨 메트릭의 코드로 살펴 가지고 관심을 가질만한 여기를 , 어떤 패키지의 일부 mldr 에서 R . 또한 Java 다중 레이블 라이브러리 MULAN 을 살펴볼 수도 있습니다 .

이 글은 여러 가지 통계를 얻을 수있는 좋은 논문입니다 : 다중 레이블 학습 알고리즘에 대한 검토


위키 백과 참조와 같이 작성한 메트릭의 신뢰성에 대한 참조를 제공 할 수 있다면 좋을 것입니다. 언급 한 참고 문헌은 지표 또는 연구 논문의 코딩 부분입니다.
hacker315

2
답의 끝에는 검토 논문이 이미 연결되어 있습니다 (다중 레이블 학습 알고리즘에 대한 검토) ieeexplore.ieee.org/document/6471714 . 이것들은 구현이 수행되는 것을 기반으로 한 문헌에서 잘 알려진 지표입니다. 진위를 어떻게 입증 할 수 있는지 잘 모르겠습니다.
공포

8

다중 레이블 부분에 대해서는 모르지만 다중 클래스 분류의 경우 해당 링크가 도움이 될 것입니다

링크 는 정밀도를 계산하고 각 범주에 대해 호출하는 데 사용할 수있는 혼동 행렬을 작성하는 방법을 설명합니다

링크 는 분류기를 전체적으로 평가하기 위해 micro-f1 및 macro-f1 측정 값을 계산하는 방법을 설명합니다.

도움이 되셨기를 바랍니다.


4
핵심은 다음과 같습니다. 올바른 것을 정의하는 여러 가지 방법이 있기 때문에 이러한 메트릭을 계산하는 여러 가지 유효한 방법이 있습니다 (예 : micro-F1 대 macro-F1). 이것은 응용 프로그램 및 유효성 기준에 따라 다릅니다.
잭 태너

Ahmed : 링크 주셔서 감사합니다! @JackTanner (멀티 클래스 멀티 레이블 분류의 경우) 이것에 대한 참조가 필요하십니까?
Vam

1
@MaVe, 죄송합니다. 링크가 없습니다. 이것은 개인적인 경험에서 비롯된 것입니다. 당신은 단순히 당신의 목적을 위해 진정한 긍정적이고 거짓 긍정적 인 것이 무엇인지 생각함으로써 거기에 도착할 것입니다.
Jack Tanner

4
첫 번째 링크 사망
Nikana Reklawyks

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 ... 본질적으로 클래스의 진정한 긍정을 취하고 열의 행 데이터로 나눕니다.

모든 값을 얻으면 매크로 평균을 취하십시오.

평균 (P) = P (A) + P (B) + P (C) + P (D) / 4

평균 (R) = R (A) + R (B) + R (C) + R (D) / 4

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


0

이 슬라이드는 Harvard의 cs205.org에서 확인하십시오 . 오차 측정 섹션으로 이동하면 멀티 클래스 설정 (예 : 일대일 또는 일대일) 및 혼동 행렬에서 정밀도 및 리콜에 대해 설명합니다. 혼란 매트릭스는 당신이 정말로 원하는 것입니다.

참고로, Python 소프트웨어 패키지 scikits.learn 에는 멀티 클래스 데이터에 대해 학습 된 분류기의 혼동 매트릭스와 같은 것을 자동으로 계산하는 내장 메소드가 있습니다. 정밀 리콜 플롯을 직접 계산할 수도 있습니다. 한번 볼 가치가 있습니다.


4
불행히도 슬라이드에 대한 링크가 죽어 다른 곳에서 슬라이드를 찾을 수 있습니다.
f3lix

올해 강의에 참석하면 보충됩니다. PDF를 영구적 인 링크 위치에 복사 할 수는 있지만 할 수는 없으므로 주기적으로 중단하는 것은 불가피하며 메모를 찾을 수있는 다른 장소는 없으며 해당 과정에 따라 다릅니다.
ely

sklearn은 혼동 행렬에 대해 다중 레이블을 지원하지 않습니다. github.com/scikit-learn/scikit-learn/issues/3452
Franck Dernoncourt


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']))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.