Nerdy

ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted']. 본문

Error Correction/Python

ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

뚱인데요? 2022. 7. 1. 14:25
728x90

다중분류 모델을 만든 후 성능 평가를 하기 위해 파이썬 사이킷런 패키지를 사용했더니 에러가 떴다.

Traceback (most recent call last):
  File "C:\Users\tjoeun9\AppData\Local\Programs\Python\Python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "C:\Users\tjoeun9\PycharmProjects\pythonProject3\venv\lib\site-packages\sklearn\metrics\_classification.py", line 1270, in fbeta_score
    zero_division=zero_division,
  File "C:\Users\tjoeun9\PycharmProjects\pythonProject3\venv\lib\site-packages\sklearn\metrics\_classification.py", line 1544, in precision_recall_fscore_support
    labels = _check_set_wise_labels(y_true, y_pred, average, labels, pos_label)
  File "C:\Users\tjoeun9\PycharmProjects\pythonProject3\venv\lib\site-packages\sklearn\metrics\_classification.py", line 1367, in _check_set_wise_labels
    "choose another average setting, one of %r." % (y_type, average_options)
ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].

 

다중클래스인데 average가 binary로 되어 있으니 micro, macro, weighted 중 하나 선택해서 average 파라미터 세팅하라는 뜻인데 해결방법은 다음과 같다.

 

먼저 사이킷런에서 모델의 precision, recall, f1, f beta 값을 구하기 위해 모듈을 생성한다.

from sklearn.metrics import *

from sklearn.metrics import confusion_matrix # 혼동행렬
from sklearn.metrics import accuracy_score # 정확도
from sklearn.metrics import precision_score # 정밀도
from sklearn.metrics import recall_score # 재현율
from sklearn.metrics import f1_score # f1 스코어
from sklearn.metrics import fbeta_score # f베타 스코어

 

예측값과 실제값을 기반으로 다중 class를 만든다.

y_true1 = ["dog", "dog", "cat", "cat", "dog", "cat", "bird"] # 실제값
y_pred1 = ["cat", "dog", "cat", "cat", "dog", "bird", "bird"] # 예측값

# 다중분류 생성
confusion_matrix(y_true1, y_pred1)

# array([[1, 0, 0],
#        [1, 2, 0],
#        [0, 1, 2]], dtype=int64)

 

기본적으로 파라미터 average는 binary, 즉 이진분류로 default가 되어 있기에 파라미터 값을 따로 설정 해줘야 한다.

이진분류 모델 성능 평가 시 따로 average 파라미터 설정 안해도 된다.

 

  • micro : 각각의 TP, FN, FP, TN 값들을 모두 합친 Total TP, FN, FP, TN 값들을 이용해 계산
  • macro : 각각의 클래스에 따라 TP, FN, FP, TN 값들을 이용해서 평가지표를 계산한 후 그 값들의 평균을 사용
  • weighted : 각 클래스에 해당하는 data 개수에 가중치를 주어 평균을 구하는 것

하나만 넣는거 보다 위 3개를 한번씩 넣어보고 값들을 비교해봤다.

# 정밀도(precision)
pre_micro = precision_score(y_true1, y_pred1, average = 'micro')
pre_micro # 0.7142857142857143(정확도 값과 동일)

pre_macro = precision_score(y_true1, y_pred1, average = 'macro')
pre_macro # 0.7222222222222222

pre_weighted = precision_score(y_true1, y_pred1, average = 'weighted')
pre_weighted # 0.7857142857142857

# 재현율(recall)
recall_micro = recall_score(y_true1, y_pred1, average= 'micro')
recall_micro # 0.7142857142857143(정확도 값과 동일)

recall_macro = recall_score(y_true1, y_pred1, average= 'macro')
recall_macro # 0.7777777777777777

recall_weighted = recall_score(y_true1, y_pred1, average = 'weighted')
recall_weighted # 0.7142857142857143

# F1 score
f1_micro = f1_score(y_true1, y_pred1, average= 'micro')
f1_micro # 0.7142857142857143(정확도 값과 동일)

f1_macro = f1_score(y_true1, y_pred1, average= 'macro')
f1_macro # 0.7111111111111111

f1_weighted = f1_score(y_true1, y_pred1, average = 'weighted')
f1_weighted # 0.7238095238095238

# Fbeta score (beta = 2)
fbeta_micro = fbeta_score(y_true1, y_pred1, beta = 2, average= 'micro')
fbeta_micro # 0.7142857142857143(정확도 값과 동일)

fbeta_macro = fbeta_score(y_true1, y_pred1, beta = 2, average= 'macro')
fbeta_macro # 0.7380952380952381

fbeta_weighted = fbeta_score(y_true1, y_pred1, beta = 2, average = 'weighted')
fbeta_weighted # 0.7108843537414966

 

각각의 파라미터 변수들의 값들을 표로 정리하면 다음과 같다.

여기서 재밌는건 정확도 값이 정밀도, 재현율, F1, F beta의 micro 값과 동일하다는 점이다.


정확도(accuracy)

- 0.7142857142857143
정밀도(precision)
micro

0.7142857142857143 (정확도 값과 동일)

macro

0.7222222222222222

weighted

0.7857142857142857
재현율(recall)
micro

0.7142857142857143 (정확도 값과 동일)

macro

0.7777777777777777

weighted

0.7142857142857143
F1 score
micro

0.7142857142857143 (정확도 값과 동일)

macro

0.7111111111111111

weighted

0.7238095238095238
F beta score
(beta = 2)

micro

0.7142857142857143 (정확도 값과 동일)

macro

0.7380952380952381

weighted

0.7108843537414966

 

728x90