본문 바로가기

Machine Learning Models/Classic

Classification - Metrics (2)

반응형

Classification - Metrics (1)


지난 포스트에서 다룬 다양한 분류 성능 지표는 파이썬의 sklearn.metrics 모듈에 대부분 구현되어 있습니다. 이번 포스트에서는 성능 지표를 위한 구체적인 이용 방법을 소개해 드리도록 하겠습니다.

sklearn.metics.f1_score(y_true, y_pred, labels=None, average='binary')

sklearn.metrics 모듈의 f1_score 함수로 f1-score를 얻을 수 있으며 이진 분류/다중 분류 모두에 적용됩니다. 

"y_true/y_pred" 는 실제클래스/예측클래스 를 나타내는 numpy 행렬이며 "average" 파라미터는 multi-class 상에서 각 클래스의 f1-score를 어떻게 평균낼지를 결정하는 것으로 다음과 같은 선택지가 있습니다. Multi-class 상에서의 f1-score 계산은 기본적으로 One-Vs-All 방법으로 이루어져 해당 클래스를 positive, 나머지 클래스를 negative 라 간주하여 계산합니다.

average Description
micro 전체 클래스에 계산합니다. 각 클래스에 대한 TP/FP/FN 을 합한 뒤에 f1-score를 계산합니다.
macro 각 클래스에 대한 f1-score를 계산한 뒤 단순한 산술 평균을 내어 f1-score를 계산합니다.
weighted 각 클래스에 대한 f1-score를 계산한 뒤 각 클래스 별 데이터 비율에 따른 가중 평균을 내어
f1-score를 계산합니다.
None 총합한 f1-score가 아닌 각 클래스별 f1-score를 리턴합니다.

Multi-class 인데 average 파라미터를 지정하지 않으면 디폴트값이 binary로 지정되어 있어 에러가 발생합니다.

labels 파라미터에 [보기를 원하는 라벨] 형태로 대입할 경우 해당 라벨에 대해서 계산된 f1-score를 볼 수 있습니다.

from sklearn.metrics import f1_score
y_true = [0,1,2,0,1,2]
y_pred = [0,2,1,0,0,1]

print(f1_score(y_true, y_pred, average='micro'))
print(f1_score(y_true, y_pred, average='weighted'))
print(f1_score(y_true, y_pred, average='macro'))
print(f1_score(y_true, y_pred, average=None))
print('\n')
print(f1_score(y_true, y_pred, average='micro', labels=[0]))

 

sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', multi_class='raise')

sklearn.metrics 모듈의 roc_auc_score 함수로 auc를 계산할 수 있습니다. 이 함수도 이진 분류/다중 분류에 동시에 적용될 수 있으며 average 파라미터는 디폴트로 macro 로 설정되어 있으며 기능은 f1_score의 경우와 같습니다. 주의할 점은 다중 분류의 경우 'macro'/'weighted' 만 적용됩니다.

y_true/y_score 파라미터에는 이진 분류의 경우는 (n_samples,)의 1차원 배열이 다중 분류의 경우 (n_samples, n_classes) 의 이차원 배열이 함수에 들어가게 됩니다. 이진 분류의 경우에는 라벨이 1 (positive)일 확률이 y_score 파라미터에 들어가게 되며 다중 분류의 경우에는 각 클래스 별 확률값이 들어가게 됩니다. 이때 주의할 점은 각 샘플 별 확률의 합이 1이 되어야 하며 1이 되지 않는 경우에는 에러가 발생합니다.

multi_class 파라미터에는 디폴트가 'raise' 로 되어 있어 다중 분류의 경우 'ovr', 'ovo' 중 하나로 따로 지정하지 않으면 에러가 발생합니다. 'ovr'은 One-Vs-Rest, 'ovo'는 One-Vs-One 으로 일반적으로 'ovr'을 사용합니다.

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.metrics import roc_auc_score

X, y = load_iris(return_X_y=True)
clf = LogisticRegression(solver='liblinear').fit(X, y)
roc_auc_score(y, clf.predict_proba(X), multi_class='ovr', average='macro')

참고로 붓꽃 데이터는 3개의 클래스 별 데이터 수가 같기 때문에 average에 상관없이 값이 같습니다.

 

sklearn.metrics.classification_report(y_true, y_pred, labels=None, output_dict=False)

sklearn.metrics 의 classification_report 함수를 통해 전체/각 클래스 별 precision/recall/f1-score 를 쉽게 확인할 수 있습니다. output_dict 파라미터를 True로 설정하면 딕셔너리 형태로 출력되어 원하는 값을 쉽게 얻을 수 있습니다. 또한 target_names 파라미터에 클래스 이름을 할당할 수 있습니다.

from sklearn.metrics import classification_report

classification_report(y, clf.predict(X), output_dict=True, target_names=['class1', 'class2', 'class3'])

각 클래스 별로 precision/recall/f1-score 를 볼 수 있으며 micro/macro/weighted average 까지 한 눈에 파악할 수 있습니다. support는 각 클래스 별 데이터 개수를 의미하며, labels 파라미터에 [보고 싶은 라벨] 형태로 할당하면 해당 라벨만에 대한 결과를 얻을 수 있습니다.

 

참조

반응형

'Machine Learning Models > Classic' 카테고리의 다른 글

Dimension Reduction - t-SNE (1)  (0) 2021.04.20
Dimension Reduction - PCA  (0) 2021.04.20
Classification - Metrics (1)  (0) 2021.04.19
Feature Selection - XGBoost  (0) 2021.04.17
Feature Selection - Random Forest (2)  (0) 2021.04.16