projects

평가 정직성 축 — 교과서 + history 통합 노트

평가 정직성 축 — 교과서 + history 통합 노트

evaluation-honesty-flow의 4개 질문을 교과서 개념 + 우리가 밟은 절차의 history로 확장한 노트.


Q1. 기존 평가법들은 어떤 반칙을 하는가 — 문제의 해부

교과서: 애초에 왜 나누는가

알고 싶은 것은 train 점수가 아니라 "본 적 없는 데이터에서 몇 점일 것인가"(일반화). train 점수는 체계적으로 낙관적 — 모델은 noise까지 외울 수 있다. 기본 장치가 holdout인데, 여기엔 거의 명시되지 않는 전제가 있다: "숨겨둔 데이터가 미래에 만날 데이터와 같은 성질" — 표준 도구들은 이를 i.i.d. 가정으로 보장한다. 그런데 우리는 ② 축에서 행들이 독립이 아님을 이미 증명했다(ρ̄ ≈ 0.86). 그 순간 표준 도구들이 반칙을 시작한다.

반칙 1: random split — 과제가 바뀐다

test의 2015년 3월 행 양옆(2월·4월)이 train에 들어간다. 측정되는 것은 예측(forecasting)이 아니라 보간(interpolation) — 더 쉬운 다른 시험의 점수.

반칙 2: k-fold — 같은 반칙 k번 + 허위 안정성

k-fold의 미덕(전 데이터가 시험지 + 점수의 평균·분산)은 전부 i.i.d. 위에서만 성립. 시간 구조에선 모든 fold의 train이 그 fold의 미래를 포함 — 반칙 1이 k번. 더 나쁜 점: k개 점수가 전부 같은 방식으로 부풀어 서로 비슷 → 틀린 답을 자신 있게 말하는 상태.

반칙 3(한계): 단일 cutoff — 정직하나 표본 1

시간으로 자르면 방향은 정직. 그러나 시험 1회 — 점수가 실력인지 그 해의 운인지 구분할 표본이 없다.

history: 해부 = 요구 명세

시간 방향 유지(반칙 1·2 차단) + 반복 시험(반칙 3 극복) + 최종 점수 격리. → 원칙 수립: "split의 가정 = 그 Stage의 가정".

예상 질문: "부풀었는지 어떻게 미리 아나?" → 사후엔 CV-Test 격차로 드러나지만 본질은 사전 추론 — split의 가정(i.i.d.)과 데이터의 실측(ρ̄ 0.86)이 모순이면 측정 전에 판정 가능.


Q2. Stage 1의 random split은 왜 모순이 아닌가

교과서: 누수 = 기회 × 수단

random split의 누수 메커니즘: test 이웃이 train에 있고(기회), 모델이 그걸 활용한다(수단). 활용하려면 모델이 시간을 알아야 한다. Stage 1 입력 = store 9 + item 49열뿐 — 어떤 행이 어느 시점인지 알 길이 없고, 같은 (store,item)의 모든 행에 같은 예측(그룹 평균). 수단이 0이므로 곱이 0 — 반칙이 구조적으로 불가능.

random이 오히려 필수인 이유

Stage 1의 가설 = "이론 천장 0.7949에 수렴하는가". 이 비교에는 train/test 분포 동일성이 전제다. cutoff였다면 성장 추세 때문에 2017 test 평균이 체계적으로 높아 — 가설과 무관한 이유로 — R²가 천장보다 낮게 나와 가설 검증이 오염된다. "split의 가정 = Stage의 가정" 원칙이 Stage 1에선 random을 지시한다.

분포 동일성은 검정하고 쓴다 — KS

Two-sample Kolmogorov-Smirnov: 두 표본의 ECDF 최대 수직 거리

D=maxxFtrain(x)Ftest(x)D = \max_x |F_{train}(x) - F_{test}(x)|

H0H_0 = 같은 분포. 분포의 모양 전체를 비교(평균만 보는 t-test보다 포괄적), 비모수라 skew 데이터에 안전.

실측: store p=.33 / item p=.16 / sales p=.995 — 셋 다 기각 실패. n=26K로 검정력이 충분한 조건에서의 기각 실패라 의미가 강하다.

예상 질문:

  • "item p=.16은 낮지 않나?" → 0.05를 훨씬 넘어 기각 근거 없음. p의 크기를 일치의 강도로 읽는 건 p≈0을 효과 크기로 읽는 것과 같은 오독(① 축 교훈의 재적용).
  • "기각 실패 = 같은 분포의 증명?" → 엄밀히는 "다르다는 증거를 찾지 못함". 다만 대표본 조건의 기각 실패라 실용적으로 충분히 강한 보증.

Q3. 반복 평가는 어떻게 정직하게 — TimeSeriesSplit

교과서: 탐색은 다중비교다

Stage 3 = 후보 비교·선택. 여러 후보를 한 시험지로 비교하면 "그 시험지에 우연히 맞는" 후보가 반드시 나온다 — validation set 과적합 (① 축 다중비교 문제의 평가판). 처방: 시험을 여러 번 봐서 평균 — 단, 시간 방향을 지키며. = forward chaining / rolling-origin evaluation / TimeSeriesSplit.

메커니즘: 매 fold가 작은 예측 시뮬레이션

train = 과거 누적(expanding), val = 직후 블록. train 13K→26K→39K→52K→65K, val 13K×5. 모든 fold에서 val이 train의 미래 — 방향 위반이 구조적으로 불가능(shift와 같은 철학). k-fold와의 차이: fold마다 train 크기가 다르고 점수들이 "조건이 다른 시험들" — 단점 같지만 진단 도구가 된다(아래 수확 2).

expanding vs rolling

rolling(고정 창)은 오래된 패턴이 무효화되는 데이터(금융 등)용. 우리 근거는 ② 축 측정: ADF 96.2% 정상(규칙 시간 불변) + lag_52가 1년 전 참조 → 과거를 버리면 연간 주기 학습 손상 → expanding.

실측: 두 가지 수확

  1. 평가 기반 신뢰: CV-Test Δ — RF +0.003 / SVR +0.007 / HGB +0.003. CV의 서열·수준이 Test에서 재현. 누수가 있었다면 CV가 부풀어 격차가 벌어졌을 것 — 누수 부재의 간접 증거(② Q3 복선 회수).
  2. 보너스 발견: Linear만 fold std 0.060. fold들은 1년 미만 구간(시즌 치우침) — Linear가 시즌 구성에 민감하다는 체질 발견. 단일 cutoff였다면 몰랐을 정보. → Stacking meta 계수(Linear +0.06)의 복선.

예상 질문:

  • "왜 5 fold?" → 관행 범위(5~10)에서 val 13K(6개월×500시계열)의 통계적 충분성과 초기 train(13K)의 학습 가능성의 균형점.
  • "CV가 Test보다 낮은 건 문제?" → fold train이 더 작고 val 구간이 시즌 치우침 — 더 어려운 시험. 중요한 건 서열 보존이고, 확인됐다.

Q4. 최종 점수의 순결성 — 금고의 원칙

교과서: 3분할의 역할 분담

train = 학습, validation = 선택, test = 최종 추정. test 점수가 불편 추정량이려면 모델이 test와 독립적으로 만들어졌어야 한다. test를 보고 무언가를 고르는 순간 독립이 깨지고 test는 이름만 test인 두 번째 validation이 된다.

깨지는 메커니즘 = winner's curse: 후보 50개를 test로 채점해 1등을 고르면 그 점수는 실력 + 그 시험지에 맞은 운의 합 — 실전 성능을 체계적으로 과대평가. Kaggle이 public/private leaderboard를 나누는 이유.

원칙의 정확한 문장

"보는 횟수 제한"이 아니라 "선택의 근거로 쓰지 않음". 우리 프로토콜의 test 개봉 기록:

시점사용성격
Stage 2고정 설정 4모델 채점측정 (점수 보고 되돌아간 루프 없음)
Stage 3 탐색0회튜닝·앙상블 비교 전부 CV에서
최종1회 개봉Tuned HGB 확정

선택이 개입한 구간에서 test 사용 0회 — 이것이 순결성의 실체.

실측: 개봉의 결과와 사슬의 폐쇄

R² 0.9858 · SMAPE 5.20% · MAE 18.88 — 어떤 의사결정에도 쓰인 적 없는, 실전 재현 가능 성능의 정직한 추정. 그리고 CV가 예측한 HGB 성능과의 격차 +0.003 — CV의 약속을 Test가 지켰다. 평가 체계 전체의 자기 일관성이 점수의 높이보다 강한 메시지.

Test 구성: 2017년 전체 52주·26,000행 — 전 시즌 포함이라 특정 시즌의 운에 덜 좌우(단일 cutoff 약점의 보완 장치).

예상 질문:

  • "한 번 본 점수도 운일 수 있지 않나?" → 26K행·52주 위의 점수라 추정 분산 자체가 작고, 독립적으로 만들어진 CV 예측과 0.003 차 일치가 교차 보증.
  • "SMAPE 5.20% 읽는 법?" → 평균적으로 실제의 약 ±5% 안 — R²(분산 설명)와 달리 운영의 언어. 두 지표가 청중이 다른 같은 이야기를 한다.

한 줄 사슬 요약

평가 도구에도 가정이 있다(Q1: random·k-fold는 i.i.d. 위의 도구) → Stage 1은 수단이 없어 random이 무해하고 천장 비교엔 오히려 필수, KS로 검정 후 사용(Q2) → 탐색은 TimeSeriesSplit expanding 5-fold에서, CV-Test Δ≤0.007 신뢰 + Linear 민감성 발견(Q3) → test는 선택 종료 후 1회 개봉 0.9858, CV 약속과 +0.003 정합으로 사슬 폐쇄(Q4).