매직코드
article thumbnail

다중 분류 모델을 만들었는데 성능 평가를 하려고 하니 에러가 떴다.

 

✅   f1_score

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

 

찾아보니 f1, recall, roc_auc 같은 경우에는 이진분류이 경우에 사용할 수 있다고 한다.

다중 분류 모델에서는 average라는 파라미터값을 설정해주면 사용할 수 있다.

 

 

 

 

# 에러
f1 = round(f1_score(y_test, y_pred), ndigits=3)

# 수정
f1 = round(f1_score(y_test, y_pred, average='micro'), ndigits=3)

 

실제로 에러 문장에서도 average 값이 binary로 설정되어 있으니, micro, macro, weighted 중에서 하나를 선택해주라고 나온다.

이럴때는 각 패키지와 파라미터를 잘 설명하고 있는 패키지 홈페이지에 들어가서 확인하는게 제일 좋다.

아래는 사이킷런 홈페이지에서 f1_score의 파라미터를 설명해둔 페이지에서 가져온 average에 대한 설명이다.

 

출처 : https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html

 

binary :

기본값으로 설정되어있고, 오직 이진 분류에서만 사용된다.

 

micro :

총 true positive, false negative, false positive를 이용해 스코어를 계산한다.

 

macro :

각 레이블의 매트릭스를 계산하고 각 레이블의 가중이 되지 않는 평균(unweighted mean)을 찾는다.

레이블 불균형을 고려하지 않는다.

 

weighted :

각 레이블의 매트릭스를 계산하고, 각 레이블에 대한 실제 인스턴스의 수 별로 가중된 가중 평균을 찾는다.

(레이블 불균형이 있더라도 가중치를 주어 평균을 계산한다는 의미인 것 같다.)

precision과 recall 사이에 있지 않은 F-score를 초래할 수 있다.

 

samples :

각 인스턴스에 대한 매트릭스를 계산하고, 평균을 찾는다.

(오직 accuracy_score와 다른 다중 분류에서만 의미가 있다.)

 

 

 

✅   recall_score

f1을 변경하고 실행하니 리콜에서도 동일한 에러가 떴다.

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

 

그래서 동일하게 average='micro'를 추가해주었다.

# 에러
recall = round(recall_score(y_test, y_pred), ndigits=3)

# 수정
recall = round(recall_score(y_test, y_pred, average='micro'), ndigits=3)

 

 

✅   roc_auc_score

잘 넘어가나 싶었는데 이번에는 roc_auc에서 에러가 발생했다.

multi_class must be in ('ovo', 'ovr') 에러

 

다중 분류인 경우에서만 나타나는 에러로, 사용할 구성 유형을 결정해야한다.

이번에도 사이킷런 사이트에서 찾아봤다.

 

ovo :

One-vs-one(일대일)을 의미하며 가능한 모든 클래스 쌍 조합의 평균 auc를 계산한다.

average='macro'로 설정했을 때 클래스 불균형에 민감하지 않다.

 

ovr :

One-vs-rest(일대나머지)를 의미하며 나머지에 대한 각 클래스 auc를 계산한다.

클래스 불균형이 '나머지'에 영향을 미치기 때문에 average='macro'로 설정해도 클래스 불균형에 민감하다.

 

나는 어떤게 맞는지 잘 몰라서 둘 다 적용해봤다.

# 에러
auc = round(roc_auc_score(y_test, y_pred), ndigits=3)

# 수정
auc = round(roc_auc_score(y_test, y_pred, multi_class='ovo'), ndigits=3)

 

그런데 또 다른 에러가 나서 그냥 auc는 구하지 않기로 했다...

 

 

✅   결과

그래도 다중 분류 모델 성능 평가에서 f1과 recall을 해결한 덕분에 위와 같은 성능평가를 진행할 수 있었다.

 

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!