서브셋 정확도는 실제로 가혹한 메트릭입니다. 0.29가 얼마나 좋은지 나쁜지를 알기 위해서는 다음과 같은 아이디어가 필요합니다.
- 각 샘플에 대해 평균적으로 몇 개의 레이블이 있는지 확인
- 사용 가능한 경우 어노 테이터 간 계약을 검토하십시오 (그렇지 않은 경우 분류 자일 때 획득 한 서브 세트 정확도를 확인하십시오)
- 주제가 잘 정의되어 있는지 생각
- 각 라벨에 몇 개의 샘플이 있는지 살펴보십시오
해밍 점수를 계산하여 분류자가 실마리가 없는지 또는 그 대신 괜찮은지 확인하지만 모든 레이블을 올바르게 예측하는 데 문제가있을 수 있습니다. 해밍 점수를 계산하려면 아래를 참조하십시오.
동시에, 내가 이해 한 것으로부터 OneVsRestClassifier와 함께 scikit.metrics를 사용할 수 없으므로 어떤 메트릭 (F1, Precision, Recall 등)을 가져 와서 무엇이 잘못되었는지 알아낼 수 있습니까?
멀티 클래스 멀티 라벨 분류에 대한 정밀도 / 호출을 계산하는 방법을 참조하십시오 . . sklearn이 지원하는지 여부를 잊어 버렸습니다. sklearn은 혼란 매트릭스에 대해 다중 레이블을 지원하지 않습니다 . 이 숫자를 실제로 보는 것이 좋습니다.
해밍 점수 :
A의 다중 레벨 분류 설정 sklearn.metrics.accuracy_score
만을 계산 부분 집합의 정확성 즉, 정확히 y_true에서 라벨의 해당 설정과 일치해야합니다 샘플에 대한 예측 라벨 세트 (3).
정확도를 계산하는이 방법은 언젠가는 정확히 일치 비율 (1)로 불 립니다 .
정확도를 계산하는 또 다른 일반적인 방법은 (1) 및 (2)에 정의되어 있으며 해밍 점수 라고 불명확하게 나타납니다. (4) (해밍 손실과 밀접하게 관련되어 있기 때문에) 또는 레이블 기반 정확도 . 다음과 같이 계산됩니다.
다음은 해밍 점수를 계산하는 파이썬 방법입니다.
# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required
import numpy as np
y_true = np.array([[0,1,0],
[0,1,1],
[1,0,1],
[0,0,1]])
y_pred = np.array([[0,1,1],
[0,1,1],
[0,1,0],
[0,0,0]])
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
/programming//q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('\nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/\
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list)
if __name__ == "__main__":
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)
# For comparison sake:
import sklearn.metrics
# Subset accuracy
# 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))
# Hamming loss (smaller is better)
# $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
# where
# - \\(|D|\\) is the number of samples
# - \\(|L|\\) is the number of labels
# - \\(y_i\\) is the ground truth
# - \\(x_i\\) is the prediction.
# 0.416666666667 (= (1+0+3+1) / (3*4) )
print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred)))
출력 :
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1) Sorower, Mohammad S. " 멀티 라벨 학습 알고리즘에 관한 문헌 조사. "Oregon State University, Corvallis (2010).
(2) Tsoumakas, Grigorios 및 Ioannis Katakis. " 다중 레이블 분류 : 개요. "그리스 테살로니키 아리스토텔레스 대학교 정보학과 (2006).
(3) Ghamrawi, Nadia 및 Andrew McCallum. " 집단적 다중 레이블 분류. "정보 및 지식 관리에 관한 제 14 차 ACM 국제 회의의 절차. ACM, 2005.
(4) Godbole, Shantanu 및 Sunita Sarawagi. " 다중 레이블 분류를위한 판별 방법. "지식 발견 및 데이터 마이닝의 발전. Springer Berlin Heidelberg, 2004. 22-30.