16.1 기준 모델의 철학

실습 · 연습문제 2개

새 모델은 baseline을 이기는가: 짝지은 부트스트랩 판정 beats-baseline

같은 시험 단위(셀·환자·지역 등) nn개에서 새 모델과 baseline의 오차를 쟀다. err_model[i]와 err_base[i]는 **같은 단위 ii**의 오차이고, 값이 작을수록 좋다. 함수 paired_verdict(err_model, err_base, n_boot=2000, seed=0)를 완성해 다음 키를 가진 dict를 반환한다.

키 값
"skill" skill score 1−e‾model/e‾base1 - \overline{e}_{\text{model}} / \overline{e}_{\text{base}} (평균 오차의 비)
"diff" 짝지은 차이 di=emodel,i−ebase,id_i = e_{\text{model},i} - e_{\text{base},i}의 평균
"ci" dˉ\bar d의 95% 퍼센타일 부트스트랩 신뢰구간 (lo, hi)
"verdict" hi < 0이면 "이긴다", lo > 0이면 "진다", 그 밖에는 "판정 불가"

부트스트랩은 단위를 복원추출하고, 뽑힌 단위의 두 오차를 함께 쓴다. 즉 차이 did_i를 복원추출해 평균을 n_boot번 계산하고, 그 2.5%·97.5% 분위수를 구간으로 쓴다. 난수는 np.random.default_rng(seed)로 만든다.

두 모델의 오차를 따로 복원추출하면 짝이 깨진다. 어려운 단위에서 두 모델이 함께 나빠지는 공통 변동이 상쇄되지 않아 구간이 불필요하게 넓어진다(12.5장의 짝지은 비교). 테스트 중 하나는 이 차이를 확인한다.

시계열의 단순 baseline 네 개 forecast-baselines

길이 TT인 학습 시계열 y1,…,yTy_1, \dots, y_T를 보고 다음 HH개 시점 yT+1,…,yT+Hy_{T+1}, \dots, y_{T+H}를 예측하는 단순 baseline 네 개를 구현한다. 함수 forecast_baselines(y, horizon, period)는 키 네 개를 가진 dict를 반환하고, 각 값은 shape (horizon,)의 NumPy 배열이다.

키 예측 y^T+h\hat y_{T+h} (h=1,…,Hh = 1, \dots, H) 무엇을 재는가
"mean" yˉ=1T∑t=1Tyt\bar y = \frac{1}{T}\sum_{t=1}^T y_t 시간 구조를 전혀 쓰지 않을 때
"persistence" yTy_T 마지막 값만 쓸 때
"seasonal" yT−p+((h−1) mod p)+1y_{T - p + ((h - 1) \bmod p) + 1} 한 주기 전 같은 위상의 값 (pp = period)
"drift" yT+h yT−y1T−1y_T + h\,\dfrac{y_T - y_1}{T - 1} 첫 값과 마지막 값을 잇는 직선의 기울기로 연장

seasonal은 마지막 한 주기 yT−p+1,…,yTy_{T-p+1}, \dots, y_T를 예측 기간 동안 반복한 것이다. 예를 들어 p=3p = 3이고 마지막 세 값이 [5, 6, 7]이면 horizon = 5의 예측은 [5, 6, 7, 5, 6]이다.

입력 y는 리스트일 수도 있다. period는 len(y) 이하라고 가정한다.

테스트는 손으로 계산한 예, 출력 shape, 그리고 주기 신호에서는 seasonal이, 직선 추세에서는 drift가 가장 정확한지 확인한다.