Train/Validation/Test Split — 시계열에서의 데이터 분할
## 세 구간의 역할
| 구간 | 비율 | 역할 |
|------|------|------|
| train | 80% | 모델이 패턴을 학습하는 구간 |
| validation | 10% | 모델 간 성능 비교, 하이퍼파라미터 튜닝 |
| test | 10% | 최종 성능 평가 — 모델 선택 후 딱 한 번만 사용 |
validation을 따로 두는 이유: test로 모델을 고르면 test 성능에 맞춰 선택이 오염된다. 선택은 val로, 최종 평가는 test로 분리해야 진짜 미래 성능을 추정할 수 있다.
## iloc의 원리
`iloc`은 행 번호(위치)로 DataFrame을 잘라내는 방법이다. 507행이면 0번부터 506번까지 번호가 붙어있고, `iloc[시작:끝]`으로 범위를 잘라낸다. 끝 번호는 포함되지 않는다.
```
전체 507행
[0 ........... 404 | 405 ... 455 | 456 ... 506]
train validation test
80% 10% 10%
```
## 왜 random split이 아닌가
시계열은 시간 순서가 의미를 가진다. 무작위로 섞어서 자르면 미래 데이터로 과거를 예측하는 상황이 발생한다. iloc으로 앞에서부터 순서대로 자르는 것이 시계열의 규칙이다.
## 구현
```python
n = len(weekly)
train_end = int(n * 0.8)
val_end = int(n * 0.9)
train = weekly.iloc[:train_end]
val = weekly.iloc[train_end:val_end]
test = weekly.iloc[val_end:]
features = ['lag_1W', 'lag_2W', 'lag_4W', 'lag_52W',
'rolling_4W', 'rolling_12W',
'month', 'quarter', 'week_of_year']
X_train, y_train = train[features], train['weekly_qty']
X_val, y_val = val[features], val['weekly_qty']
X_test, y_test = test[features], test['weekly_qty']
```