250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 오픈API
- 인코등
- 막대그래프
- covid19
- 라이엇
- 시각화
- riotapi
- kepler.gl
- 라이엇api
- 지도
- Folium
- QGIS라벨링
- map
- pipwin
- 파이썬
- 코로나
- geopandas에러
- OSMnx
- matplotlib
- 공공데이터포털
- 마커클러스터
- Python
- 오류
- covid
- API
- geopnadas
- 에러
- r
- kepler
- geopandas설치
Archives
- Today
- Total
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:25728x90
다중분류 모델을 만든 후 성능 평가를 하기 위해 파이썬 사이킷런 패키지를 사용했더니 에러가 떴다.
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
'Error Correction > Python' 카테고리의 다른 글
most likely due to a circular import 오류 해결방법 (0) | 2022.12.09 |
---|---|
Matplotlib 한글 깨짐 현상 해결방법 (0) | 2022.06.21 |