Source:
report/version9/lab-leader/v9-06_baseline_extension_2.md
v9-06 Baseline Extension 2 — NF MLP 계열 + TSLib 4종 확장¶
0. 범위 고지¶
본 설계는 v9-05 (NF Transformer 3종 FAIL) extension 이다. v9-05 결과 (H9-5a FAIL, PAPE 52–53, HR@1 15–27) 분석에서 decomposition + attention 계열의 peak smoothing 가설이 도출됐고, 본 phase 는 (a) N-HiTS 계열 MLP 구조 (NBEATSx/TSMixer/TiDE) 와 (b) TSLib hierarchical/attention variant 4종 을 동일 프로토콜로 평가해 VQ-친화 backbone 후보를 재탐색한다. 사용자가 확정한 Track A/B 모델·가설·gating·P1 강제사항을 준수하며, 추가 ablation/확장은 설계하지 않는다.
1. 목적 및 가설¶
1.1 배경¶
v9-05 는 Autoformer/Informer/FEDformer 3종이 PAPE 52.04–53.40, HR@1 15.33–27.05 로 (PAPE ≤ 43 AND HR@1 ≥ 37) gating 을 전수 FAIL 했다. v9-05 reporter §4 "주요 관찰" 에서 확인된 패턴:
- N-HiTS (v6, PAPE 39.26, HR@1 22.29) 와 v9-05 신규 3종 간 PAPE 격차 13%p — hierarchical interpolation + multi-rate sampling 구조가 peak 축에 우위.
- Decomposition (Autoformer MovingAvg=25) + attention (Informer ProbSparse, FEDformer Fourier top-k) 공통점 → peak 좌표를 low-pass / sparse 표현으로 smoothing 하는 구조적 한계 가설 (revision 1 에서 "가설, ablation 미수행" 으로 한정).
v9-05 reporter §8.1 은 TSLib 2차 착수 판단 자료로 "Track B 4종 중 기계학습적으로 1차 3종과 강하게 차별되는 카테고리는 SCINet (non-attention hierarchical) 정도" 라고 명시. 본 phase 는 이 관찰을 검증하기 위해 (Track A) N-HiTS 친척인 MLP 계열 3종 + (Track B) TSLib 4종 을 함께 평가한다.
v9-05 reporter §8.3 P1 강제사항 ("Lightning on_train_epoch_end callback 으로 per-epoch train/val loss MLflow 로깅") 은 본 phase 구현 요구사항으로 이전된다.
본 실험은 v9-05 와 동일하게 VQ 이식 전 단계의 순수 예측 성능 벤치마크 이다. VQ 결합·FL·KD 는 범위 밖.
1.2 핵심 연구 질문¶
EC50 5가구(Apt6/15/30/51/88) 가구별 독립 학습 조건에서, (A) N-HiTS 계열 MLP 구조 (NBEATSx, TSMixer, TiDE) 와 (B) TSLib hierarchical/variant 4종 (SCINet, ETSformer, Pyraformer, Crossformer) 중 (PAPE ≤ 43 AND HR@1 ≥ 37) gating 을 통과하는 모델이 존재하는가. 특히 SCINet (Track B 내 hierarchical 구조) 이 v9-05 decomposition+attention 계열 FAIL 패턴과 차별되는지.
1.3 가설 (H9-6)¶
- H9-6a (NF MLP 계열 peak 우위 재현): NBEATSx / TSMixer / TiDE 중 최소 1개 이상이 5-apt × 3-seed 평균으로 (PAPE ≤ 43 AND HR@1 ≥ 37) 를 달성한다.
- 근거: N-HiTS (PAPE 39.26, HR@1 22.29, v6 NF baseline) 가 NF Transformer 3종 대비 PAPE 13%p 우위. NBEATSx 는 N-HiTS 선조 basis-residual 구조, TSMixer/TiDE 는 attention 회피 all-MLP 구조 → v9-05 decomposition+attention smoothing 가설을 우회할 가능성.
-
주의: HR@1 ≥ 37 은 Chronos zero-shot (37.71) 수준이며 어떠한 NF/TSLib 모델도 v6/v9-01 benchmark 에서 도달한 적 없음 — H9-6a Pass 는 공격적 기준. Watch 판정 (단일 축 Pass) 도 meaningful 결과로 취급.
-
H9-6b (TSLib SCINet 단독 기대): SCINet 이 hierarchical sample-convolution-interaction 구조 (N-HiTS 유사 multi-resolution) 로 Track B 내 나머지 3종 (ETSformer / Pyraformer / Crossformer) 대비 peak 축 (PAPE, HR@1) 상대 우위. 단 절대 gating (PAPE ≤ 43 AND HR@1 ≥ 37) 통과 여부는 사전에 확신 불가 — 상대 우위만 H9-6b 의 판정 대상.
- 근거: SCINet 의 SCI-Block binary tree 구조는 N-HiTS 의 hierarchical interpolation 과 기계학습적으로 동류. Track B 내 나머지 3종은 ETSformer (decomposition 계열, Autoformer 유사) / Pyraformer (hierarchical attention) / Crossformer (multivariate 특화, 단변량에서 무력화).
-
판정: Track B 4종 내 PAPE ≤ min(ETSformer, Pyraformer, Crossformer) AND HR@1 ≥ max(세 모델 HR@1) 둘 다 만족 시 H9-6b 지지. 절대 gating 통과는 부가.
-
H9-6c (TSLib Transformer variants FAIL 재현): ETSformer / Pyraformer / Crossformer 는 v9-05 Autoformer/Informer/FEDformer 와 동질 패턴 (PAPE 50+, HR@1 ≤ 30) 으로 H9-5a-type FAIL 을 재현한다.
- 근거: 세 모델 모두 decomposition 또는 attention 기반이며 (ETSformer = ETS decomp + attention, Pyraformer = pyramidal attention, Crossformer = cross-dim attention). v9-05 FAIL 가설 (decomp+attention smoothing) 의 외부 validation 역할.
- 판정: 세 모델 모두 5-apt × 3-seed 평균 PAPE > 43 OR HR@1 < 37 이면 H9-6c 지지.
1.4 Gating (H9-6a 기준, v9-05 §1.4 일치)¶
| 레벨 | 조건 | 판정 |
|---|---|---|
| Pass | Track A/B 통합, 1개 이상 모델이 (PAPE ≤ 43 AND HR@1 ≥ 37) 3-seed 평균 달성 | H9-6a PASS, VQ 후보 확정 |
| Watch | 1개 이상이 단일 축만 달성 (PAPE ≤ 43 OR HR@1 ≥ 37) | 후보 확정 보류, per-apt std 심화 분석 |
| Fail | 전 모델 두 축 모두 미달 | v10 이후 VQ 재시도 방향 사용자 결정 (v9-05 §8.2 옵션 재심) |
Track 분리 판정: 상위 gating 과 별개로 본 보고서에서 Track A Pass 여부 / Track B Pass 여부 / SCINet 단독 판정 (H9-6b) 3건을 분리해 기록.
2. 모델 카탈로그¶
2.1 Track A — NeuralForecast MLP 계열 3종¶
NF 3종의 기본값은 Nixtla 공식 API docs 기준(2026-04-24 확인, nixtlaverse.nixtla.io/neuralforecast/) 이며, v6/v9-05 NF baseline 과 직접 비교 가능하도록 프로젝트 override 를 적용한다. 모델-specific 구조 파라미터는 NF 기본값 유지.
2.1.1 NBEATSx (NeurIPS 2020, Oreshkin et al.; NeurIPS 2023 Olivares et al. exogenous)¶
- 특징: basis-expansion block (identity/trend/seasonality) + backward/forward residual. N-HiTS 의 선조. 해석 가능성 + peak 보존 능력.
- NF docs 기본값:
stack_types=["identity","trend","seasonality"],n_blocks=[1,1,1],mlp_units=3*[[512,512]],n_harmonics=2,n_polynomials=2,dropout_prob_theta=0.0,activation="ReLU",learning_rate=1e-3,max_steps=1000,batch_size=32. - VQ 친화성 논거 (v10 이후 설계 수준): basis-residual 분리 → basis coefficient 를 discrete codebook 에 매핑 가능. Sparse-VQ Transformer 2024 와 동류 (FFN-free + VQ).
- v9-06 override:
max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>,input_size=96, h=24.
2.1.2 TSMixer (TMLR 2023, Chen et al., Google)¶
- 특징: all-MLP, time-mixing (temporal MLP) + feature-mixing (cross-feature MLP) 교대. attention 회피. Long-term benchmark 에서 PatchTST/FEDformer/Autoformer/TFT 를 outperform 주장.
- NF docs 기본값:
n_block=2,ff_dim=64,dropout=0.9,revin=True,scaler_type="identity",learning_rate=1e-3,max_steps=1000,batch_size=32,val_check_steps=100. - VQ 친화성 (설계 수준): MLP-mixer 의 token dimension mixing → feature embedding 에 VQ 삽입 자연스러움. Sparse-VQ 계열 적용 대상.
- v9-06 override:
max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>,input_size=96, h=24.scaler_type은 NF default "identity" 에서 "standard" 로 강제 — v9-05 비교 가능성 유지. 주의: TSMixer 는revin=True내장이므로 external standard scaler 와 중복 정규화 가능성. Smoke 에서 finite 확인 및 NaN 검사 필수. 실패 시 fallback:revin=False로 재시도.
2.1.3 TiDE (TMLR 2024, Das et al., Google)¶
- 특징: Time-series Dense Encoder. Encoder-decoder dense MLP (no attention, no RNN). Univariate long-term forecasting 특화. NLinear-competitive.
- NF docs 기본값:
hidden_size=512,dropout,layernorm옵션.learning_rate,max_steps,batch_size은 NF 공통 default (1e-3 / 1000 / 32) 추정 — docs 직접 미명시, source 에서 확인 필요 (engineer checklist §5.1). - VQ 친화성 (설계 수준): dense encoder 출력을 codebook 에 매핑 가능. 단 decomposition/frequency 같은 명시적 구조 분리 없음 — VQ 삽입 논거는 약함.
- v9-06 override:
max_steps=500, early_stop_patience_steps=50, val_check_steps=50, scaler_type="standard", random_seed=<seed>,input_size=96, h=24.
2.2 Track B — TSLib 4종¶
src/tslib/ clone (THUML Time-Series-Library, v9-05 설계서 §2.2 에서 위험 정리). TSLib run.py 공식 argparse defaults 기준, 프로젝트 override 는 v9-05 와 일관되게 적용.
TSLib 공통 default (run.py): d_model=512, n_heads=8, d_ff=2048, e_layers=2, d_layers=1, factor=1, dropout=0.1, learning_rate=1e-4, batch_size=32, train_epochs=10, patience=3, seq_len=96, label_len=48, pred_len=96, features='M', activation='gelu'.
Track B 공통 override: seq_len=96, label_len=48, pred_len=24, features='S' (univariate), learning_rate=1e-3 (v9-05 일치 → v6/v9-05 비교 가능성 유지; TSLib default 1e-4 대비 10× 상향), batch_size=32, train_epochs=50, patience=5 (v9-05 early_stop_patience_steps=50 과 epoch 스케일 ≈ 대응). 모델별 구조 파라미터는 아래 기본값 유지.
2.2.1 SCINet (NeurIPS 2022, Liu et al.) — Track B 내 기대주¶
- 특징: Sample Convolution + Interaction. Binary tree 구조 (SCI-Block = downsample → conv → interact → upsample). Hierarchical multi-resolution — N-HiTS 와 구조 동류.
- TSLib
models/SCINet.py기본값: engineer 가src/tslib/models/SCINet.py::__init__읽고num_stacks, num_levels, num_decoder_layer, concat_len, groups, kernel, dropout, single_step_output_One, positionalE, modified, RIN의 default 를 스크립트 상단 주석에 기록. 본 설계는 TSLib default 유지 를 원칙으로 하며, 명시적 override 는 Track B 공통 override (seq_len, pred_len, features, lr, bs, epochs, patience) 에 한정. - v9-06 기대치: Track B 4종 내 PAPE 상대 최소, HR@1 상대 최대. 절대 gating 통과 여부는 smoke 후 재평가.
2.2.2 ETSformer (arXiv 2022, Woo et al.)¶
- 특징: ETS (Exponential Smoothing) 분해 + exponential smoothing attention.
- TSLib 기본값 주의:
layers/ETSformer_EncDec.py,layers/ETSformer_Layer.py의존 — import sys.path 주입 후 확인. 추가 하이퍼파라미터:K(ETSformer top-K frequency). - 기대치 (H9-6c): v9-05 Autoformer 와 decomposition 계열 동질 → PAPE 50+ FAIL 예상.
2.2.3 Pyraformer (ICLR 2022, Liu et al.)¶
- 특징: Pyramidal attention (inter-scale C-ary tree + intra-scale).
- Input 제약: Pyraformer 는
window_size=[C1, C2, ...]과seq_len이 product 관계여야 함 (예: seq_len=96, window_size=[4,4] 면 pyramid level 수 = 2). TSLibmodels/Pyraformer.py의window_sizedefault 가 96 과 호환되는지 smoke 필수 검증. - 기대치 (H9-6c): hierarchical attention → Track A SCINet 과 구조 유사성 있으나 attention 기반이라 Autoformer/Informer 와 동질. Fail 예상하되, 만약 Pass 에 근접하면 사후 분석 대상.
2.2.4 Crossformer (ICLR 2023, Zhang & Yan)¶
- 특징: Two-Stage Attention (cross-time + cross-dimension) + Routers.
- Univariate 부적합성: kW 1개 변수만 존재하는 본 프로젝트 세팅 (가구별 독립 학습) 에서 cross-dimension attention 이 trivial 경로로 축소될 가능성 높음.
- 추가 하이퍼파라미터:
seg_len(segmentation length) —seq_len / seg_len이 정수여야 함. 기본 TSLib 설정 확인 후 96 과 호환되는 값 유지. - 기대치 (H9-6c): 강한 FAIL 예상 (구조적 무력화). 실패 시 "univariate 부적합" 이 primary 원인으로 해석, 비판적 결론.
2.3 중복 제외¶
- NF 기존 모델 (NHITS / TFT / TimesNet / PatchTST / iTransformer / DLinear) 및 v9-05 3종 (Autoformer / Informer / FEDformer) 은 재실행하지 않고 v9-05 reporter §2.2 의 baseline 테이블을 §6 비교표에 그대로 인용한다.
- TSLib 에도 TiDE/TSMixer 구현이 존재하나, NF 공식 구현이 peak_analysis 와 더 통합된 상태이므로 Track A (NF) 경로만 사용. TSLib Autoformer/Informer/FEDformer/TimesNet 도 사용하지 않음 (NF 와 동등한 baseline 이므로 중복).
3. 데이터 파이프라인¶
3.1 Track A (NF) — v6/v9-05 파이프라인 재사용¶
- 가구:
GWN_HOUSEHOLDS = ["Apt6","Apt15","Apt30","Apt51","Apt88"], year=2016. - 로더:
peak_analysis.community.load_apartment_hourly(apt, year)→pd.Series(index=DatetimeIndex, values=kW). - NF 변환:
experiments/forecasting/v6_0415_nf_baseline.py::prepare_nf_dataframe그대로 import 사용. - 분할:
v6_0415_nf_baseline.py::split_nf_dataframe(train:val:test = 0.7:0.1:0.2). - test sliding: stride=HORIZON=24 non-overlapping.
- 정규화:
scaler_type="standard"(NF 내부 StandardScaler) — v6/v9-05 일치. - seeds:
{42, 7, 123}→ NF 모델random_seed에 주입. - INPUT_SIZE=96, HORIZON=24.
3.2 Track B (TSLib) — Adapter 레이어 신규 구현¶
TSLib 는 data_provider/data_loader.py::Dataset_Custom 이 CSV 파일 → 4-tuple (seq_x, seq_y, seq_x_mark, seq_y_mark) 를 반환하도록 고정돼 있다. peak_analysis 는 이미 가구별 pd.Series 로드 파이프라인이 존재하므로, adapter 레이어를 신규 구현 한다.
3.2.1 Adapter 요구사항 (engineer 구현 대상)¶
peak_analysis.community.load_apartment_hourly(apt, year)
→ pd.Series (hourly kW)
→ train/val/test 분할 (0.7/0.1/0.2, v6/v9-05 와 동일)
→ 각 분할에 대해 sliding window (stride=1 train/val, stride=HORIZON test)
→ torch.utils.data.Dataset 로 wrapping, __getitem__ 반환 4-tuple:
seq_x: shape (seq_len=96, 1) float32, standardized kW
seq_y: shape (label_len+pred_len = 48+24 = 72, 1) float32
seq_x_mark: shape (96, 4) [month, day, weekday, hour] normalized to [-0.5, 0.5]
seq_y_mark: shape (72, 4) 동일
- 표준화: train split mean/std 로 fit, val/test 에 transform. Track A (NF) 와 동일 scaler 정책.
- 역변환: 예측 후 test y_pred 에 inverse transform 적용. Track A 와 동일 원본 kW 스케일 비교 보장.
- File path: adapter 는
experiments/forecasting/v9_0424_baseline_extension_2.py내부class TSLibHouseholdDataset(torch.utils.data.Dataset)로 구현. 별도 패키지 승격 없음 (본 phase 범위 한정).
3.2.2 TSLib Model 호출 어댑터¶
TSLib Model __init__(configs: argparse.Namespace) 규약:
from types import SimpleNamespace
import sys
from pathlib import Path
TSLIB_ROOT = Path(__file__).parents[2] / "src" / "tslib"
sys.path.insert(0, str(TSLIB_ROOT))
from models.SCINet import Model as SCINetModel # example
configs = SimpleNamespace(
task_name="long_term_forecast",
seq_len=96, label_len=48, pred_len=24,
enc_in=1, dec_in=1, c_out=1, # univariate
d_model=512, n_heads=8, d_ff=2048,
e_layers=2, d_layers=1, factor=1,
dropout=0.1, activation="gelu",
embed="timeF", freq="h",
output_attention=False,
# 모델별 추가 파라미터는 각 TSLib 소스에서 필요 필드 확인 후 주입
)
model = SCINetModel(configs)
- engineer checklist: 각 모델
models/<Model>.py::Model.__init__읽고 필요 configs 필드 전수 확인 (missing attribute 시 AttributeError). 본 설계는 어댑터 skeleton 만 제시, 모델별 missing field 채움은 engineer 책임 (§5.1).
3.2.3 학습 루프¶
- TSLib
exp/exp_long_term_forecasting.py::Exp_Long_Term_Forecast는 import 하지 말고, peak_analysis 자체 loop 을 작성. - Optimizer:
torch.optim.Adam(model.parameters(), lr=1e-3). - Loss:
torch.nn.MSELoss(). - Early stopping: val MSE 개선 없이 patience=5 epoch → 중단.
- Epoch 상한: 50.
- Device:
cuda(RTX 5070 Ti). - bf16 mixed precision: 기본
False(TSLib 모델 일부 dtype 호환 미검증 — smoke 에서 검증). - Batch loop:
seq_x, seq_y, seq_x_mark, seq_y_mark = batch→.to(device).dec_inp = torch.zeros_like(seq_y[:, -pred_len:, :])dec_inp = torch.cat([seq_y[:, :label_len, :], dec_inp], dim=1)y_pred = model(seq_x, seq_x_mark, dec_inp, seq_y_mark)[:, -pred_len:, :]loss = MSE(y_pred, seq_y[:, -pred_len:, :])
3.3 시드 처리¶
- Seed 집합
{42, 7, 123}(v9-05 일치). - Track A: NF
random_seed파라미터 주입. - Track B:
torch.manual_seed(seed),np.random.seed(seed),random.seed(seed),torch.cuda.manual_seed_all(seed)각 run 시작 시 호출.torch.use_deterministic_algorithms(False)(v9-05 일치, 성능 우선).
3.4 TSLib 버전 해시 기록¶
- 본 phase 실행 진입 시 engineer 가
cd src/tslib && git rev-parse HEAD수행, 결과를docs/reference/project_state/v9_baseline_ext_2.md에 기록 (v9-05 설계서 §2.2 R4 에서 지시된 재현성 요구사항).
4. MLflow 로깅 스키마 (P1: per-epoch 강제)¶
4.1 Experiment & Run¶
- Experiment name:
v9-baseline-ext-2(v9-05v9-baseline-ext와 분리). - Run name 규약:
{track}_{model}_{apt}_seed{seed}— 예:A_NBEATSx_Apt6_seed42,B_SCINet_Apt88_seed123. - Aggregate run: Track × model 별 3-seed × 5-apt 완료 후
{track}_{model}_aggregate_meanrun 생성 (v6/v9-05 패턴).
4.2 Params¶
모든 run 공통 기록:
track: "A" | "B"
model: str # "NBEATSx" | "TSMixer" | "TiDE" | "SCINet" | "ETSformer" | "Pyraformer" | "Crossformer"
apt: str # "Apt6" | ... | "Apt88"
seed: int # 42 | 7 | 123
input_size: 96
horizon: 24
max_steps: 500 # Track A
train_epochs: 50 # Track B
early_stop_patience_steps: 50 # Track A
patience: 5 # Track B
val_check_steps: 50 # Track A
learning_rate: 1e-3
scaler_type: "standard" # (Track B 는 adapter scaler 동등)
batch_size: 32
features: "S" # Track B only, univariate
tslib_git_hash: str # Track B only, engineer 가 sys 호출로 주입
model_specific: json # 모델별 NF/TSLib 기본값 요약
4.3 Metrics (per-epoch & final)¶
- [P1 강제] Per-step metrics —
mlflow.log_metric(..., step=epoch)호출 필수. v9-05 위반 재발 방지. train_loss— epoch 평균 training loss (MSE).val_loss— epoch 말 validation loss (MSE).val_mse— NF 내부 validation metric (Track A).- Track A (NF/Lightning) 구현:
pytorch_lightning.callbacks.Callback를 상속해on_train_epoch_end(self, trainer, pl_module)에서trainer.callback_metrics["train_loss_epoch"]등을mlflow.log_metric(...)로 re-emit.mlflow.pytorch.autolog(log_every_n_epoch=1)병용 가능 여부는 engineer 판단. - Track B (raw torch loop) 구현: epoch 끝에서 직접
mlflow.log_metric("train_loss", epoch_train_loss, step=epoch)+mlflow.log_metric("val_loss", epoch_val_loss, step=epoch)호출. -
sanity check: 본 phase 실험 완료 후
MlflowClient().get_metric_history(run_id, "train_loss")결과 길이가 1 이상임을 random 3 run 에서 확인 (v9-05len(hist) == 0재발 방지). exp-expert 가 결과 보고서 §2.0 에 이 확인 결과를 명시 기록. -
Final metrics (가구별 test):
- 7-metric:
mse, mae, mape, smape, pape, hr_tol1, hr_tol2— v9-05compute_metrics_v95재사용. - 집계 run 에서는
{model}_{metric}_mean,{model}_{metric}_std.
4.4 Artifacts¶
| artifact_path | 내용 | 생성 경로 |
|---|---|---|
predictions/{track}_{model}_{apt}_seed{seed}_y_true.npy |
shape=(N_window, 24), float64, kW 스케일 | outputs/v9_baseline_ext_2/predictions/ |
predictions/{track}_{model}_{apt}_seed{seed}_y_pred.npy |
동일 shape | 동일 |
checkpoints/{track}_{model}_{apt}_seed{seed}/best.ckpt (Track A) best.pt (Track B) |
최상 val 시점 체크포인트 | outputs/v9_baseline_ext_2/checkpoints/ |
metrics/{track}_{model}_{apt}_seed{seed}.json |
가구별 7 metric JSON | 동일 |
summary.csv (aggregate run) |
(track, model, apt, seed, metric) 전체 테이블 | outputs/v9_baseline_ext_2/summary.csv |
training_curves/{run_id}.png (선택) |
per-epoch train/val loss 곡선, H9-6 수렴 해석용 | 동일 |
4.5 v9-05 재인용¶
v9-05 NF 3종 (Autoformer/Informer/FEDformer) 및 v6/v9 기존 baseline (NHITS/TFT/TimesNet/PatchTST/iTransformer/DLinear/Chronos/B0/B1/R1b) 수치는 v9-05 reporter §2.2 의 baseline 테이블 + v9-05 v9-baseline-ext experiment (id=766380978402830870) 를 직접 인용. 재학습 없음.
5. 실행 단계¶
5.1 의존성 확인 + engineer checklist¶
- Track A:
uv run python -c "from neuralforecast.models import NBEATSx, TSMixer, TiDE; print('ok')"통과 확인.- TiDE
hidden_size / learning_rate / max_steps / batch_sizedefault 값을neuralforecast/neuralforecast/models/tide.py에서 직접 확인 후 스크립트 상단 주석 기록. - Track B:
cd src/tslib && git rev-parse HEAD→docs/reference/project_state/v9_baseline_ext_2.md에 기록.sys.path.insert(0, str(TSLIB_ROOT))후from models.SCINet import Model등 4 모델 전수 import 성공 확인.- 각 모델
Model.__init__소스 읽고 필요한configs필드 전수 목록화 (SCINet 은num_stacks, num_levels, concat_len, groups, kernel, dropout, single_step_output_One, positionalE, modified, RIN/ Crossformer 는seg_len/ Pyraformer 는window_size). 누락 시 AttributeError.
5.2 스크립트 생성¶
- 파일:
experiments/forecasting/v9_0424_baseline_extension_2.py(단일 파일, argparse--track {A,B}로 Track 스위치). - 분리 가능하나 본 설계는 단일 파일 원칙 (v9-05 와 일관, import 경로 혼선 최소화).
- 재사용:
- v9-05 의
compute_metrics_v95,prepare_nf_dataframe,split_nf_dataframe,run_single_v95(또는 그 하위 루틴) 를 import. - Track A:
build_single_model을 NBEATSx/TSMixer/TiDE 추가 factory 로 확장. - Track B:
TSLibHouseholdDataset(어댑터) +build_tslib_model(name, configs)+train_tslib_model(model, loaders, mlflow_run)신규 함수 3종. - MLflow 콜백 (Track A, P1):
class EpochMLflowCallback(pytorch_lightning.callbacks.Callback)정의:on_train_epoch_end:mlflow.log_metric("train_loss", trainer.callback_metrics["train_loss_epoch"].item(), step=self.current_epoch)on_validation_epoch_end:mlflow.log_metric("val_loss", trainer.callback_metrics["val_loss"].item(), step=self.current_epoch)
- NF
fit()호출 전에nf.models[0].trainer_kwargs["callbacks"] = [EpochMLflowCallback()]주입. NF 내부 Lightning trainer 에 callback 을 attach 하는 방법은 NF source 의BaseAuto.fit/NeuralForecast.fit을 확인 후 engineer 결정 (fallback: NF Lightning logger 를 MLFlowLogger 로 교체). - MLflow 로깅 (Track B, P1):
- 자체 train loop 내
for epoch in range(train_epochs):에서 epoch 끝에mlflow.log_metric("train_loss", ..., step=epoch)직접 호출. - argparse:
--track:A/B/both(기본 both).--models: 기본은 Track 에 따른 전체 리스트, smoke 시 단일 모델.--seeds: 기본[42, 7, 123], smoke 시[42].--apts: 기본GWN_HOUSEHOLDS, smoke 시["Apt6"].--max-steps(Track A) /--train-epochs(Track B): smoke 시 50 / 3.
5.3 Smoke 단계¶
smoke 의 목적은 (i) Track A P1 callback 동작 검증, (ii) Track B 어댑터 전체 경로 검증, (iii) Pyraformer input_len=96 호환성 검증, (iv) Crossformer seg_len 호환성 검증 4건.
- Smoke 실행 조합:
- A-smoke: NBEATSx × Apt6 × seed42 × max_steps=50.
- B-smoke-SCINet: SCINet × Apt6 × seed42 × train_epochs=3.
- B-smoke-Pyraformer: Pyraformer × Apt6 × seed42 × train_epochs=3. input_len=96 호환 실패 시 본 phase Pyraformer 제외 (H9-6c 대상 축소).
- B-smoke-Crossformer: Crossformer × Apt6 × seed42 × train_epochs=3. seg_len 파라미터 호환 확인.
- B-smoke-ETSformer: ETSformer × Apt6 × seed42 × train_epochs=3.
- Smoke 성공 기준:
- y_true/y_pred shape ==
(N_test_window, 24). - 7-metric 모두 finite.
- [P1]
MlflowClient().get_metric_history(run_id, "train_loss")길이 ≥ 1 확인 — per-epoch 로깅 동작 증거. - Smoke 실패 대응:
- Track A NBEATSx 실패 → TSMixer/TiDE 도 동일 NF trainer 문제 가능성, engineer 가 원인 판별.
- Track B 모델 실패 → 해당 모델만 본 phase 제외. 제외 사실을 exp-expert 결과 보고서 §1 에 명시. 나머지 Track B 모델은 계속 진행.
- Smoke 소요: 5–10분 내 전체 종료 (5 smoke run × 30s–2min).
5.4 본 실행¶
- Track A (NF MLP 3종): 3 models × 5 apts × 3 seeds = 45 run.
- 순차 실행, NF 내부 Lightning trainer, RTX 5070 Ti 단일 GPU.
- 예상 per-run: NBEATSx ~2–3분, TSMixer ~2분, TiDE ~2–3분 (v9-05 Informer 39s 기준 유사).
- Track A 총 소요: 30–45분.
- Track B (TSLib 4종): 4 models × 5 apts × 3 seeds = 60 run.
- 순차 실행. TSLib 모델은 raw torch loop.
- 예상 per-run: SCINet ~2분, ETSformer ~3분, Pyraformer ~3분, Crossformer ~2분 (TSLib run.py epoch=10 baseline 참고, 본 phase epochs=50).
- Track B 총 소요: 1.5–2시간.
- 전체 소요 (45 + 60 = 105 run): 2–3시간 wall-clock.
- 중단/재개: 각 run 독립 MLflow run. 부분 재실행 허용.
5.5 집계¶
- Per-run metric →
outputs/v9_baseline_ext_2/summary.csv. - v9-05
summary.csv+ v6 NF-Baseline MLflow 를 query 해summary_combined.csv생성 — 본 phase 신규 7 모델 + v9-05 신규 3 모델 + v6 기존 11 baseline = 21 모델 비교 표. - 집계 스크립트:
outputs/v9_baseline_ext_2/_aggregate_analysis.py(engineer 작성).
5.6 후속 체인¶
- exp-expert 결과 보고서:
report/version9/exp-expert/v9-06_baseline_ext_2_results.md— 3-seed 결과, per-apt std, Track 분리 gating 판정 (H9-6a, H9-6b, H9-6c 각각). - exp-critic 자동 트리거 (CLAUDE.md hook).
- reporter 최종 요약:
report/version9/reporter/v9-06_baseline_ext_2_summary.md. - Project state 기록:
docs/reference/project_state/v9_baseline_ext_2.md— TSLib git hash, smoke 제외 모델, 후속 VQ 후보 선정.
6. Gating 상세 (H9-6 판정)¶
6.1 H9-6a (Track A/B 통합)¶
기준 수치는 5가구 평균 × 3-seed 평균.
| Metric | Pass | Watch | Fail |
|---|---|---|---|
| PAPE (%) | ≤ 43.00 | ≤ 46.00 | > 46.00 |
| HR@tol=1 (%) | ≥ 37.00 | ≥ 30.00 | < 30.00 |
| Seed std (PAPE, HR@1) | < 1.00%p / 1.50%p | < 2.00%p / 3.00%p | ≥ 2.00%p |
- Pass: PAPE Pass AND HR@1 Pass AND seed std < 2.00%p / 3.00%p.
- Watch: 단일 축 Pass.
- Fail: 양축 Fail.
6.2 H9-6b (SCINet 단독, Track B 내부)¶
- 지지 조건: SCINet PAPE ≤ min(ETSformer PAPE, Pyraformer PAPE, Crossformer PAPE) AND SCINet HR@1 ≥ max(세 모델 HR@1). 절대 gating 통과는 추가 평가.
- 미지지: 위 조건 미충족.
6.3 H9-6c (TSLib Transformer variants FAIL 재현)¶
- 지지: ETSformer, Pyraformer, Crossformer 세 모델 모두 (PAPE > 43 OR HR@1 < 37).
- 미지지 (예상외 Pass): 세 모델 중 1개 이상이 H9-6a Watch 이상 → v9-05 decomp+attention smoothing 가설 재검증 필요, post-hoc 분석 대상.
6.4 대체 판정 (H9-6a Fail 시)¶
본 phase 도 전수 Fail 이면 v9-05 reporter §8.2 의 옵션 재심:
- 옵션 A: 추가 backbone 탐색 없이 VQ track 방향 재검토 (ADR 작성, 사용자 결정).
- 옵션 B: hyperparameter 재탐색 (max_steps↑, lr sweep) — 본 설계 범위 밖, 별도 phase 필요.
- 옵션 C: peak-aware loss / target transform 같은 손실 축 접근 재개 (v6 Phase3b 폐기 근거 재검토 필요).
본 설계는 옵션 선택을 강제하지 않는다.
7. Risks & Mitigation¶
| # | 리스크 | 영향도 | Mitigation |
|---|---|---|---|
| R1 | TSLib 어댑터 구현 비용 초과 (engineer 2일 이상) | 고 | smoke 에서 SCINet 하나 먼저 성공시킨 뒤 나머지 3종은 같은 어댑터 skeleton 재사용. 실패 모델은 즉시 제외. |
| R2 | Pyraformer input_len=96 비호환 (pyramid level 제약) | 중 | smoke 에서 검증. 실패 시 Pyraformer 본 실행 제외, H9-6c 3→2 모델로 축소, 결과 보고서 §1 에 명시. |
| R3 | Crossformer seg_len 호환 실패 또는 univariate trivial 수렴 | 중 | smoke 에서 seg_len={24, 48} 조합 시도. univariate 에서 의미 없는 constant 예측 시 결과는 기록하고 "univariate 부적합" 으로 해석 (H9-6c 지지 증거). |
| R4 | TSMixer revin=True + external scaler_type="standard" 중복 정규화로 loss NaN |
중 | smoke 에서 finite 확인. NaN 발생 시 fallback: revin=False 재시도. fallback 도 실패면 TSMixer 제외. |
| R5 | [P1] Lightning callback 이 NF 내부 trainer 에 주입되지 않아 per-epoch 로깅 재발 실패 | 고 | smoke 단계에서 MlflowClient().get_metric_history(run_id, "train_loss") 길이 ≥ 1 직접 확인 필수. 실패 시 본 실행 진입 금지, engineer 재수정. |
| R6 | Track B raw torch loop 의 seed 비결정성이 NF 보다 훨씬 커서 seed std 증폭 | 중 | 3-seed 결과 std 가 Track A 대비 2× 이상이면 결과 보고서에서 해석 주의 표시. 본 설계에서는 torch.use_deterministic_algorithms(False) 유지. |
| R7 | 총 105 run × 1–2분 = 2–3시간 예상이 실제 5시간 이상으로 초과 | 중 | FEDformer wall-clock (v9-05 94.3s) 기준 Track B 도 유사 범위로 추정하나 실제 편차 가능. Track A 먼저 완료 후 Track B smoke 직후 시간 재측정 → 본 실행 중 필요 시 max_steps/epochs 축소 의사결정 (exp-expert 판단). |
| R8 | SCINet num_levels/num_stacks default 가 seq_len=96, pred_len=24 와 부적합 |
중 | TSLib 공식 ETTh1 script default 참조 (engineer 확인). 부적합 시 TSLib README ETTh1 기본값 복제. |
| R9 | TSMixer NF default dropout=0.9 가 univariate single-household 에 과도 → underfit | 저 | fallback 으로 dropout=0.1 재시도. 본 설계는 NF default 유지가 원칙. |
8. 산출물 경로¶
8.1 스크립트¶
- 메인 학습 스크립트:
experiments/forecasting/v9_0424_baseline_extension_2.py(engineer 구현). - Track A 분기 + Track B 분기 (어댑터 + raw loop).
- v9-05
compute_metrics_v95,prepare_nf_dataframe,split_nf_dataframeimport 재사용. - Track A P1 callback:
EpochMLflowCallback내장. - Track B P1: epoch 끝에 직접
mlflow.log_metric(..., step=epoch)호출. - 집계 스크립트:
outputs/v9_baseline_ext_2/_aggregate_analysis.py(engineer).
8.2 출력¶
- 원시:
outputs/v9_baseline_ext_2/ predictions/*.npy(MLflow artifact 와 동일, log 후 선택적 삭제)checkpoints/{track}_{model}_{apt}_seed{seed}/best.{ckpt,pt}metrics/{track}_{model}_{apt}_seed{seed}.jsonsummary.csv,summary_smoke.csv,summary_combined.csv(v9-05 + v6 병합)logs/{track}_{model}_{apt}_seed{seed}.log- MLflow: experiment
v9-baseline-ext-2.
8.3 보고서¶
- 설계서 (본 문서):
report/version9/lab-leader/v9-06_baseline_extension_2.md. - 실험 결과 (exp-expert):
report/version9/exp-expert/v9-06_baseline_ext_2_results.md. - 적대적 검토 (exp-critic):
report/exp-critic/v9-06_baseline_ext_2_critic.md(hook 자동 생성). - 최종 요약 (reporter):
report/version9/reporter/v9-06_baseline_ext_2_summary.md.
8.4 Project state / TODO¶
- Project state:
docs/reference/project_state/v9_baseline_ext_2.md— TSLib git rev-parse 해시, smoke 제외 모델, Track A/B/SCINet 판정, VQ 후보 확정 또는 부재 기록. - TODO:
todos/track-f_baseline_extension.md(v9-05 에서 이미 사용 중이면 append, 없으면 신규). orchestrator 가todos/README.md인덱스에 반영.
9. 참고 문헌¶
Track A 모델 원 논문¶
- Oreshkin, B. N. et al. "N-BEATS: Neural basis expansion analysis for interpretable time series forecasting". ICLR 2020 (NeurIPS 2019 workshop 선). https://arxiv.org/abs/1905.10437
- Olivares, K. G. et al. "Neural basis expansion analysis with exogenous variables: Forecasting electricity prices with NBEATSx". International Journal of Forecasting 2023. https://arxiv.org/abs/2104.05522
- Chen, S.-A. et al. "TSMixer: An All-MLP Architecture for Time Series Forecasting". TMLR 2023. https://arxiv.org/abs/2303.06053 / https://openreview.net/forum?id=wbpxTuXgm0 / https://research.google/blog/tsmixer-an-all-mlp-architecture-for-time-series-forecasting/
- Das, A. et al. "Long-term Forecasting with TiDE: Time-series Dense Encoder". TMLR 2024. https://arxiv.org/abs/2304.08424
NF 공식 문서 (기본값 근거, 2026-04-24 확인)¶
- NBEATSx docs: https://nixtlaverse.nixtla.io/neuralforecast/models.nbeatsx.html
- TSMixer docs: https://nixtlaverse.nixtla.io/neuralforecast/models.tsmixer.html
- TiDE docs: https://nixtlaverse.nixtla.io/neuralforecast/models.tide.html
- NF repo: https://github.com/Nixtla/neuralforecast
Track B 모델 원 논문¶
- Liu, M. et al. "SCINet: Time Series Modeling and Forecasting with Sample Convolution and Interaction". NeurIPS 2022. https://arxiv.org/abs/2106.09305
- Woo, G. et al. "ETSformer: Exponential Smoothing Transformers for Time-series Forecasting". arXiv 2022. https://arxiv.org/abs/2202.01381
- Liu, S. et al. "Pyraformer: Low-complexity Pyramidal Attention for Long-range Time Series Modeling and Forecasting". ICLR 2022. https://openreview.net/forum?id=0EXmFzUn5I
- Zhang, Y. & Yan, J. "Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series Forecasting". ICLR 2023. https://github.com/Thinklab-SJTU/Crossformer
- THUML Time-Series-Library: https://github.com/thuml/Time-Series-Library /
run.pyargparse defaults: https://github.com/thuml/Time-Series-Library/blob/main/run.py
전력/부하 도메인¶
- "Enhanced N-BEATS for Mid-Term Electricity Demand Forecasting". 2024. https://arxiv.org/html/2412.02722v1
- "Benchmarking Time Series Foundation Models for Short-Term Household Electricity Load Forecasting". arXiv 2024. https://arxiv.org/html/2410.09487v1
프로젝트 내부 선행¶
report/version9/lab-leader/v9-05_baseline_extension.md— v9-05 설계서 (포맷 준수 기준).report/version9/exp-expert/v9-05_baseline_ext_results.md(revision 1) — v9-05 결과, per-epoch 로깅 누락 고지.report/version9/reporter/v9-05_baseline_ext_summary.md— v9-05 reporter 요약, TSLib 2차 착수 판단 자료.experiments/forecasting/v9_0424_baseline_extension.py— Track A factory 확장 기준.experiments/forecasting/v6_0415_nf_baseline.py— 데이터 파이프라인 재사용.docs/reference/project_state/v9_baseline_ext_lessons.md(v9-05 P3 권고 생성 대상) — Lightning callback 구현 가이드 참조 (engineer 작성).
10. Self-Verify 체크리스트¶
- 웹 서치 수행 (NF NBEATSx/TSMixer/TiDE docs, TSLib run.py defaults, Pyraformer window_size 제약, TSMixer/SCINet 원 논문)
- 가설 H9-6a / H9-6b / H9-6c 명확·정량 정의 및 판정 조건 분리
- 성공 기준 3-tier (Pass/Watch/Fail) 정량 정의 (v9-05 와 일치 + Watch 기준 약간 완화)
- 베이스라인 (v9-05 + v6 baseline) 근거 명시
- Track A/B 각 모델 기본값 (NF docs / TSLib run.py argparse) 근거 첨부, override 는 v9-05 조건과 일치
- Track B 어댑터 skeleton 명시 (sys.path 주입, SimpleNamespace configs, 4-tuple DataLoader, raw torch loop)
- P1 강제사항 (Lightning callback per-epoch 로깅) 구현 패턴 명시 + smoke sanity check 절차 내장
- 실행 계획에
v9_0424_baseline_extension_2.py, v9-05/v6 재사용 모듈 참조 - Risks (어댑터 비용, Pyraformer/Crossformer 호환, TSMixer dropout, P1 재발 방지) 전수 기재
- 범위 엄수 — Track A/B 실행 외 추가 ablation (lr sweep, dropout sweep, stack_type ablation) 없음. fallback 은 smoke 실패 시에만 적용.
- 파일명 규약
v{N}-{NN}_{제목}.md(v9-06) - 언어 규약 (한국어 헤더 + 영어 기술 용어)
- v9-05 reporter §8.3 P1 강제사항 본 phase 에 승계 및 명시 (§4.3, §5.3 smoke sanity, §7 R5)