Source:
report/version6/exp-expert/v6_0419_exp6_figures_design.md
Exp6 FeDPM 결과 시각화 — 도면 설계 문서 (v2)¶
- 작성자: exp-expert
- 버전: v2 (2026-04-19, exp-critic REVISE 반영)
- 이전 버전: v1 (2026-04-19) —
git log -- report/version6/exp-expert/v6_0419_exp6_figures_design.md참조 - 근거 보고서:
report/version6/lab-leader/v6_0415_exp6_final_report.md - Critic 리뷰:
report/version6/exp-critic/v6_0418_fl_baseline_adversarial_review.md(REVISE REQUIRED) - 구현 담당: engineer (별도 위임, 본 문서 스펙 확정)
- 출력 경로:
outputs/figures/v6_0419_exp6/ - 툴 스택: matplotlib 3.x + seaborn (프로젝트 관례), pandas, mlflow
- 공통 규칙:
- DPI 300, 벡터(pdf) + 래스터(png) 동시 저장
- 폰트: sans-serif, 논문 사이즈(본문 column width=3.3in, full-width=7.0in)
- 색상: seaborn
deeppalette, FL 계열은 통일된 색상 체인 사용 - 데이터는
data/exp6_results.csv에서 로드 (MLflow 우선, 유실 건은 보고서 직독 + 출처 주석) - 축 라벨·제목·범례·단위 필수
- 재학습 없음, MLflow 신규 run 로깅 불필요(기존 run_id는 추적/참조용)
0. Changelog (v1 → v2)¶
Critic 비평 7건(C1~C3, M1~M5)에 대한 반영 내역. 모두 수용했으며, 일부는 근거 있는 수정안으로 변형 채택.
- [C1 통계적 정직성] F1 Pareto에서 multi-seed/single-seed marker 스타일 분리(채움 vs 빈), errorbar는 multi-seed(P1)에만 표기. R1b 어노테이션을 "PAPE Best (38.40%, n=1)"로 톤다운하고 "single-seed, 3-seed 재현 필요"를 caption에 명시. R1b 3-seed 재실행은 §8 후속 작업으로 분리. (§3 F1, §8)
- [C2 재현성] §6에 MLflow run_id 추적 테이블 신설(13개 모델 + sweep variants). FedLearning-Phase2-fedavg/local 등 baseline은 가구별 run을 평균 집계한 항목을 명시. PAPE는 별도 평가 스크립트로 산출되어 mlruns에 미저장 → CSV 데이터 정합성을 위한 빌드 스크립트(
build_exp6_results_csv.py) 분리 명시. (§4.3, §6) - [C3 비교 공정성] F1을 2x2 family-subplot grid로 재설계 채택. 4개 subplot이 동일 축(MSE/PAPE 동일 범위) 공유, family별 background tinting. Pareto frontier 점선은 제거하여 frontier claim 회피. 통합 비교용 single-panel scatter는 F1b로 supplementary에 별도 저장. (§3 F1, F1b)
- [M1 F7 waterfall] F7을 2D trajectory plot으로 재설계: PAPE축×MSE축 위에 V1→P1→R1b 화살표 경로. PAPE 개선과 MSE 악화를 한 화면에 동시 노출. waterfall 단일 plot은 misleading하므로 폐기. (§3 F7)
- [M2 F6] PAPE ranking bar는 §3.4 표와 정보 중복. Supplementary 격하(논문 본문에서 빠짐). 다만 발표 슬라이드 용도가 있으므로 제거 대신 supplementary 유지. (§2 표, §3 F6)
- [M3 F5] "No scale benefit" 주석을 "n=1 per setting, single-seed observation; needs replication"으로 명시 보강. (§3 F5)
- [M4 누락 그림] F8(codebook usage histogram), F9(learning curve sample), F10(client-level PAPE distribution) 신규 추가. raw data 접근 가능성은 §6 MLflow 테이블에서 "확인 가능/유실" 명시(open question 폐기). (§3 F8/F9/F10, §6)
- [M5 Open Question 제거] §7 폐기. 모든 결정사항을 본문 §3/§4 확정 스펙으로 흡수. (§7 삭제)
근거 있는 부분 수용 / 변형 사항 (비평을 그대로 받지 않은 부분):
- C3에 대해 critic은 "(a) family subplot 또는 (b) frontier 제거"의 택일을 요구했으나, 본 v2는 (a)+(b) 동시 적용을 채택. 이유: family subplot만 적용해도 frontier 점선이 각 subplot 내에서 4개 점만 잇는 trivial line이 되어 정보 가치가 없음. 그래서 frontier 점선도 함께 제거. supplementary F1b(통합 scatter)에서도 frontier를 제거하여 일관성 유지.
- M2에 대해 critic은 "supplementary 격하 또는 제거" 택일을 요구. 본 v2는 격하만 선택(제거하지 않음). 이유: 발표 슬라이드 1장으로 모든 모델을 서열화해 보여주는 용도가 별도로 있어 deliverable 가치 보존.
- M4에 F9(learning curve)는 mlruns의
val_msestep 데이터에서 직접 추출 가능함을 §6에서 확인. F8(codebook usage)는 raw histogram이 mlruns에 미저장 가능성 높음 → engineer가 mlruns 점검 후 산출 가능 시에만 생성, 불가하면 supplementary에서 빠짐(이 fallback은 §3 F8에 명시). - C1의 R1b 3-seed 재실행 권고는 본 시각화 작업과 분리해 후속 task로 발행(§8). 이유: (1) v1 본문 figure 8개는 R1b가 single-seed임을 명시한 채로도 valid하게 그릴 수 있음, (2) 3-seed 재실행은 약 2~3시간 소요되어 시각화와 병렬 진행이 효율적.
1. 설계 원칙¶
1.1 청중 및 맥락¶
- 1차 대상: 논문 Figure(컨퍼런스/저널 submission)
- 2차 대상: 발표 슬라이드(세미나, 심사용), reviewer 대응 supplementary
- 핵심 스토리: "동일 도메인 FL에서 VQ codebook은 한계가 있지만, Peak Loss + DLinear Residual 조합으로 PAPE 최선을 달성한다. 단, MSE 트레이드오프가 발생한다."
1.2 그림 선정 원칙¶
- 가설 판정표(§2)와 1:1 대응되는 figure 확보 → 본문 reference 용이
- MSE-PAPE 트레이드오프를 시각적으로 강조하되 frontier claim은 회피(family confounder 때문)
- 베이스라인(NF/FM/Local/FL 4계열)은 family별 분리 표시가 기본
- 스케일 실패(50 clients) 부정 결과도 정직하게 노출 + 통계적 한계 명시
- single-seed vs multi-seed 차이를 marker style로 구분
2. 그림 목록 (v2 재구성)¶
| ID | 제목 | 종류 | 크기 | 우선순위 | 데이터 소스 | 본문/Supp |
|---|---|---|---|---|---|---|
| F1 | MSE–PAPE by Family (2x2 subplot) | scatter, family-faceted | 7.0in × 5.5in | ★★★ | §3.1, §3.3 | 본문 |
| F1b | MSE–PAPE Combined (supplementary) | scatter, single panel | 7.0in × 4.5in | ★ | §3.1, §3.3 | Supp |
| F2 | 가설 판정 Bar (H6-1~H6-3b) | 2x2 grouped bar | 7.0in × 4.0in | ★★★ | §2 | 본문 |
| F3 | Beta Sweep Curve (alpha=2 고정) | line (dual y-axis) | 3.3in × 3.0in | ★★ | §3.2 | 본문 |
| F4 | Alpha Sweep Bar (beta=2 고정) | bar (dual metric) | 3.3in × 3.0in | ★★ | §3.2 | 본문 |
| F5 | 50-clients vs 5-clients 비교 | grouped bar (3 metrics) | 7.0in × 3.5in | ★★ | §5 | 본문 |
| F6 | PAPE Ranking Horizontal Bar | horizontal bar (color by family) | 7.0in × 4.5in | ★ | §3.4 | Supp (격하) |
| F7 | V1→P1→R1b Trajectory (MSE×PAPE) | 2D arrow plot | 4.5in × 4.0in | ★★ | §2, §3.1 | 본문 |
| F8 | Codebook Usage Histogram | bar histogram | 3.3in × 3.0in | ★ | mlruns artifacts (조건부) | Supp |
| F9 | Learning Curve (val_mse vs round) | line (multi-model overlay) | 3.3in × 3.0in | ★ | mlruns metrics | Supp |
| F10 | Client-level PAPE Distribution (50 clients) | strip + box | 3.3in × 3.0in | ★ | mlruns 50-client artifacts (조건부) | Supp |
총 11개 figure. 본문 6개(F1, F2, F3, F4, F5, F7), Supplementary 5개(F1b, F6, F8, F9, F10). F8/F10은 mlruns에 raw 데이터 존재 시에만 생성(조건부, §6 참조).
3. 상세 스펙¶
F1. MSE–PAPE by Family (2x2 subplot grid) [재설계, C3 반영]¶
목적: 13개 모델의 MSE-PAPE 트레이드오프를 family별로 분리해서 보여줌. 학습 조건 confounder(FL/Local/NF 학습/FM zero-shot)를 시각적으로 분리해 부당한 frontier 비교를 회피.
타입: 2x2 subplot scatter (sharex, sharey) - 패널 (a) Local & FL: B0, B1, V1, P1(a2,b2), P1(a3,b2), R1, R1b - 패널 (b) NF (지도학습): NHITS, PatchTST, TimesNet, iTransformer, TFT - 패널 (c) FM (zero-shot): TimeMoE-50M, Chronos-Bolt, Moirai-Small - 패널 (d) All families overlay (참고용, alpha=0.4 흐리게)
축 (모든 패널 공유) - X축: MSE — 범위 0.48 ~ 0.75 (sharex) - Y축: PAPE (%) — 범위 36 ~ 55 (sharey) - Pareto frontier 점선 제거 (C3 채택, frontier claim 방지)
Marker 스타일 (C1 반영) - Multi-seed (n≥3): 채움 marker + errorbar (P1 a2b2: ±0.003 MSE, ±0.67 PAPE) - Single-seed (n=1): 빈(hollow) marker, errorbar 없음 - 13개 중 multi-seed 확정: P1(a2,b2)만. 나머지 12개 모두 single-seed. - Caption에 "Filled markers: n=3 mean±std. Hollow markers: n=1, single-seed observations. Statistical significance not established for hollow markers." 명시.
어노테이션 (톤다운, C1 반영) - R1b: "R1b: lowest PAPE (38.40%, n=1)" — "Best" 단어 회피, n=1 표기 필수 - B1: "B1: lowest MSE (0.505, n=1)" - 참고선 없음 (frontier 제거)
Background tinting - (a) Local/FL: 옅은 회색 - (b) NF: 옅은 보라 - (c) FM: 옅은 주황 - (d) overlay: 흰색
데이터 포인트: 본문 §3.1, §3.3 표 직접 사용 (값은 §6 CSV에서 로드)
저장: F1_pareto_by_family.{png,pdf}
F1b. MSE–PAPE Combined (Supplementary)¶
목적: 모든 모델을 단일 패널에 overlay하여 전체 분포를 한눈에 (보조용).
타입: single-panel scatter - 축/marker 스타일은 F1과 동일 규칙 (single-seed=hollow, multi-seed=filled+errorbar) - Frontier 점선 제거 (C3 일관성) - Family별 색상 구분만 유지
저장: F1b_pareto_combined_supp.{png,pdf}
F2. 가설 판정 Bar Chart [v1 유지]¶
목적: H6-1(FAIL), H6-2(PASS), H6-3a(FAIL), H6-3b(PASS) 4개 가설 판정의 비교 쌍 시각화.
타입: 2×2 grid of grouped bar charts - 패널 (a): H6-1 — B1(0.505) vs V1(0.579) — metric=MSE, 낮을수록 좋음 - 패널 (b): H6-2 — V1(49.77) vs P1(42.67) — metric=PAPE - 패널 (c): H6-3a — P1(42.67) vs R1(45.70) — metric=PAPE - 패널 (d): H6-3b — P1(42.67) vs R1b(38.40) — metric=PAPE
스타일 - PASS는 초록 테두리, FAIL은 빨강 테두리 - 막대 상단에 Δ 값 표시 + PASS/FAIL 뱃지 - (a)(b)(c)는 비교 baseline이 multi-seed이거나 단순 비교이므로 errorbar는 P1 막대에만 ±0.67(PAPE) 또는 ±0.003(MSE) 표기 (C1 일관성) - 단, 패널 (d)의 R1b는 single-seed임을 caption에 명시
저장: F2_hypothesis_verdict.{png,pdf}
F3. Beta Sweep Curve (alpha=2.0 고정) [v1 유지]¶
목적: beta=2.0이 sweet spot임을 dual-axis 라인으로 보여줌.
타입: line plot, dual y-axis - X축: beta ∈ {0.1, 0.5, 1.0, 2.0, 3.0, 4.0} (log scale) - Y축 좌: PAPE (%) — 빨강 선 + marker - Y축 우: MSE — 파랑 선 + marker - beta=2.0 위치에 수직 점선 + "sweet spot" 주석 - 모든 점은 single-seed → caption에 "n=1 per beta value" 명시
데이터 (§3.2)
| beta | MSE | PAPE |
|---|---|---|
| 0.1 | 0.579 | 52.83 |
| 0.5 | 0.562 | 46.68 |
| 1.0 | 0.543 | 45.48 |
| 2.0 | 0.543 | 42.67 |
| 3.0 | 0.542 | 45.31 |
| 4.0 | 0.540 | 43.34 |
저장: F3_beta_sweep.{png,pdf}
F4. Alpha Sweep Bar (beta=2.0 고정) [v1 유지]¶
목적: alpha 변화에 따른 MSE와 PAPE의 반응 비교.
타입: dual y-axis grouped bar - X축: alpha ∈ {2.0, 3.0, 5.0} - 좌 Y축: MSE bar, 우 Y축: PAPE bar - 패널 caption에 single-seed 명시
데이터 (§3.2)
| alpha | MSE | PAPE |
|---|---|---|
| 2.0 | 0.543 | 42.67 |
| 3.0 | 0.533 | 43.08 |
| 5.0 | 0.553 | 48.60 |
저장: F4_alpha_sweep.{png,pdf}
F5. 50-clients vs 5-clients 비교 [M3 반영]¶
목적: 스케일 효과 없음(오히려 악화)을 정직하게 제시.
타입: 3-panel side-by-side bar (MSE / PAPE / CB Util) - X축: {5 clients, 50 clients (EVAL 5), 50 clients (전체 50 평균)} - 각 metric별 패널
데이터 (§5)
| 설정 | MSE | PAPE | HR | CB Util |
|---|---|---|---|---|
| 5 clients (seed=42) | 0.543 | 42.67 | 27.8 | 3.8 |
| 50 clients (EVAL 5) | 0.541 | 47.22 | 25.2 | 3.1 |
| 50 clients (전체 50) | 0.575 | 47.78 | 23.2 | 3.6 |
주석 (M3 반영, 톤 보강) - 본문 주석: "PAPE worsens by 4.55%p with 10x clients" - Caption 명시: "n=1 per setting (single-seed observation). Replication needed to establish statistical significance, but consistent direction across all 3 metrics suggests structural rather than stochastic effect." - "전체 50 평균"은 50가구 PAPE의 단순 평균이며, 표준편차도 같이 표기 (가능 시 mlruns에서 추출)
저장: F5_scale_comparison.{png,pdf}
F6. PAPE Ranking Horizontal Bar [M2 반영, Supp 격하]¶
목적: 13개 모델의 PAPE 순위 한눈 비교 (발표 슬라이드/Supp 용도).
타입: horizontal bar, sorted ascending by PAPE - X축: PAPE (%) - Y축: 모델명 (family 포함: e.g., "R1b (FL-FeDPM)") - 색: family별 통일 (F1과 동일 팔레트) - 막대 끝에 PAPE 값 + params 크기 (annotation 확정 — v1 open question 폐기, M5 반영) - R1b 행 별표() 표시 + caption에 " single-seed" 명시
Params annotation 값 (M5 확정 스펙) - R1b: ~36K (DLinear residual 추가) — engineer가 src에서 정확값 산출 - P1/V1/R1: ~32K (FeDPM 본체) - B0 DLinear: 4.6K - B1 FedAvg: 4.6K - NHITS: ~1M, PatchTST: ~1M, TimesNet: ~1M, iTransformer: ~1M, TFT: ~2M (NeuralForecast 기본 설정) - TimeMoE-50M: 50M, Chronos-Bolt: 9M, Moirai-Small: 14M - 정확값은 engineer가 model state_dict에서 산출, 불가 시 ~ 표시
저장: F6_pape_ranking_supp.{png,pdf}
격하 사유: §3.4 표와 정보량 중복(M2). 본문에서는 표만 사용, supplementary와 발표용으로만 figure 유지.
F7. V1→P1→R1b Trajectory Plot [재설계, M1 반영]¶
목적: V1에서 R1b로 가면서 PAPE는 개선되지만 MSE는 악화되는 트레이드오프를 2D 경로로 명시. waterfall이 MSE 악화를 은닉하는 문제(M1) 해결.
타입: 2D trajectory plot (PAPE × MSE 평면) - X축: MSE (0.50 ~ 0.65) - Y축: PAPE (%) (37 ~ 51) - 3개 점: V1(0.579, 49.77) → P1(0.543, 42.67) → R1b(0.625, 38.40) - 점 간 연결: 화살표 (V1→P1, P1→R1b) - 각 화살표 옆 라벨: "ΔPAPE = -7.10%p, ΔMSE = -0.036" (V1→P1, 양쪽 모두 개선) - "ΔPAPE = -4.27%p, ΔMSE = +0.082" (P1→R1b, 트레이드오프) - 좌하단 방향(개선) 화살표 가이드 추가 - 이상점 표시: P1→R1b는 MSE 악화 영역으로 진입 → 빨강 trace, V1→P1은 둘 다 개선 → 초록 trace
Caption: "Trajectory of FeDPM improvements. V1→P1 improves both metrics (Pareto-dominant). P1→R1b trades MSE for PAPE (−4.27%p PAPE at +15% MSE cost). All points are single-seed except P1 (n=3, errorbar shown)."
저장: F7_trajectory.{png,pdf}
F8. Codebook Usage Histogram [신규, M4 반영, 조건부]¶
목적: §4.1 주장 ("codebook util 3~6%, 사용 코드 8~16개") 시각적 근거.
타입: bar histogram - X축: codebook entry index (0~255) - Y축: 사용 빈도 (%) - V1, P1(a2,b2), R1b 3개 모델 overlay (alpha=0.6) - 사용된 코드 수 명시 (annotation: "V1: 12 used / 256, P1: 8 used / 256, R1b: 11 used / 256")
데이터 출처: mlruns artifacts에서 codebook usage histogram 추출
- mlruns/142733964360019277/{V1_run}/artifacts/codebook_usage.npy 또는 유사 경로
- engineer 점검 액션 (M5 반영, open question 폐기): 본 figure 작성 전 mlruns에서 codebook usage artifact 존재 여부 확인. 존재 시 F8 생성, 부재 시 supplementary에서 F8 삭제하고 그 사실을 §6 표에 기록. (재학습 없이 codebook usage를 재추출하려면 best checkpoint 로드 + 검증셋 forward 1회 필요 — engineer 판단)
저장: F8_codebook_usage_supp.{png,pdf} (조건부)
F9. Learning Curve Sample [신규, M4 반영]¶
목적: V1 vs P1 vs R1b의 round별 val_mse 학습 곡선 비교.
타입: line plot - X축: round (0~30 또는 0~100) - Y축: val_mse - 3개 모델 overlay (V1, P1 a2b2, R1b) - 색상은 F1 family palette와 동일
데이터 출처: mlruns metrics
- mlruns/142733964360019277/442a27880da1406c8bc4bb362a8f39e4/metrics/val_mse (V1)
- mlruns/255994434787012778/1d5cb855ba6c4a85821bfdd5972f7c9c/metrics/val_mse (P1 best run)
- mlruns/628304840000878755/{R1b_best}/metrics/val_mse (R1b)
- 3개 run의 val_mse는 모두 step별 기록 확인됨 (§6 참조)
저장: F9_learning_curves_supp.{png,pdf}
F10. Client-level PAPE Distribution (50 clients) [신규, M4 반영, 조건부]¶
목적: 50-client 실험에서 가구별 PAPE 편차를 시각화. "전체 50 평균 47.78%" 단일 수치 뒤의 분산을 노출.
타입: strip plot + box overlay - X축: 설정 ({EVAL 5, 전체 50}) - Y축: PAPE (%) per client - 50개 점(전체 50) + 5개 점(EVAL 5) strip - box overlay로 median, IQR 표시
데이터 출처: mlruns에서 50-client run의 client별 evaluation metric 추출
- mlruns/255994434787012778/2376dd720744433db5b1b2fa09b00252/ (N=50 run, val_mse=0.278)
- 또는 70ceccb32ccb4d5cac8013c6f95c09f2
- per-client PAPE는 해당 run의 artifacts/ 디렉토리에서 검색
- engineer 점검 액션: per-client PAPE artifact 존재 여부 확인. 부재 시 F10 삭제 + §6 표에 기록.
저장: F10_client_pape_dist_supp.{png,pdf} (조건부)
4. 구현 가이드 (engineer 위임용)¶
4.1 디렉토리 및 파일 구조¶
outputs/figures/v6_0419_exp6/
├── F1_pareto_by_family.{png,pdf}
├── F1b_pareto_combined_supp.{png,pdf}
├── F2_hypothesis_verdict.{png,pdf}
├── F3_beta_sweep.{png,pdf}
├── F4_alpha_sweep.{png,pdf}
├── F5_scale_comparison.{png,pdf}
├── F6_pape_ranking_supp.{png,pdf}
├── F7_trajectory.{png,pdf}
├── F8_codebook_usage_supp.{png,pdf} # 조건부
├── F9_learning_curves_supp.{png,pdf}
├── F10_client_pape_dist_supp.{png,pdf} # 조건부
└── data/
├── exp6_results.csv # 13 모델 + sweep variants 정규화 테이블
├── exp6_run_id_map.csv # MLflow run_id ↔ 모델명 매핑
└── README.md # 데이터 출처 (보고서/mlruns) 명시
4.2 스크립트 위치 및 네이밍¶
- 빌드 스크립트:
experiments/federated/v6_0419_build_exp6_results_csv.py - mlflow.search_runs()로 식별 가능한 run 메트릭 추출
- 보고서 §3.1/§3.2/§3.3 직독 값과 cross-check (불일치 시 보고서 우선)
- PAPE는 mlruns에 미저장 → 보고서 직독 (§6에 명시)
- 산출물:
data/exp6_results.csv,data/exp6_run_id_map.csv - 시각화 스크립트:
experiments/federated/v6_0419_exp6_figures.py - 함수는 figure별로 분리:
make_fig1_pareto_by_family(),make_fig1b_pareto_combined(), ...make_fig10_client_pape() if __name__ == "__main__":에서 11개 함수 순차 호출- F8/F10은 조건부 try/except + 부재 시 skip + 로그 메시지
- 재학습 없음, MLflow 로깅 불필요
4.3 데이터 입력 방식¶
- 1차:
mlflow.search_runs(experiment_ids=[...])로 가능한 모든 metric/params 추출 →exp6_results.csv생성 - 2차: PAPE 등 mlruns 미저장 metric은
report/version6/lab-leader/v6_0415_exp6_final_report.md표에서 직독, CSV에 source 컬럼으로 출처 표기 (mlflow_run_id또는report_§3.1등) - 시각화 스크립트는 CSV만 읽음(보고서 하드코딩 금지)
4.4 공통 스타일¶
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="whitegrid", palette="deep", context="paper")
plt.rcParams.update({
"figure.dpi": 300,
"savefig.dpi": 300,
"font.family": "sans-serif",
"axes.labelsize": 11,
"axes.titlesize": 12,
"legend.fontsize": 9,
"xtick.labelsize": 9,
"ytick.labelsize": 9,
})
FAMILY_COLORS = {
"FL-FeDPM": "#C0392B",
"FL-FedAvg": "#2874A6",
"Local": "#229954",
"NF": "#7D3C98",
"FM": "#CA6F1E",
}
# Marker 정책 (C1)
def marker_for(n_seeds):
return "o" if n_seeds >= 3 else "o" # shape 동일, fill 차이로 구분
def fill_for(n_seeds):
return "full" if n_seeds >= 3 else "none" # multi-seed=채움, single-seed=빈
4.5 검증 체크리스트 (engineer 완료 후 확인)¶
- 모든 figure가 300dpi, png+pdf 2종 저장
- F1에서 4개 family subplot이 sharex/sharey로 같은 축 공유
- F1/F1b에서 single-seed marker는 hollow, multi-seed는 filled+errorbar
- F1/F1b에서 Pareto frontier 점선이 그려지지 않음 (C3 확인)
- F2에서 PASS/FAIL 색상 및 Δ 값이 보고서 §2와 일치
- F5에서 single-seed 한계가 caption에 명시
- F6에서 R1b 별표(*) + caption에 single-seed 명시
- F7이 trajectory plot으로 그려짐(waterfall 아님), 트레이드오프가 시각적으로 노출
- F8/F10 mlruns artifact 부재 시 skip + 로그에 기록
- 색상이 color-blind safe (Okabe-Ito 또는 seaborn deep)
- 모든 축 라벨에 단위 포함 (% 등)
-
data/exp6_results.csv+exp6_run_id_map.csv동시 산출
5. 제외한 그림(왜 안 뽑는가)¶
| 후보 | 제외 사유 |
|---|---|
| Pareto frontier overlay (단일 패널) | C3 반영 — family confounder로 frontier 비교 부당. F1/F1b 모두 frontier 점선 제거 |
| HR(Hit Rate) 별도 패널 | PAPE와 강상관, figure budget 절약. F5 metric 1개로 포함 |
| Per-round codebook usage 변화 | round별 codebook usage가 mlruns에 step-logging되어 있을 가능성 낮음 (engineer 확인 후 추가 가능) |
| FL communication cost (round × bytes) | 본 실험에서 측정 안 함, 별도 실험 필요 |
| Computational cost (training time) | round_time_sec 메트릭은 있으나 본 figure 스토리와 무관 |
6. MLflow Run ID 추적 테이블 [신규, C2 반영]¶
원칙: 13개 모델 + 주요 sweep variants의 MLflow run_id를 추적. PAPE는 mlruns에 미저장(별도 평가 스크립트 산출)이므로 val_mse만 mlruns에서 cross-check 가능. PAPE는 보고서 §3 직독.
| 모델 | MLflow Experiment | Run ID (best) | val_mse (mlruns) | PAPE 출처 | 비고 |
|---|---|---|---|---|---|
| V1 Vanilla FeDPM | FeDPM-Original-Phase1 (142733964360019277) | 442a27880da1406c8bc4bb362a8f39e4 |
beta=0.1 run | 보고서 §3.1 | 단일 run |
| P1 (a2,b2) | FeDPM-Original-Phase2 (255994434787012778) | 1d5cb855ba6c4a85821bfdd5972f7c9c (val_mse=0.3233, best) |
0.3233 | 보고서 §3.1 | 동일 설정 multi-run 8개 (3-seed 평균은 별도 집계) |
| P1 (a2,b2) seed reps | 위 experiment | 06192a9..., 158f869..., 2346b8c..., 367cdf8..., 760645e..., 7594a5e..., 8c629dd..., ace5a25... |
0.323~0.343 | — | seed 다양성 확인 |
| P1 (a3,b2) | 위 | d3973281b9404053903209a22ddb2556 |
0.331 | 보고서 §3.1 | MSE 최선 FeDPM |
| P1 (a5,b2) | 위 | 5abde705906f4013be39c20200ced281 |
0.342 | 보고서 §3.2 | alpha sweep |
| P1 (a2,b0.1) | 위 | 1de0602ebaf04f70b72e098e0457fd77, 4c3de1c23979411bae59b19372258438, 811d69ae4c074e1ab1505906a594a092, 8e9d93ff33494e819e821b21c0898b60, fcdca5f54acc4f5c85da8a2b986510c7 |
0.334~0.353 | 보고서 §3.2 | beta sweep (5 seed) |
| P1 (a2,b0.5) | 위 | 52a5a8bc78984471bae6aff895dd411a |
0.340 | 보고서 §3.2 | beta sweep |
| P1 (a2,b1.0) | 위 | 32f84436af4d4a43aeaafb6dbf919e54 |
0.341 | 보고서 §3.2 | beta sweep |
| P1 (a2,b3.0) | 위 | ace5a25f583f409cb50f63ca6acce86c |
0.338 | 보고서 §3.2 | beta sweep |
| P1 (a2,b4.0) | 위 | 658ff6753e4d4b9c8e1f922ad8055e6c |
0.333 | 보고서 §3.2 | beta sweep |
| P1 (a2,b100) MSE-equiv | 위 | 304dde536a2348a39f3382026b533699, 7594a5e2fdd3411ea4674029c26939f3, 8c629ddb1b38421eaf35e4a856c8d260 |
0.335~0.348 | 보고서 §3.1 | MSE 등가 검증 |
| R1 MLP Residual | FeDPM-Original-Phase3 (738959243774648182) | 7b0dbe7925da46ebb8397200fcdf07c9 |
(확인 필요) | 보고서 §3.1 | 단일 run |
| R1b DLinear Residual | FeDPM-Original-Phase3b (628304840000878755) | 3c32dc8591894d9eae3170f33a33368e, 5e0409718fd347d085190264e43d4284, b1e1b2177748456b9ffd78966025323c (3개 lr sweep) |
(확인 필요) | 보고서 §3.1 | best 1개 식별 필요 (engineer 액션) |
| N=50 (EVAL 5) | FeDPM-Original-Phase2 | 2376dd720744433db5b1b2fa09b00252, 70ceccb32ccb4d5cac8013c6f95c09f2 |
0.278, 0.294 | 보고서 §5 | 50-client 실험 |
| B0 Local DLinear | FedLearning-Phase2-local (432554167732390063) | 002d8d386fac4416b0bca6198ddc1e89, 35f50f22b77f403083d3ae8bc240e710 |
(확인 필요) | 보고서 §3.3 | runName=local_N20_R10 (가구별 평균?) |
| B1 FedAvg | FedLearning-Phase2-fedavg (828876380275857324) | 17aa519d8a64433a9129ae7f7b663c7d, 23fd36f2a0dc48048cf0c3717c2e51b6, 24850942d7a546dbabf8609266cc8ad2, cb9796b1869a489cb72122cb248ad96c |
(확인 필요) | 보고서 §3.3 | 4개 run 중 best 식별 필요 |
| NHITS, PatchTST, TimesNet, iTransformer, TFT | NF-Baseline (750970300919682198) | 가구별로 분리된 run 다수 (Apt6/15/30/51/88) + 408bd2cd650e46df89c475b76f2b23e6 (aggregate_mean) |
가구별 metric | 보고서 §3.3 | aggregate_mean run이 5가구 평균 → 이 run을 대표값으로 사용 권장 |
| TimeMoE-50M, Chronos-Bolt, Moirai-Small | TSFM-Baseline (968288576469157019) | b6c3c21735e44c5ca78309d6f2910a6a (complete), d59c11d902f541b8a8a8e37c8f14c071 |
(확인 필요, run 내부 모델별 metric 분리 여부 점검) | 보고서 §3.3 | zero-shot, 단일 run에 모든 FM 결과 포함 가능성 |
유실/불명 항목: 위 표의 "(확인 필요)" 항목은 engineer가 build 스크립트에서 mlruns 직접 접근으로 확인. 만약 매핑 불가능 시 exp6_run_id_map.csv에 run_id=UNKNOWN, source=report_§N 으로 기록하고 시각화 데이터는 보고서 직독 사용.
Codebook usage / per-client PAPE artifact (F8/F10용): 위 run들의 artifacts/ 폴더에서 검색해야 하며, 미저장이면 해당 figure는 skip.
7. 담당 및 후속 단계¶
- 구현 담당: engineer (본 v2 스펙 확정대로 작성 후 exp-expert 검수)
- 검수: exp-expert가 생성된 figure와 보고서 §번호 일치 여부 + critic 비평 반영 확인
- 최종 사용처:
- thesis-writer: 본문에 F1/F2/F3/F4/F5/F7 배치, supplementary에 F1b/F6/F8/F9/F10
- 발표 슬라이드: F6 (전체 모델 한 장 비교용)
- 재학습 필요 없음: 값은 모두 보고서 또는 mlruns 직독
8. 후속 작업 (별도 task)¶
본 시각화 작업과 분리되어 병렬 진행 가능. 시각화 작업의 선행 조건이 아님(시각화는 single-seed 명시로 valid).
| 작업 | 우선순위 | 담당 | 산출물 | 예상 시간 |
|---|---|---|---|---|
| R1b 3-seed 재실행 (C1 권고) | ★★ | exp-expert + engineer | R1b PAPE/MSE mean±std, F1·F2·F7 caption 업데이트 | 2~3시간 (학습 시간) |
| 50-clients 3-seed 재실행 (M3 권고) | ★ | exp-expert | F5 errorbar 추가 가능 | 5~6시간 (50가구 학습) |
| Codebook usage artifact 재추출 (F8 prereq) | ★ | engineer | best checkpoint forward로 codebook histogram 산출 | 30분 |
| Per-client PAPE artifact 추출 (F10 prereq) | ★ | engineer | 50-client run에서 client별 PAPE 산출 | 1시간 |
이번 시각화 전 선행 여부: 불필요. 시각화는 single-seed임을 명시한 채 valid하게 진행. 후속 task 완료 시 figure caption만 업데이트(데이터 갱신은 CSV 파일 1줄 수정으로 반영).
문서 끝. engineer는 본 v2 스펙에 따라 다음 두 스크립트를 작성:
1. experiments/federated/v6_0419_build_exp6_results_csv.py (데이터 빌드)
2. experiments/federated/v6_0419_exp6_figures.py (시각화)