research

Train/Validation/Test Split — 시계열에서의 데이터 분할

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']
```