메트릭과 스코어링

메트릭과 스코어링 (Metrics and scoring)

모델을 만들었다면 "얼마나 잘 예측하는지"를 정량적으로 표현해야 해요. scikit-learn은 분류·회귀·클러스터링 다양한 상황을 위한 수많은 평가 메트릭 을 제공해요. 그러나 무엇보다 먼저 정해야 할 것은 자신의 문제에 맞는 스코어링 함수 를 고르는 일이에요.

출처: scikit-learn 공식 문서 — Metrics and scoring: quantifying the quality of predictions

어떤 스코어링 함수를 써야 할까

대회나 업무 맥락에서 스코어링 함수가 이미 정해져 있다면 그걸 쓰는 게 우선이에요. 직접 고를 수 있다면 예측의 궁극적인 목적과 활용처를 먼저 고려해야 해요. 두 단계로 나눠 보면 이해하기 쉬워요.

  • 예측(Predicting): 보통 반응 변수 Y는 결정적 함수가 아니라 확률 분포를 따르는 확률 변수예요. Y의 분포 전체를 예측하는 확률적 예측도 있지만, scikit-learn은 주로 평균·중앙값·분위수 같은 분포의 특성(기능)을 골라 점 예측(point prediction) 을 내는 쪽에 초점을 맞춰요.
  • 의사결정(Decision making): 이진 분류가 대표적이에요. predict_proba 의 결과를 단일 결과로 바꿔 결정을 내리죠. 분류기에서 이게 바로 predict 가 돌려주는 값이에요.

점 예측 대상이 정해지면 그에 맞는 엄밀 일관(strictly consistent) 한 스코어링 함수를 쓰는 게 권장돼요. 엄밀 일관 스코어링 함수는 "진실을 말하는 것이 기대값상 최적 전략"이 되도록 보장해서, 학습의 손실 함수와 평가의 메트릭으로 동시에 쓰기에 좋아요.

세 가지 스코어링 API

모델 예측 품질을 평가하는 API는 크게 세 가지가 있어요.

  • Estimator score 메서드: estimator는 자신이 풀려는 문제의 기본 평가 기준을 제공하는 score 메서드를 가져요. 분류기는 정확도(accuracy), 회귀기는 결정계수(R²)가 가장 흔해요.
  • Scoring 파라미터: 교차 검증·그리드 서치 도구(예: cross_val_score, GridSearchCV)는 scoring 파라미터로 원하는 메트릭을 지정해요.
  • Metric 함수: sklearn.metrics 에 정규화된 함수들이 있어서 명시적으로 스코어를 계산해요.

Jaccard 유사도

라벨 집합과 예측 라벨 집합 사이의 Jaccard 유사계수 는 두 집합의 교집합 크기를 합집합 크기로 나눈 값이에요.

J(y, ŷ) = |y ∩ ŷ| / |y ∪ ŷ|
>>> import numpy as np
>>> from sklearn.metrics import jaccard_score
>>> y_true = np.array([[0, 1, 1],
...                    [1, 1, 0]])
>>> y_pred = np.array([[1, 1, 1],
...                    [1, 0, 0]])
>>> jaccard_score(y_true[0], y_pred[0])
0.6666

average 인자로 멀티라벨·멀티클래스로 확장할 수 있어요. average='micro', 'macro', 'samples' 또는 None(각 라벨별)을 쓸 수 있어요.

Hinge loss

hinge_loss 함수는 모델과 데이터 사이의 평균 거리를 계산하는데, 한쪽 손실(one-sided) 메트릭이라 예측 오류만 고려해요. 서포트 벡터 머신 같은 최대 마진 분류기에서 쓰여요. 이진 분류의 참 라벨 y_i 는 보통 {-1, +1} 로 인코딩돼요.

더 알아보기