평가 지표·연습 문제

Multi-output R² (sklearn multioutput) [medium]

문제 설명PROBLEM

preview

Multi-output R² [medium]

v1 R² 은 스칼라 타깃. 실제로는 여러 출력 을 동시에 예측하는 경우가 흔함 (multi-target regression, 이미지 회귀, 좌표 예측 등).

각 출력 kk 에 대해 개별 R²:

Rk2=1i(yi,ky^i,k)2i(yi,kyˉk)2R^2_k = 1 - \frac{\sum_i (y_{i,k} - \hat{y}_{i,k})^2}{\sum_i (y_{i,k} - \bar{y}_k)^2}

문제: K 개의 R² 를 어떻게 집계할 것인가? sklearn 의 multioutput 파라미터 3 가지 모드:

mode집계 방식
'raw_values'각 출력별 R² 벡터 그대로 반환 (shape (K,))
'uniform_average'단순 평균 1KkRk2\frac{1}{K}\sum_k R^2_k (기본)
'variance_weighted'분산 가중 평균 kSSTkRk2kSSTk\frac{\sum_k SST_k \cdot R^2_k}{\sum_k SST_k}

variance_weighted 는 분산이 큰 (즉, 예측 난이도가 큰) 출력에 더 가중치.

과제

함수 r2_score_multi(y_pred, y_true, multioutput='uniform_average') 를 완성하세요.

  • y_pred, y_true: shape (N, K).
  • multioutput: 'raw_values' | 'uniform_average' | 'variance_weighted'.
  • 반환:
    • 'raw_values' → shape (K,) numpy array,
    • 아니면 Python float.
  • SSTk=0SST_k = 0 인 출력은 해당 Rk2=0R^2_k = 0 으로 처리 (분모 0 방어).

수식 팁

SSR_k = sum_i (y_pred[i,k] - y_true[i,k])^2   # shape (K,)
SST_k = sum_i (y_true[i,k] - y_true[:,k].mean())^2
R2_k  = 1 - SSR_k / SST_k   # SST_k==0 → 0

테스트 케이스

#이름검증
1raw_values shape (K,)
2uniform_average = mean(raw)
3variance_weighted = Σ(SST·R²) / ΣSST
4완벽 예측 → 모두 1.0
5상수 출력 (SST=0) → 0 처리, NaN 없음
6K=1 → v1 R² 와 일치
7sklearn r2_score(multioutput=...) 와 일치
개념 노트와 실수 포인트

평가 지표

  • ⚠️ 정확도는 클래스 불균형에 약함(99% 음성이면 다 음성 찍어도 99%).
  • 정밀도(예측한 양성 중 진짜) vs 재현율(실제 양성 중 잡은 것) 트레이드오프, F1=조화평균.