멀티 클래스 멀티 라벨 분류 (예 : 두 개 이상의 레이블이있는 분류 및 각 인스턴스가 여러 레이블을 가질 수있는 분류)에 대한 정밀도 및 리콜 측정을 계산하는 방법이 궁금합니다.
멀티 클래스 멀티 라벨 분류 (예 : 두 개 이상의 레이블이있는 분류 및 각 인스턴스가 여러 레이블을 가질 수있는 분류)에 대한 정밀도 및 리콜 측정을 계산하는 방법이 궁금합니다.
답변:
분류기 성능을 측정하는 또 다른 널리 사용되는 도구는 ROC / AUC입니다 . 이것 역시 멀티 클래스 / 멀티 라벨 확장을 가지고있다 : [Hand 2001] 참조
[Hand 2001] : ROC 곡선 아래 영역을 여러 클래스 분류 문제로 간단하게 일반화
다음 은 혼동 행렬 및 다중 등급 정밀 / 호출 측정에 대한 강의 포럼 스레드에 대한 설명입니다.
기본 아이디어는 모든 정밀도를 계산하고 모든 클래스를 리콜 한 다음 평균을 계산하여 단일 실수 측정 값을 얻는 것입니다.
혼동 행렬을 사용하면 클래스의 정밀도와 리콜을 쉽게 계산할 수 있습니다.
아래는 해당 스레드에서 복사 한 혼동 행렬에 대한 기본 설명입니다.
혼동 행렬은 클래스가 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 점수를 계산할 수 있습니다.
가중치가 있거나없는 모든 클래스의 평균을 계산하면 전체 모델에 대한 값이 제공됩니다.
다중 레이블 분류의 경우 두 가지 방법이 있습니다. 먼저 다음을 고려하십시오.
메트릭은 데이터 포인트 방식으로 계산됩니다. 예측 된 각 레이블에 대해 해당 점수 만 계산 된 다음 이러한 점수는 모든 데이터 요소에 대해 집계됩니다.
다른 메트릭도 있습니다.
여기서는 레이블 단위로 수행됩니다. 각 레이블에 대해 메트릭 (예 : 정밀도, 재 호출)이 계산 된 다음 레이블 별 메트릭이 집계됩니다. 따라서이 경우 이진 분류 (각 레이블에 이진 할당이 있음)와 마찬가지로 전체 데이터 세트에서 각 레이블의 정밀도 / 호출을 계산 한 다음 집계합니다.
쉬운 방법은 일반적인 형태를 제시하는 것입니다.
이것은 표준 멀티 클래스 동등의 확장 일뿐입니다.
당신은 멀티 포트 라벨 메트릭의 코드로 살펴 가지고 관심을 가질만한 여기를 , 어떤 패키지의 일부 mldr 에서 R . 또한 Java 다중 레이블 라이브러리 MULAN 을 살펴볼 수도 있습니다 .
이 글은 여러 가지 통계를 얻을 수있는 좋은 논문입니다 : 다중 레이블 학습 알고리즘에 대한 검토
다중 레이블 부분에 대해서는 모르지만 다중 클래스 분류의 경우 해당 링크가 도움이 될 것입니다
이 링크 는 정밀도를 계산하고 각 범주에 대해 호출하는 데 사용할 수있는 혼동 행렬을 작성하는 방법을 설명합니다
이 링크 는 분류기를 전체적으로 평가하기 위해 micro-f1 및 macro-f1 측정 값을 계산하는 방법을 설명합니다.
도움이 되셨기를 바랍니다.
이 링크가 도움이되었습니다 .. 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)
이 슬라이드는 Harvard의 cs205.org에서 확인하십시오 . 오차 측정 섹션으로 이동하면 멀티 클래스 설정 (예 : 일대일 또는 일대일) 및 혼동 행렬에서 정밀도 및 리콜에 대해 설명합니다. 혼란 매트릭스는 당신이 정말로 원하는 것입니다.
참고로, Python 소프트웨어 패키지 scikits.learn 에는 멀티 클래스 데이터에 대해 학습 된 분류기의 혼동 매트릭스와 같은 것을 자동으로 계산하는 내장 메소드가 있습니다. 정밀 리콜 플롯을 직접 계산할 수도 있습니다. 한번 볼 가치가 있습니다.
Ozgur et al (2005)에서 정규 표현식에 따라 정밀도 및 리콜을 계산해야한다는 것을 알 수 있지만 데이터 집합에서 총 N 개의 인스턴스를 평균화하는 대신 N = [ 해당 클래스가 할당 됨].
여기에 언급 된 참조가 있습니다 : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf
세트와 함께 일반적인 경우와 동일한 방식으로 :
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']))