Spaces:
Running
Running
Sync from GitHub Actions
Browse files- .claude/skills/verify/SKILL.md +0 -47
- AGENTS.md +0 -227
- CLAUDE.md +0 -297
- README_N-BEATS.md +0 -122
- requirements.txt +1 -1
.claude/skills/verify/SKILL.md
DELETED
|
@@ -1,47 +0,0 @@
|
|
| 1 |
-
---
|
| 2 |
-
name: verify
|
| 3 |
-
description: ์ด ์ ์ฅ์์ ๋ณ๊ฒฝ์ ์ค์ ๊ตฌ๋์ผ๋ก ๊ฒ์ฆํ๋ ๋ ์ํผ โ ๋ก์ปฌ ์๋ฒ ๊ธฐ๋, UI ๊ตฌ๋, API ํธ์ถ ๋ฐฉ๋ฒ
|
| 4 |
-
---
|
| 5 |
-
|
| 6 |
-
# nbeats ๊ฒ์ฆ ๋ ์ํผ
|
| 7 |
-
|
| 8 |
-
## ๋ก์ปฌ ์๋ฒ ๊ธฐ๋
|
| 9 |
-
|
| 10 |
-
๋ฐ๋์ `venv`๋ฅผ ์ฌ์ฉํ๋ค (`.venv`๋ ์์กด์ฑ ๋ถ์์ โ slowapi ์์, ์์คํ
anaconda python๋ ๋ง์ฐฌ๊ฐ์ง):
|
| 11 |
-
|
| 12 |
-
```bash
|
| 13 |
-
./venv/bin/python -m uvicorn main:app --port 8077 # ๋ถํ
20~40์ด (torch/darts ์ํฌํธ)
|
| 14 |
-
curl http://127.0.0.1:8077/health # {"status":"ok"} ๋๊ธฐ
|
| 15 |
-
```
|
| 16 |
-
|
| 17 |
-
macOS Apple Silicon์์ PyTorch+LightGBM OpenMP ์ถฉ๋ ๋ฐฉ์ด ์ฝ๋๊ฐ main.py์ ์ด๋ฏธ ์์ผ๋ฏ๋ก ๋ณ๋ env ๋ถํ์.
|
| 18 |
-
|
| 19 |
-
## ํ๋ฉด ๊ตฌ๋
|
| 20 |
-
|
| 21 |
-
- ํ์ด์ง: `/`, `/prophet`, `/arima`, `/xgboost`, `/ets`, `/lightgbm`, `/theta`, `/hybrid`, `/timesfm`
|
| 22 |
-
- ์์๋ธ API (ํ์ผ ์
๋ก๋ + horizon๋ง ๋ฐ์):
|
| 23 |
-
```bash
|
| 24 |
-
curl -X POST http://127.0.0.1:8077/api/hybrid/predict \
|
| 25 |
-
-F "file=@test_data/stable_trend.csv" -F "forecast_horizon=12"
|
| 26 |
-
```
|
| 27 |
-
- ํ
์คํธ ๋ฐ์ดํฐ: `test_data/stable_trend.csv` (์๋ณ 120ํ, ๋น ๋ฆ), `daily_high_freq.csv` (์ผ๋ณ 400ํ, ์คํธ๋ ์ค), `small_dataset.csv` (31ํ โ 50ํ ๋ฏธ๋ง ๊ฒ์ฆ ์๋ฌ ํ์ธ์ฉ)
|
| 28 |
-
- ์์๋ธ ์์: ์๋ณ 120ํ ๊ธฐ์ค ๋ก์ปฌ ์์ญ ์ด, HF Space 26์ด / ์ผ๋ณ 400ํ์ HF Space 103์ด
|
| 29 |
-
|
| 30 |
-
## ๋ธ๋ผ์ฐ์ ํ์ผ ์
๋ก๋ (claude-in-chrome)
|
| 31 |
-
|
| 32 |
-
file_upload ๋๊ตฌ๊ฐ ํธ์คํธ ๊ฒฝ๋ก๋ฅผ ๊ฑฐ๋ถํ๋ฏ๋ก javascript_tool๋ก ์ฃผ์
:
|
| 33 |
-
|
| 34 |
-
```js
|
| 35 |
-
const f = new File([csvText], 'x.csv', {type:'text/csv'});
|
| 36 |
-
const dt = new DataTransfer(); dt.items.add(f);
|
| 37 |
-
const input = document.getElementById('fileInput');
|
| 38 |
-
input.files = dt.files;
|
| 39 |
-
input.dispatchEvent(new Event('change', {bubbles:true}));
|
| 40 |
-
```
|
| 41 |
-
|
| 42 |
-
## ๋ผ์ด๋ธ Space ํ์ธ
|
| 43 |
-
|
| 44 |
-
```bash
|
| 45 |
-
curl https://psnc-time-series-prediction.hf.space/health # {"status":"ok"}
|
| 46 |
-
curl https://psnc-time-series-prediction.hf.space/api/timesfm/status # {"status":"loaded"}
|
| 47 |
-
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AGENTS.md
DELETED
|
@@ -1,227 +0,0 @@
|
|
| 1 |
-
# AGENTS.md โ N-BEATS Time Series Forecasting Service
|
| 2 |
-
|
| 3 |
-
## ํ๋ก์ ํธ ๊ฐ์
|
| 4 |
-
|
| 5 |
-
FastAPI ๊ธฐ๋ฐ ์๊ณ์ด ์์ธก ์๋น์ค. 7๊ฐ์ง ์์ธก ๋ชจ๋ธ์ ์น UI์ REST API๋ก ์ ๊ณตํ๋ฉฐ, Hugging Face Spaces์ Docker ์ปจํ
์ด๋๋ก ๋ฐฐํฌ๋๋ค.
|
| 6 |
-
|
| 7 |
-
- **์๋น์ค URL:** https://huggingface.co/spaces/psnc/time-series-prediction
|
| 8 |
-
- **๋ผ์ด์ ์ค:** MIT License
|
| 9 |
-
|
| 10 |
-
---
|
| 11 |
-
|
| 12 |
-
## ๊ธฐ์ ์คํ
|
| 13 |
-
|
| 14 |
-
| ๋ ์ด์ด | ๊ธฐ์ |
|
| 15 |
-
|--------|------|
|
| 16 |
-
| Web Framework | FastAPI + Uvicorn (ASGI) |
|
| 17 |
-
| Deep Learning | Darts (N-BEATS), PyTorch, PyTorch Lightning |
|
| 18 |
-
| Statistical | statsmodels (ARIMA, ETS, Theta), Prophet |
|
| 19 |
-
| ML | XGBoost, LightGBM |
|
| 20 |
-
| Data | pandas, numpy |
|
| 21 |
-
| Frontend | Vanilla JS, Chart.js, XLSX.js (๋คํฌ ํ
๋ง) |
|
| 22 |
-
| Deploy | Docker โ Hugging Face Spaces via GitHub Actions |
|
| 23 |
-
|
| 24 |
-
---
|
| 25 |
-
|
| 26 |
-
## ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
|
| 27 |
-
|
| 28 |
-
```
|
| 29 |
-
nbeats/
|
| 30 |
-
โโโ main.py # FastAPI ์ฑ, ๋ชจ๋ ๋ผ์ฐํธ ์ ์ (782์ค)
|
| 31 |
-
โโโ requirements.txt
|
| 32 |
-
โโโ Dockerfile # HF Spaces ๋ฐฐํฌ์ฉ (port 7860)
|
| 33 |
-
โโโ run.sh # ๊ฐ๋ฐ ์๋ฒ (--reload)
|
| 34 |
-
โโโ start.sh # ํ๋ก๋์
์๋ฒ
|
| 35 |
-
โโโ run_test.py # ์๋น์ค ์ง์ ํ
์คํธ
|
| 36 |
-
โโโ .github/workflows/deploy.yml # main push โ HF ์๋ ๋ฐฐํฌ
|
| 37 |
-
โโโ src/domains/time_series_prediction/
|
| 38 |
-
โ โโโ data_service.py # ํ์ผ ํ์ฑ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
|
| 39 |
-
โ โโโ data_profile.py # ๊ณตํต ๋ฐ์ดํฐ ๋ถ์ (DataProfile ๋ฐ์ดํฐํด๋์ค)
|
| 40 |
-
โ โโโ model_parameters.py # N-BEATS ํ๋ผ๋ฏธํฐ ์คํค๋ง
|
| 41 |
-
โ โโโ nbeats_service.py # N-BEATS ๊ตฌํ (575์ค)
|
| 42 |
-
โ โโโ prophet_service.py # Prophet ๊ตฌํ (412์ค)
|
| 43 |
-
โ โโโ arima_service.py # ARIMA/SARIMA ๊ตฌํ (516์ค)
|
| 44 |
-
โ โโโ xgboost_service.py # XGBoost ๊ตฌํ (557์ค)
|
| 45 |
-
โ โโโ ets_service.py # ETS/Holt-Winters ๊ตฌํ (315์ค)
|
| 46 |
-
โ โโโ lightgbm_service.py # LightGBM ๊ตฌํ (506์ค)
|
| 47 |
-
โ โโโ theta_service.py # Theta Method ๊ตฌํ (302์ค)
|
| 48 |
-
โโโ static/
|
| 49 |
-
โ โโโ index.html # N-BEATS UI
|
| 50 |
-
โ โโโ prophet.html
|
| 51 |
-
โ โโโ arima.html
|
| 52 |
-
โ โโโ xgboost.html
|
| 53 |
-
โ โโโ ets.html
|
| 54 |
-
โ โโโ lightgbm.html
|
| 55 |
-
โ โโโ theta.html
|
| 56 |
-
โโโ test_data/ # ํ
์คํธ์ฉ CSV ๋ฐ์ดํฐ์
|
| 57 |
-
โโโ tests/
|
| 58 |
-
โ โโโ test_nbeats.py
|
| 59 |
-
โ โโโ test_auto_scaling.py
|
| 60 |
-
โ โโโ generate_test_datasets.py
|
| 61 |
-
โโโ backend/ # ๋ ๊ฑฐ์ ์ฝ๋ (๋ณด๊ด์ฉ)
|
| 62 |
-
```
|
| 63 |
-
|
| 64 |
-
---
|
| 65 |
-
|
| 66 |
-
## ๊ตฌํ๋ ๋ชจ๋ธ
|
| 67 |
-
|
| 68 |
-
| ๋ชจ๋ธ | ์ ํ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ํน์ง |
|
| 69 |
-
|------|------|-----------|------|
|
| 70 |
-
| **N-BEATS** | ๋ฅ๋ฌ๋ | Darts + PyTorch | ์คํ ๊ธฐ๋ฐ ์ ๊ฒฝ๋ง, ์์๋ธ |
|
| 71 |
-
| **Prophet** | ๋ฒ ์ด์ง์ | Meta/Facebook | ์ถ์ธ ๋ณํ์ ์๋ ๊ฐ์ง, ์ ๋ขฐ๊ตฌ๊ฐ |
|
| 72 |
-
| **ARIMA/SARIMA** | ํต๊ณ | statsmodels | AIC ๊ธฐ๋ฐ ์๋ ์ฐจ์ ์ ํ |
|
| 73 |
-
| **XGBoost** | ๊ทธ๋๋์ธํธ ๋ถ์คํ
| xgboost | ๋๊ทธ ํผ์ฒ, ๋กค๋ง ํต๊ณ |
|
| 74 |
-
| **LightGBM** | ๊ทธ๋๋์ธํธ ๋ถ์คํ
| lightgbm | Leaf-wise ๋ถํ , XGBoost ๋๋น 2-5๋ฐฐ ๋น ๋ฆ |
|
| 75 |
-
| **ETS** | ์ง์ํํ | statsmodels | Holt-Winters, ๊ฐ์ ์ถ์ธ |
|
| 76 |
-
| **Theta** | ๊ณ ์ ํต๊ณ | statsmodels | M3 ๋ํ ์ฐ์น ์๊ณ ๋ฆฌ์ฆ |
|
| 77 |
-
|
| 78 |
-
---
|
| 79 |
-
|
| 80 |
-
## API ๊ตฌ์กฐ
|
| 81 |
-
|
| 82 |
-
### ๊ณตํต ํจํด
|
| 83 |
-
|
| 84 |
-
- **Page Routes:** `GET /`, `/prophet`, `/arima`, `/xgboost`, `/ets`, `/lightgbm`, `/theta`
|
| 85 |
-
- **Health:** `GET /health`, `GET /api/status`
|
| 86 |
-
- **Template:** `GET /download_template?file_format=csv|xlsx|json`
|
| 87 |
-
|
| 88 |
-
### ๋ชจ๋ธ๋ณ ์๋ํฌ์ธํธ
|
| 89 |
-
|
| 90 |
-
```
|
| 91 |
-
POST /nbeats โ N-BEATS ์์ธก (๋ฐฑํ
์คํธ ์ต์
)
|
| 92 |
-
GET /nbeats/parameters โ ํ๋ผ๋ฏธํฐ ์คํค๋ง
|
| 93 |
-
POST /nbeats/evaluate โ ํ๋ จ/ํ
์คํธ ๋ถ๋ฆฌ ํ๊ฐ
|
| 94 |
-
|
| 95 |
-
POST /api/{prophet,arima,xgboost,ets,lightgbm,theta}/predict
|
| 96 |
-
```
|
| 97 |
-
|
| 98 |
-
### ๊ณตํต ์๋ต ํ์
|
| 99 |
-
|
| 100 |
-
```json
|
| 101 |
-
{
|
| 102 |
-
"success": true,
|
| 103 |
-
"data": [{"ds": "2024-01-01", "y": 100.0, "yhat": 102.5}],
|
| 104 |
-
"metrics": {"mae": 2.1, "rmse": 3.4, "mape": 0.021, "r2": 0.95},
|
| 105 |
-
"test_size": 30
|
| 106 |
-
}
|
| 107 |
-
```
|
| 108 |
-
|
| 109 |
-
---
|
| 110 |
-
|
| 111 |
-
## ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
|
| 112 |
-
|
| 113 |
-
### ์
๋ ฅ ํฌ๋งท
|
| 114 |
-
- **์ง์:** CSV, Excel (.xlsx), JSON
|
| 115 |
-
- **ํ์ ์ปฌ๋ผ:** `date`(๋๋ `ds`) + `value`/`target`(๋๋ `y`)
|
| 116 |
-
- **์ต์ ๋ฐ์ดํฐ ํฌ์ธํธ:** 50๊ฐ
|
| 117 |
-
|
| 118 |
-
### DataProfile (data_profile.py)
|
| 119 |
-
์๋ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๋ฐ์ดํฐํด๋์ค. ๋ชจ๋ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ์๋ ์กฐ์ ์ ์ฌ์ฉ๋๋ค.
|
| 120 |
-
|
| 121 |
-
```python
|
| 122 |
-
@dataclass
|
| 123 |
-
class DataProfile:
|
| 124 |
-
n_samples: int
|
| 125 |
-
freq: str # 'D', 'W', 'MS', 'QS', 'YS' ๋ฑ
|
| 126 |
-
seasonal_period: int
|
| 127 |
-
break_index: int # ๊ตฌ์กฐ์ ๋ณํ์ ์ธ๋ฑ์ค (-1์ด๋ฉด ์์)
|
| 128 |
-
volatility: float # ๋ณ๋์ฑ ์ง์
|
| 129 |
-
trend_type: str # 'stable', 'gradual', 'sudden'
|
| 130 |
-
seasonality_mode: str # 'additive', 'multiplicative'
|
| 131 |
-
```
|
| 132 |
-
|
| 133 |
-
### ์๋ ํ๋ผ๋ฏธํฐ ์กฐ์ (Auto-Tuning)
|
| 134 |
-
๋ชจ๋ ๋ชจ๋ธ์ `DataProfile`์ ๊ธฐ๋ฐํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์กฐ์ ํ๋ค:
|
| 135 |
-
- **์ฃผํ์ ๊ฐ์ง** โ ๊ณ์ ์ฃผ๊ธฐ ์๋ ์ค์
|
| 136 |
-
- **๊ตฌ์กฐ์ ๋ณํ์ ๊ฐ์ง** (CUSUM) โ ์ต๊ทผ ๋ฐ์ดํฐ๋ง ํ์ต ์ต์
|
| 137 |
-
- **์ด์๊ฐ ๊ฐ์ง** (IQR 2.5๋ฐฐ) โ ์ ์ฒ๋ฆฌ ์ ์ฉ
|
| 138 |
-
- **๊ณ์ ์ฑ ๋ชจ๋** (๋ณ๋๊ณ์ ๋น๊ต) โ additive/multiplicative ์ ํ
|
| 139 |
-
|
| 140 |
-
---
|
| 141 |
-
|
| 142 |
-
## ์๋น์ค ๋ ์ด์ด ๊ท์น
|
| 143 |
-
|
| 144 |
-
์ ๋ชจ๋ธ ์ถ๊ฐ ์ `{model}_service.py`์ ๋ค์ 4๊ฐ ํจ์๋ฅผ ๊ตฌํํ๋ค:
|
| 145 |
-
|
| 146 |
-
```python
|
| 147 |
-
def apply_defaults(params: dict) -> dict:
|
| 148 |
-
"""ํ๋ผ๋ฏธํฐ ๊ธฐ๋ณธ๊ฐ ๋ณํฉ"""
|
| 149 |
-
|
| 150 |
-
def get_parameters() -> dict:
|
| 151 |
-
"""ํ๋ผ๋ฏธํฐ ์คํค๋ง ๋ฐํ (UI ๋ ๋๋ง์ฉ)"""
|
| 152 |
-
|
| 153 |
-
def predict_with_{model}(df: pd.DataFrame, params: dict) -> dict:
|
| 154 |
-
"""์์ธก ์คํ โ {"success", "data", "metrics"} ๋ฐํ"""
|
| 155 |
-
|
| 156 |
-
def evaluate_with_{model}(df: pd.DataFrame, params: dict) -> dict:
|
| 157 |
-
"""๋ฐฑํ
์คํธ ํ๊ฐ"""
|
| 158 |
-
```
|
| 159 |
-
|
| 160 |
-
---
|
| 161 |
-
|
| 162 |
-
## ๋ฐฐํฌ
|
| 163 |
-
|
| 164 |
-
### ๋ก์ปฌ ์คํ
|
| 165 |
-
|
| 166 |
-
```bash
|
| 167 |
-
# ๊ฐ๋ฐ (์๋ ๋ฆฌ๋ก๋)
|
| 168 |
-
bash run.sh
|
| 169 |
-
# ๋๋
|
| 170 |
-
uvicorn main:app --reload --port 8000
|
| 171 |
-
|
| 172 |
-
# ํ๋ก๋์
ํ
์คํธ
|
| 173 |
-
bash start.sh
|
| 174 |
-
```
|
| 175 |
-
|
| 176 |
-
### GitHub Actions โ Hugging Face ์๋ ๋ฐฐํฌ
|
| 177 |
-
|
| 178 |
-
`main` ๋ธ๋์น์ pushํ๋ฉด `.github/workflows/deploy.yml`์ด ์คํ๋์ด HF Spaces๋ก force pushํ๋ค.
|
| 179 |
-
|
| 180 |
-
- **ํ์ Secret:** `HF_TOKEN` (GitHub Settings์ ๋ฑ๋ก)
|
| 181 |
-
- **HF Port:** 7860 (Dockerfile์ ๋ช
์๋จ)
|
| 182 |
-
- **HF User:** psnc
|
| 183 |
-
|
| 184 |
-
### Docker
|
| 185 |
-
|
| 186 |
-
```dockerfile
|
| 187 |
-
FROM python:3.10-slim
|
| 188 |
-
# ๋น๋ ๋๊ตฌ ํ์: gcc, g++, build-essential (Prophet, statsmodels ์ปดํ์ผ)
|
| 189 |
-
# ๋นroot ์คํ: appuser (UID 1000)
|
| 190 |
-
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
| 191 |
-
```
|
| 192 |
-
|
| 193 |
-
---
|
| 194 |
-
|
| 195 |
-
## ํ
์คํธ
|
| 196 |
-
|
| 197 |
-
```bash
|
| 198 |
-
# ๋จ์ ํ
์คํธ
|
| 199 |
-
python -m pytest tests/
|
| 200 |
-
|
| 201 |
-
# ์๋น์ค ์ง์ ํ
์คํธ (API ์์ด)
|
| 202 |
-
python run_test.py
|
| 203 |
-
```
|
| 204 |
-
|
| 205 |
-
**์ฃผ์ ํ
์คํธ ํ์ผ:**
|
| 206 |
-
- `tests/test_nbeats.py` โ N-BEATS ์์ธก ์ ํ๋
|
| 207 |
-
- `tests/test_auto_scaling.py` โ ์๋ ํ๋ผ๋ฏธํฐ ์กฐ์ ๊ฒ์ฆ (MASE < 2.0 ๊ธฐ๋๊ฐ)
|
| 208 |
-
|
| 209 |
-
---
|
| 210 |
-
|
| 211 |
-
## ์ฝ๋ฉ ์ปจ๋ฒค์
|
| 212 |
-
|
| 213 |
-
- **์ธ์ด:** Python 3.10+
|
| 214 |
-
- **๋ค์ด๋ฐ:** ํด๋์ค CamelCase, ํจ์/๋ณ์ snake_case
|
| 215 |
-
- **์ฃผ์/๋
์คํธ๋ง:** ํ๊ตญ์ด
|
| 216 |
-
- **์๋ฌ ์ฒ๋ฆฌ:** `HTTPException` + `logging` (INFO ๋ ๋ฒจ)
|
| 217 |
-
- **ํ์
ํํธ:** ์ผ๋ถ ํจ์๋ ๋๋ฝ (๊ธฐ์กด ์ฝ๋ ์์ ์ ๊ฐ์ ์ถ๊ฐ ๋ถํ์)
|
| 218 |
-
- **๋ฐฐ์น ํฌ๊ธฐ:** N-BEATS๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ํด ์ต๋ 32๋ก ์ ํ
|
| 219 |
-
|
| 220 |
-
---
|
| 221 |
-
|
| 222 |
-
## ์ฃผ์์ฌํญ
|
| 223 |
-
|
| 224 |
-
- N-BEATS๋ ํฌ์ธํธ ์์ธก๋ง ์ ๊ณต (์ ๋ขฐ๊ตฌ๊ฐ ์์). ๊ตฌ๊ฐ ์์ธก์ด ํ์ํ๋ฉด Prophet ๋๋ ARIMA ์ฌ์ฉ ๊ถ์ฅ.
|
| 225 |
-
- XGBoost/LightGBM์ Direct Multi-Step ๋ฐฉ์ ์ฌ์ฉ (๊ฐ ์์ธก ์คํ
๋ณ ๋ณ๋ ๋ชจ๋ธ๋ก ์ค์ฐจ ๋์ ๋ฐฉ์ง).
|
| 226 |
-
- HF Spaces ์ฌ๋ฐฐํฌ๋ Docker ๋น๋๋ฅผ ํฌํจํ๋ฏ๋ก ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค.
|
| 227 |
-
- `backend/` ๋๋ ํฐ๋ฆฌ๋ ๋ ๊ฑฐ์ ์ฝ๋๋ก ์ค์ ์๋น์ค์ ์ฌ์ฉ๋์ง ์๋๋ค.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CLAUDE.md
DELETED
|
@@ -1,297 +0,0 @@
|
|
| 1 |
-
# CLAUDE.md โ N-BEATS Time Series Forecasting Service
|
| 2 |
-
|
| 3 |
-
## ํ๋ก์ ํธ ๊ฐ์
|
| 4 |
-
|
| 5 |
-
FastAPI ๊ธฐ๋ฐ ์๊ณ์ด ์์ธก ์๋น์ค. 7๊ฐ ๋จ์ผ ๋ชจ๋ธ + TimesFM ํ์ด๋ฐ์ด์
๋ชจ๋ธ + ํ์ด๋ธ๋ฆฌ๋ ์์๋ธ์ ์น UI์ REST API๋ก ์ ๊ณตํ๋ฉฐ, Hugging Face Spaces์ Docker ์ปจํ
์ด๋๋ก ๋ฐฐํฌ๋๋ค. TimesFM ์ ์ฉ Next.js ํ๋ก ํธ์๋๋ Vercel์ ๋ณ๋ ๋ฐฐํฌ๋๋ค.
|
| 6 |
-
|
| 7 |
-
- **์๋น์ค URL:** https://huggingface.co/spaces/psnc/time-series-prediction
|
| 8 |
-
- **์ง์ ์ ๊ทผ:** https://psnc-time-series-prediction.hf.space
|
| 9 |
-
- **๋ผ์ด์ ์ค:** MIT License
|
| 10 |
-
|
| 11 |
-
---
|
| 12 |
-
|
| 13 |
-
## ๊ธฐ์ ์คํ
|
| 14 |
-
|
| 15 |
-
| ๋ ์ด์ด | ๊ธฐ์ |
|
| 16 |
-
|--------|------|
|
| 17 |
-
| Web Framework | FastAPI + Uvicorn (ASGI) |
|
| 18 |
-
| Deep Learning | Darts (N-BEATS), PyTorch (CPU ์ ์ฉ ํ ), PyTorch Lightning |
|
| 19 |
-
| Foundation Model | TimesFM 2.5 200M (Google, GitHub ์์ค ํ ์ค์น) |
|
| 20 |
-
| Statistical | statsmodels (ARIMA, ETS, Theta), Prophet |
|
| 21 |
-
| ML | XGBoost, LightGBM |
|
| 22 |
-
| Data | pandas, numpy |
|
| 23 |
-
| Frontend | Vanilla JS, Chart.js, XLSX.js (๋คํฌ ํ
๋ง) / TimesFM ์ ์ฉ: Next.js |
|
| 24 |
-
| Deploy | Docker โ HF Spaces + Next.js โ Vercel (GitHub Actions) |
|
| 25 |
-
|
| 26 |
-
---
|
| 27 |
-
|
| 28 |
-
## ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ
|
| 29 |
-
|
| 30 |
-
```
|
| 31 |
-
nbeats/
|
| 32 |
-
โโโ main.py # FastAPI ์ฑ, ๋ชจ๋ ๋ผ์ฐํธ ์ ์ (638์ค)
|
| 33 |
-
โโโ requirements.txt # ์ ์์กด์ฑ ๋ฒ์ ๊ณ ์ (+cpu torch)
|
| 34 |
-
โโโ Dockerfile # HF Spaces ๋ฐฐํฌ์ฉ (port 7860)
|
| 35 |
-
โโโ run.sh # ๊ฐ๋ฐ ์๋ฒ (--reload, port 8000)
|
| 36 |
-
โโโ start.sh # ํ๋ก๋์
์๋ฒ
|
| 37 |
-
โโโ run_test.py # ์๋น์ค ์ง์ ํ
์คํธ
|
| 38 |
-
โโโ .github/workflows/deploy.yml # main push โ HF + Vercel ์๋ ๋ฐฐํฌ
|
| 39 |
-
โโโ .claude/skills/verify/ # ๊ฒ์ฆ ๋ ์ํผ (๋ก์ปฌ ๊ธฐ๋ยทUI ๊ตฌ๋ ๋ฐฉ๋ฒ)
|
| 40 |
-
โโโ src/domains/time_series_prediction/
|
| 41 |
-
โ โโโ data_service.py # ํ์ผ ํ์ฑ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
|
| 42 |
-
โ โโโ data_profile.py # ๊ณตํต ๋ฐ์ดํฐ ๋ถ์ (DataProfile ๋ฐ์ดํฐํด๋์ค)
|
| 43 |
-
โ โโโ model_parameters.py # N-BEATS ํ๋ผ๋ฏธํฐ ์คํค๋ง
|
| 44 |
-
โ โโโ nbeats_service.py # N-BEATS ๊ตฌํ
|
| 45 |
-
โ โโโ prophet_service.py # Prophet ๊ตฌํ
|
| 46 |
-
โ โโโ arima_service.py # ARIMA/SARIMA ๊ตฌํ
|
| 47 |
-
โ โโโ xgboost_service.py # XGBoost ๊ตฌํ
|
| 48 |
-
โ โโโ ets_service.py # ETS/Holt-Winters ๊ตฌํ
|
| 49 |
-
โ โโโ lightgbm_service.py # LightGBM ๊ตฌํ
|
| 50 |
-
โ โโโ theta_service.py # Theta Method ๊ตฌํ
|
| 51 |
-
โ โโโ ensemble_service.py # 7๋ชจ๋ธ ๋น๋๊ธฐ ์์๋ธ ์ค์ผ์คํธ๋ ์ดํฐ
|
| 52 |
-
โ โโโ timesfm_service.py # TimesFM 2.5 (์ฑ๊ธํค ๋ก๋)
|
| 53 |
-
โโโ static/ # ๋ชจ๋ธ๋ณ UI (index=N-BEATS, prophet, arima,
|
| 54 |
-
โ โ # xgboost, ets, lightgbm, theta,
|
| 55 |
-
โ โโโ hybrid.html # ํ์ด๋ธ๋ฆฌ๋ ์์๋ธ, timesfm)
|
| 56 |
-
โ โโโ nav.js # ๊ณต์ ๋ชจ๋ธ ๋๋กญ๋ค์ด ๋ด๋น (๋ชจ๋ธ ์ถ๊ฐ ์ MODELS ๋ฐฐ์ด๋ง ์์ )
|
| 57 |
-
โ โโโ ...
|
| 58 |
-
โโโ timesfm-frontend/ # TimesFM ์ ์ฉ Next.js ์ฑ (Vercel ๋ฐฐํฌ)
|
| 59 |
-
โโโ test_data/ # ํ
์คํธ์ฉ CSV ๋ฐ์ดํฐ์
|
| 60 |
-
โโโ tests/ # ์ ์ฒด pytest ํธํ (92๊ฐ, CI ๋ฐฐํฌ ๊ฒ์ดํธ๋ก ์คํ)
|
| 61 |
-
โ โโโ test_nbeats.py
|
| 62 |
-
โ โโโ test_auto_scaling.py
|
| 63 |
-
โ โโโ test_hybrid.py # ์์๋ธ ๊ฐ์ค์นยท์ง๊ณ ๋จ์ ํ
์คํธ
|
| 64 |
-
โ โโโ test_api_contract.py # API ์๋ต ํ์ยท์๋ฌ ์ฝ๋ ๊ณ์ฝ
|
| 65 |
-
โ โโโ test_nonblocking_endpoints.py
|
| 66 |
-
โ โโโ test_timesfm_horizon.py
|
| 67 |
-
โ โโโ test_ensemble_concurrency.py
|
| 68 |
-
โ โโโ test_data_service.py
|
| 69 |
-
โ โโโ test_supply_chain_hardening.py
|
| 70 |
-
โ โโโ generate_test_datasets.py
|
| 71 |
-
โโโ backend/ # ๋ ๊ฑฐ์ ์ฝ๋ (๋ณด๊ด์ฉ)
|
| 72 |
-
```
|
| 73 |
-
|
| 74 |
-
---
|
| 75 |
-
|
| 76 |
-
## ๊ตฌํ๋ ๋ชจ๋ธ
|
| 77 |
-
|
| 78 |
-
| ๋ชจ๋ธ | ์ ํ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ํน์ง |
|
| 79 |
-
|------|------|-----------|------|
|
| 80 |
-
| **N-BEATS** | ๋ฅ๋ฌ๋ | Darts + PyTorch | ์คํ ๊ธฐ๋ฐ ์ ๊ฒฝ๋ง, ์์๋ธ |
|
| 81 |
-
| **Prophet** | ๋ฒ ์ด์ง์ | Meta/Facebook | ์ถ์ธ ๋ณํ์ ์๋ ๊ฐ์ง, ์ ๋ขฐ๊ตฌ๊ฐ |
|
| 82 |
-
| **ARIMA/SARIMA** | ํต๊ณ | statsmodels | AIC ๊ธฐ๋ฐ ์๋ ์ฐจ์ ์ ํ |
|
| 83 |
-
| **XGBoost** | ๊ทธ๋๋์ธํธ ๋ถ์คํ
| xgboost | ๋๊ทธ ํผ์ฒ, ๋กค๋ง ํต๊ณ |
|
| 84 |
-
| **LightGBM** | ๊ทธ๋๋์ธํธ ๋ถ์คํ
| lightgbm | Leaf-wise ๋ถํ , XGBoost ๋๋น 2-5๋ฐฐ ๋น ๋ฆ |
|
| 85 |
-
| **ETS** | ์ง์ํํ | statsmodels | Holt-Winters, ๊ฐ์ ์ถ์ธ |
|
| 86 |
-
| **Theta** | ๊ณ ์ ํต๊ณ | statsmodels | M3 ๋ํ ์ฐ์น ์๊ณ ๋ฆฌ์ฆ |
|
| 87 |
-
| **TimesFM 2.5** | ํ์ด๋ฐ์ด์
๋ชจ๋ธ | Google (200M) | ์ ๋ก์ท ์์ธก, ๋ถ์์ ์ ๋ขฐ๊ตฌ๊ฐ, ์์ฒญ๋ณ ํ์ต ๋ถํ์ |
|
| 88 |
-
| **ํ์ด๋ธ๋ฆฌ๋ ์์๋ธ** | ๋ฉํ | ensemble_service | ์ 7๊ฐ ๋จ์ผ ๋ชจ๋ธ์ DataProfile ๊ธฐ๋ฐ ๊ฐ์ค ํ๊ท |
|
| 89 |
-
|
| 90 |
-
---
|
| 91 |
-
|
| 92 |
-
## API ๊ตฌ์กฐ
|
| 93 |
-
|
| 94 |
-
### ๊ณตํต ํจํด
|
| 95 |
-
|
| 96 |
-
- **Page Routes:** `GET /`, `/prophet`, `/arima`, `/xgboost`, `/ets`, `/lightgbm`, `/theta`, `/hybrid`, `/timesfm`
|
| 97 |
-
- **Health:** `GET /health`, `GET /api/status`
|
| 98 |
-
- **Template:** `GET /download_template?file_format=csv|xlsx|json`
|
| 99 |
-
|
| 100 |
-
### ๋ชจ๋ธ๋ณ ์๋ํฌ์ธํธ
|
| 101 |
-
|
| 102 |
-
```
|
| 103 |
-
POST /nbeats โ N-BEATS ์์ธก (๋ฐฑํ
์คํธ ์ต์
)
|
| 104 |
-
GET /nbeats/parameters โ ํ๋ผ๋ฏธํฐ ์คํค๋ง
|
| 105 |
-
POST /nbeats/evaluate โ ํ๋ จ/ํ
์คํธ ๋ถ๋ฆฌ ํ๊ฐ
|
| 106 |
-
|
| 107 |
-
POST /api/{prophet,arima,xgboost,ets,lightgbm,theta}/predict
|
| 108 |
-
GET /api/{prophet,arima,xgboost,ets,lightgbm,theta}/parameters
|
| 109 |
-
|
| 110 |
-
POST /api/hybrid/predict โ 7๋ชจ๋ธ ์์๋ธ (file + forecast_horizon(1~500) + model_weights(JSON, ์ ํ))
|
| 111 |
-
GET /api/timesfm/status โ TimesFM ๋ก๋ฉ ์ํ (not_loaded|loading|loaded|error)
|
| 112 |
-
POST /api/timesfm/predict โ TimesFM ์ ๋ก์ท ์์ธก
|
| 113 |
-
```
|
| 114 |
-
|
| 115 |
-
### ๊ณตํต ์๋ต ํ์ (๋จ์ผ ๋ชจ๋ธ)
|
| 116 |
-
|
| 117 |
-
```json
|
| 118 |
-
{
|
| 119 |
-
"success": true,
|
| 120 |
-
"data": [{"ds": "2024-01-01", "y": 100.0, "yhat": 102.5}],
|
| 121 |
-
"metrics": {"mae": 2.1, "rmse": 3.4, "mape": 0.021, "r2": 0.95},
|
| 122 |
-
"test_size": 30
|
| 123 |
-
}
|
| 124 |
-
```
|
| 125 |
-
|
| 126 |
-
### ํ์ด๋ธ๋ฆฌ๋ ์์๋ธ ์๋ต
|
| 127 |
-
|
| 128 |
-
```json
|
| 129 |
-
{
|
| 130 |
-
"success": true,
|
| 131 |
-
"baseline": {
|
| 132 |
-
"data": [{"ds": "...", "y": null, "yhat": 0.0, "yhat_upper": 0.0, "yhat_lower": 0.0}],
|
| 133 |
-
"model_weights": {"nbeats": 0.2},
|
| 134 |
-
"uncertainty": 0.07
|
| 135 |
-
},
|
| 136 |
-
"models_used": ["nbeats", "..."],
|
| 137 |
-
"models_failed": []
|
| 138 |
-
}
|
| 139 |
-
```
|
| 140 |
-
|
| 141 |
-
- ์ญ์ฌ ๊ตฌ๊ฐ ํ์ `yhat=null`, ์์ธก ๊ตฌ๊ฐ ํ์ `y=null` โ ํ์ ์ฒ๋ฆฌ ์ None ์ฒดํฌ ํ์.
|
| 142 |
-
- `yhat_upper/lower`๋ ๋ชจ๋ธ ๊ฐ ์์ธก ํ์คํธ์ฐจ ยฑ1.96ฯ. ๋ฐฑํ
์คํธ๊ฐ ์์ด `metrics`๋ ๋น dict.
|
| 143 |
-
- LLM ๋ณด์ ๋ ์ด์ด๋ 2026-07-10 ์ ๊ฑฐ๋จ (์นจ๋ฌต ํด๋ฐฑ ๋ฌธ์ + ๊ฒ์ฆ ๋ถ๊ฐ). ์์ ์์๋ธ๋ง ์ ๊ณต.
|
| 144 |
-
|
| 145 |
-
---
|
| 146 |
-
|
| 147 |
-
## ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
|
| 148 |
-
|
| 149 |
-
### ์
๋ ฅ ํฌ๋งท
|
| 150 |
-
- **์ง์:** CSV, Excel (.xlsx), JSON
|
| 151 |
-
- **ํ์ ์ปฌ๋ผ:** `date`(๋๋ `ds`) + `value`/`target`(๋๋ `y`)
|
| 152 |
-
- **์ต์ ๋ฐ์ดํฐ ํฌ์ธํธ:** 50๊ฐ
|
| 153 |
-
- **์ต๋ ํ์ผ ํฌ๊ธฐ:** 10MB (์ด๊ณผ ์ 413)
|
| 154 |
-
|
| 155 |
-
### DataProfile (data_profile.py)
|
| 156 |
-
์๋ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๋ฐ์ดํฐํด๋์ค. ๋ชจ๋ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ ์๋ ์กฐ์ ์ ์ฌ์ฉ๋๋ค.
|
| 157 |
-
|
| 158 |
-
```python
|
| 159 |
-
@dataclass
|
| 160 |
-
class DataProfile:
|
| 161 |
-
n_samples: int
|
| 162 |
-
freq: str # 'D', 'W', 'MS', 'QS', 'YS' ๋ฑ
|
| 163 |
-
seasonal_period: int
|
| 164 |
-
break_index: int # ๊ตฌ์กฐ์ ๋ณํ์ ์ธ๋ฑ์ค (-1์ด๋ฉด ์์)
|
| 165 |
-
volatility: float # ๋ณ๋์ฑ ์ง์
|
| 166 |
-
trend_type: str # 'stable', 'gradual', 'sudden'
|
| 167 |
-
seasonality_mode: str # 'additive', 'multiplicative'
|
| 168 |
-
```
|
| 169 |
-
|
| 170 |
-
### ์๋ ํ๋ผ๋ฏธํฐ ์กฐ์ (Auto-Tuning)
|
| 171 |
-
๋ชจ๋ ๋ชจ๋ธ์ `DataProfile`์ ๊ธฐ๋ฐํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์กฐ์ ํ๋ค:
|
| 172 |
-
- **์ฃผํ์ ๊ฐ์ง** โ ๊ณ์ ์ฃผ๊ธฐ ์๋ ์ค์
|
| 173 |
-
- **๊ตฌ์กฐ์ ๋ณํ์ ๊ฐ์ง** (CUSUM) โ ์ต๊ทผ ๋ฐ์ดํฐ๋ง ํ์ต ์ต์
|
| 174 |
-
- **์ด์๊ฐ ๊ฐ์ง** (IQR 2.5๋ฐฐ) โ ์ ์ฒ๋ฆฌ ์ ์ฉ
|
| 175 |
-
- **๊ณ์ ์ฑ ๋ชจ๋** (๋ณ๋๊ณ์ ๋น๊ต) โ additive/multiplicative ์ ํ
|
| 176 |
-
|
| 177 |
-
์์๋ธ ๊ฐ์ค์น๋ DataProfile๋ก ์กฐ์ ๋๋ค (ensemble_service.py):
|
| 178 |
-
volatility > 0.3 โ nbeatsยทprophet +0.05, trend stable โ etsยทtheta +0.05,
|
| 179 |
-
๊ตฌ์กฐ ๋ณํ์ ์กด์ฌ โ xgboostยทlightgbm +0.05, ํฉ๊ณ 1.0 ์ ๊ทํ.
|
| 180 |
-
`model_weights`(JSON, ์ ํ)๋ก ์๋ ๊ฐ์ค์น๋ฅผ ๋๊ธฐ๋ฉด ์๋ ์กฐ์ ๋์ ์ฌ์ฉ๋๋ฉฐ,
|
| 181 |
-
๊ฐ์ค์น 0์ธ ๋ชจ๋ธ์ ์คํ ์์ฒด๋ฅผ ๊ฑด๋๋ด๋ค (์์ ๋ชจ๋ธ 2๊ฐ ๋ฏธ๋ง์ด๋ฉด 422).
|
| 182 |
-
|
| 183 |
-
---
|
| 184 |
-
|
| 185 |
-
## ์๋น์ค ๋ ์ด์ด ๊ท์น
|
| 186 |
-
|
| 187 |
-
์ ๋ชจ๋ธ ์ถ๊ฐ ์ `{model}_service.py`์ ๋ค์ 4๊ฐ ํจ์๋ฅผ ๊ตฌํํ๋ค:
|
| 188 |
-
|
| 189 |
-
```python
|
| 190 |
-
def apply_defaults(params: dict) -> dict:
|
| 191 |
-
"""ํ๋ผ๋ฏธํฐ ๊ธฐ๋ณธ๊ฐ ๋ณํฉ"""
|
| 192 |
-
|
| 193 |
-
def get_parameters() -> dict:
|
| 194 |
-
"""ํ๋ผ๋ฏธํฐ ์คํค๋ง ๋ฐํ (UI ๋ ๋๋ง์ฉ)"""
|
| 195 |
-
|
| 196 |
-
def predict_with_{model}(df: pd.DataFrame, params: dict) -> dict:
|
| 197 |
-
"""์์ธก ์คํ โ {"success", "data", "metrics"} ๋ฐํ"""
|
| 198 |
-
|
| 199 |
-
def evaluate_with_{model}(df: pd.DataFrame, params: dict) -> dict:
|
| 200 |
-
"""๋ฐฑํ
์คํธ ํ๊ฐ"""
|
| 201 |
-
```
|
| 202 |
-
|
| 203 |
-
์์๋ธ์ ํธ์
ํ๋ ค๋ฉด `ensemble_service.py`์ `model_configs`์ `_DEFAULT_WEIGHTS`์ ๋ฑ๋กํ๋ค.
|
| 204 |
-
|
| 205 |
-
---
|
| 206 |
-
|
| 207 |
-
## ๋ฐฐํฌ
|
| 208 |
-
|
| 209 |
-
### ๋ก์ปฌ ์คํ
|
| 210 |
-
|
| 211 |
-
```bash
|
| 212 |
-
# ๊ฐ๋ฐ (์๋ ๋ฆฌ๋ก๋) โ ๋ฐ๋์ venv ์ฌ์ฉ (.venv๋ ์์กด์ฑ ๋ถ์์ )
|
| 213 |
-
bash run.sh
|
| 214 |
-
# ๋๋
|
| 215 |
-
./venv/bin/python -m uvicorn main:app --reload --port 8000
|
| 216 |
-
```
|
| 217 |
-
|
| 218 |
-
๋ถํ
์ 20~40์ด ๊ฑธ๋ฆฐ๋ค (torch/darts ์ํฌํธ + TimesFM ๋ฐ๋ชฌ ์ค๋ ๋ ๋ก๋).
|
| 219 |
-
|
| 220 |
-
### GitHub Actions โ HF + Vercel ์๋ ๋ฐฐํฌ
|
| 221 |
-
|
| 222 |
-
`main` ๋ธ๋์น์ pushํ๋ฉด `.github/workflows/deploy.yml`์ด ๋ณ๊ฒฝ ๊ฒฝ๋ก์ ๋ฐ๋ผ job์ ์ ๋ณ ์คํํ๋ค:
|
| 223 |
-
|
| 224 |
-
- **changes:** git diff๋ก ๋ณ๊ฒฝ ํ์ผ์ backend/frontend/tests๋ก ๋ถ๋ฅ (force-pushยทworkflow_dispatch๋ ์ ์ฒด ๋ฐฐํฌ๋ก ํด๋ฐฑ)
|
| 225 |
-
- **test:** backend ๋๋ tests ๋ณ๊ฒฝ ์ Python 3.10(ํ๋ก๋์
Docker์ ๋์ผ)์์ ์ ์ฒด pytest ์คํ โ deploy-hf์ ํ์ ๊ฒ์ดํธ. timesfm git ์์ค ์ค์น๋ฅผ ์ํด GIT_CONFIG_* ํ๊ฒฝ๋ณ์๋ก ๋ฌ๋์ git-lfs ํํฐ๋ฅผ ๋ฌด๋ ฅํํ๋ค
|
| 226 |
-
- **deploy-hf:** backend ๋ณ๊ฒฝ + ํ
์คํธ ํต๊ณผ ์์๋ง `HfApi.upload_folder`๋ก ๊ธฐ์กด Space์ ์ง์ ์ปค๋ฐ (free-tier Docker Space์ create_repo 402 ํ์ด์์ ์ฐํํ๊ธฐ ์ํด hf CLI ๋์ ์ฌ์ฉ). `tests/`๋ ์
๋ก๋ ์ ์ธ
|
| 227 |
-
- **deploy-vercel:** `timesfm-frontend/**` ๋ณ๊ฒฝ ์์๋ง Vercel prebuilt ๋ฐฉ์์ผ๋ก ํ๋ก๋์
๋ฐฐํฌ
|
| 228 |
-
|
| 229 |
-
**ํ์ Secret:** `HF_TOKEN`, `VERCEL_TOKEN`, `VERCEL_ORG_ID`, `VERCEL_PROJECT_ID`
|
| 230 |
-
|
| 231 |
-
### Docker
|
| 232 |
-
|
| 233 |
-
```dockerfile
|
| 234 |
-
FROM python:3.10-slim
|
| 235 |
-
# ๋น๋ ๋๊ตฌ ํ์: gcc, g++, build-essential (Prophet, statsmodels ์ปดํ์ผ)
|
| 236 |
-
# ๋นroot ์คํ: appuser (UID 1000)
|
| 237 |
-
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
| 238 |
-
```
|
| 239 |
-
|
| 240 |
-
FastAPI ์ฑ์ ๋ณ๋ ํ๊ฒฝ๋ณ์ ์์ด ๋์ํ๋ค. Claude API๋ฅผ ์ฐ๋ ๊ณณ์ timesfm-frontend์
|
| 241 |
-
`/api/interpret` ๋ผ์ฐํธ๋ฟ์ด๋ฉฐ, ํค๋ Vercel ํ๊ฒฝ๋ณ์ `ANTHROPIC_API_KEY`๋ก ๊ด๋ฆฌ๋๋ค.
|
| 242 |
-
|
| 243 |
-
---
|
| 244 |
-
|
| 245 |
-
## ํ
์คํธ
|
| 246 |
-
|
| 247 |
-
```bash
|
| 248 |
-
# ๋จ์ ํ
์คํธ
|
| 249 |
-
python -m pytest tests/
|
| 250 |
-
|
| 251 |
-
# ์๋น์ค ์ง์ ํ
์คํธ (API ์์ด)
|
| 252 |
-
python run_test.py
|
| 253 |
-
```
|
| 254 |
-
|
| 255 |
-
**์ฃผ์ ํ
์คํธ ํ์ผ:**
|
| 256 |
-
- `tests/test_nbeats.py` โ N-BEATS ํ์ตยท์์ธก (์ํ ํ๋ผ๋ฏธํฐ๋ก ์ค์ ํ์ต)
|
| 257 |
-
- `tests/test_auto_scaling.py` โ ์๋ ํ๋ผ๋ฏธํฐ ์กฐ์ ๊ฒ์ฆ (MASE < 2.0 ๊ธฐ๋๊ฐ)
|
| 258 |
-
- `tests/test_hybrid.py` โ ์์๋ธ ๊ฐ์ค์น ์ฐ์ ยท์ง๊ณยท์๋ ๊ฐ์ค์น ๊ฒ์ฆ ๋ก์ง
|
| 259 |
-
- `tests/test_api_contract.py` โ API ์๋ต ํ์ยท์๋ฌ ์ฝ๋ ๊ณ์ฝ (๋ชจ๋ธ ํ์ต ์์ด ๋น ๋ฆ)
|
| 260 |
-
- `tests/test_nonblocking_endpoints.py` โ ์์ธก ์คํ ์ค ์ด๋ฒคํธ ๋ฃจํ ๋
ผ๋ธ๋กํน ๊ฒ์ฆ
|
| 261 |
-
- `tests/test_timesfm_horizon.py` โ TimesFM horizon ํ๋(256) ์ฒ๋ฆฌ
|
| 262 |
-
- `tests/test_ensemble_concurrency.py` โ ์๋ฒ ์ ์ญ Semaphore(3) ๋์ ์คํ ์ ํ
|
| 263 |
-
- `tests/test_data_service.py` โ ํ์ผ ํ์ฑ (์ธ์ฝ๋ฉ ํด๋ฐฑยท์ค๋ฅ ๋ฉ์์ง ๊ตฌ๋ถ)
|
| 264 |
-
- `tests/test_supply_chain_hardening.py` โ ๋ฐฐํฌ ๊ณต๊ธ๋ง ๋ฐฉ์ด + ๋ฐฐํฌ ๊ฒฝ๋ก ๊ฒ์ดํธ ๊ฒ์ฆ
|
| 265 |
-
|
| 266 |
-
**ํ
์คํธ ์์ฑ ์ฃผ์:** `ensemble_service._MODEL_SEMAPHORE`๋ ๋ชจ๋ ์ ์ญ์ด๋ผ ์ต์ด
|
| 267 |
-
๊ฒฝํฉ ์ ํด๋น ์ด๋ฒคํธ ๋ฃจํ์ ๋ฐ์ธ๋ฉ๋๋ค. `asyncio.run`(์ ๋ฃจํ)์ผ๋ก
|
| 268 |
-
`run_ensemble_async`๋ฅผ ์ง์ ํธ์ถํ๋ ํ
์คํธ๋ monkeypatch๋ก ์ Semaphore๋ฅผ
|
| 269 |
-
์ฃผ์
ํด์ผ ๋ค๋ฅธ ํ
์คํธ์ ์์ ์์กด ์ถฉ๋์ด ์๋ค (test_hybrid.py `_isolate_semaphore` ์ฐธ๊ณ ).
|
| 270 |
-
|
| 271 |
-
๋ณ๊ฒฝ ๊ฒ์ฆ(๋ก์ปฌ ๊ธฐ๋ยทUI ๊ตฌ๋ ๋ ์ํผ)์ `.claude/skills/verify/SKILL.md` ์ฐธ๊ณ .
|
| 272 |
-
|
| 273 |
-
---
|
| 274 |
-
|
| 275 |
-
## ์ฝ๋ฉ ์ปจ๋ฒค์
|
| 276 |
-
|
| 277 |
-
- **์ธ์ด:** Python 3.10+
|
| 278 |
-
- **๋ค์ด๋ฐ:** ํด๋์ค CamelCase, ํจ์/๋ณ์ snake_case
|
| 279 |
-
- **์ฃผ์/๋
์คํธ๋ง:** ํ๊ตญ์ด
|
| 280 |
-
- **์๋ฌ ์ฒ๋ฆฌ:** `HTTPException` + `logging` (INFO ๋ ๋ฒจ)
|
| 281 |
-
- **ํ์
ํํธ:** ์ผ๋ถ ํจ์๋ ๋๋ฝ (๊ธฐ์กด ์ฝ๋ ์์ ์ ๊ฐ์ ์ถ๊ฐ ๋ถํ์)
|
| 282 |
-
- **๋ฐฐ์น ํฌ๊ธฐ:** N-BEATS๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ํด ์ต๋ 32๋ก ์ ํ
|
| 283 |
-
|
| 284 |
-
---
|
| 285 |
-
|
| 286 |
-
## ์ฃผ์์ฌํญ
|
| 287 |
-
|
| 288 |
-
- **requirements.txt๋ ์ ์์กด์ฑ ๋ฒ์ ๊ณ ์ .** torch๋ ๋ฐ๋์ CPU ์ ์ฉ ํ (`+cpu`, extra-index-url) โ ๊ธฐ๋ณธ PyPI ํ ์ CUDA ์คํ ~3GB๋ฅผ ๋์ด์ HF CPU Space ๋ถํ
์ ๋ง๊ฐ๋จ๋ฆฐ๋ค.
|
| 289 |
-
- **TimesFM์ GitHub ์ปค๋ฐ ํ ์ค์น** (`timesfm[torch] @ git+...@d720daa`). PyPI ๋ฒ์ ๊ณผ API๊ฐ ๋ค๋ฅด๋ฏ๋ก ์์ ์
๊ทธ๋ ์ด๋ ๊ธ์ง. ์ฑ ์์ ์ ๋ฐ๋ชฌ ์ค๋ ๋๋ก ๋ก๋ํด์ผ SIGTERM ์ข
๋ฃ๊ฐ ๋งค๋ฌ๋ฆฌ์ง ์๋๋ค (main.py lifespan ์ฐธ๊ณ ).
|
| 290 |
-
- **macOS Apple Silicon ๋ก์ปฌ ์คํ ์** PyTorch+LightGBM OpenMP ์ถฉ๋ ๋ฐฉ์ด๊ฐ main.py ์๋จ์ ์๋ค (`KMP_DUPLICATE_LIB_OK`, ML ์ํฌํธ ์ ์ค์ ํ์). ์์๋ธ์ ์๋ฒ ์ ์ญ Semaphore(3)๋ก ๋์ ์คํ ๋ชจ๋ธ ์๋ฅผ ์ ํํ๋ค.
|
| 291 |
-
- **Claude API ์๋ต์ JSON ํ์ฑํ ๋๋ ๋งํฌ๋ค์ด ์ฝ๋๋ธ๋ก ์ ๊ฑฐ ํ์** (timesfm-frontend์ interpret ๋ผ์ฐํธ ์ฐธ๊ณ ). FastAPI ์ฑ์ 2026-07-10๋ถํฐ Claude API๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค (hybrid LLM ๋ณด์ ยทTimesFM ํด์ค ๋ชจ๋ ์ ๊ฑฐ).
|
| 292 |
-
- N-BEATS๋ ํฌ์ธํธ ์์ธก๋ง ์ ๊ณต (์ ๋ขฐ๊ตฌ๊ฐ ์์). ๊ตฌ๊ฐ ์์ธก์ด ํ์ํ๋ฉด Prophet, ARIMA, Theta, TimesFM ๋๋ ํ์ด๋ธ๋ฆฌ๋ ์์๋ธ ์ฌ์ฉ ๊ถ์ฅ. (ETS, XGBoost, LightGBM๋ ํฌ์ธํธ ์์ธก๋ง.)
|
| 293 |
-
- TimesFM์ test ๊ตฌ๊ฐ ํฌํจ ์ต๋ 256 ์คํ
(max_horizon)๊น์ง๋ง ์์ธก โ ์ด๊ณผ ์์ฒญ์ ํ๋ ๋ด๋ก ์๋ฆฌ๊ณ ๊ฒฝ๊ณ ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค.
|
| 294 |
-
- XGBoost/LightGBM์ Direct Multi-Step ๋ฐฉ์ ์ฌ์ฉ (๊ฐ ์์ธก ์คํ
๋ณ ๋ณ๋ ๋ชจ๋ธ๋ก ์ค์ฐจ ๋์ ๋ฐฉ์ง).
|
| 295 |
-
- ์์๋ธ์ ์์ฒญ๋ง๋ค 7๊ฐ ๋ชจ๋ธ์ ํ์ตํ๋ฏ๋ก ๋๋ฆฌ๋ค (HF Space ์ค์ธก: ์๋ณ 120ํ 26์ด, ์ผ๋ณ 400ํ 103์ด). ๋ชจ๋ธ๋ณ ํ์์์ 180์ด, ์ฑ๊ณต ๋ชจ๋ธ 2๊ฐ ๋ฏธ๋ง์ด๋ฉด 422.
|
| 296 |
-
- HF Spaces ์ฌ๋ฐฐํฌ๋ Docker ๋น๋๋ฅผ ํฌํจํ๋ฏ๋ก ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค.
|
| 297 |
-
- `backend/` ๋๋ ํฐ๋ฆฌ๋ ๋ ๊ฑฐ์ ์ฝ๋๋ก ์ค์ ์๋น์ค์ ์ฌ์ฉ๋์ง ์๋๋ค.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README_N-BEATS.md
DELETED
|
@@ -1,122 +0,0 @@
|
|
| 1 |
-
# N-BEATS ์๊ณ์ด ์์ธก ๋ชจ๋ธ ์ฌ์ฉ ๊ฐ์ด๋
|
| 2 |
-
|
| 3 |
-
## ์
๋ ฅ ๋ฐ์ดํฐ ํ์
|
| 4 |
-
|
| 5 |
-
N-BEATS ๋ฐ ๋ค๋ฅธ ๋ชจ๋ ์๊ณ์ด ์์ธก ๋ชจ๋ธ(Prophet, XGBoost, ARIMA, SARIMA ๋ฑ)์ ๊ณตํต๋ ํ์ค ๋ฐ์ดํฐ ํ์์ ์ฌ์ฉํฉ๋๋ค:
|
| 6 |
-
|
| 7 |
-
### ํ์ ์ปฌ๋ผ
|
| 8 |
-
- `ds`: ๋ ์ง/์๊ฐ ์ปฌ๋ผ (ํ์)
|
| 9 |
-
- `y`: ์์ธกํ๋ ค๋ ๋์ ๊ฐ ์ปฌ๋ผ (ํ์)
|
| 10 |
-
|
| 11 |
-
### ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ
|
| 12 |
-
- ์ต์ 50๊ฐ ์ด์์ ๋ฐ์ดํฐ ํฌ์ธํธ ํ์ (๋ ๋ง์์๋ก ์ข์)
|
| 13 |
-
- ๋ ์ง๋ ์ผ๊ด๋ ๊ฐ๊ฒฉ์ ๊ฐ์ ธ์ผ ํจ (์ผ๋ณ, ์ฃผ๋ณ, ์๋ณ ๋ฑ)
|
| 14 |
-
- ๊ฒฐ์ธก์น๋ ์ด์์น๋ ๋ชจ๋ธ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์
|
| 15 |
-
|
| 16 |
-
### ์ง์๋๋ ๋ ์ง ํ์
|
| 17 |
-
๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ ์ง ํ์์ ์ง์ํฉ๋๋ค:
|
| 18 |
-
- ISO ํ์: `2023-01-01`
|
| 19 |
-
- ์ฌ๋์ ํ์: `01/01/2023` ๋๋ `2023/01/01`
|
| 20 |
-
- ์ปดํฉํธ ํ์: `20230101`
|
| 21 |
-
- ํ
์คํธ ํ์: `01-Jan-2023`, `Jan-01-2023`
|
| 22 |
-
|
| 23 |
-
### ์ง์๋๋ ํ์ผ ํ์
|
| 24 |
-
๋ค์๊ณผ ๊ฐ์ ํ์ผ ํ์์ ์ง์ํฉ๋๋ค:
|
| 25 |
-
- CSV (`.csv`)
|
| 26 |
-
- Excel (`.xlsx`, `.xls`)
|
| 27 |
-
- JSON (`.json`)
|
| 28 |
-
|
| 29 |
-
### ์์ CSV ํ์
|
| 30 |
-
```
|
| 31 |
-
ds,y
|
| 32 |
-
2023-01-01,100
|
| 33 |
-
2023-01-02,105
|
| 34 |
-
2023-01-03,98
|
| 35 |
-
...
|
| 36 |
-
```
|
| 37 |
-
|
| 38 |
-
### ์์ JSON ํ์
|
| 39 |
-
```json
|
| 40 |
-
[
|
| 41 |
-
{"ds": "2023-01-01", "y": 100},
|
| 42 |
-
{"ds": "2023-01-02", "y": 105},
|
| 43 |
-
{"ds": "2023-01-03", "y": 98},
|
| 44 |
-
...
|
| 45 |
-
]
|
| 46 |
-
```
|
| 47 |
-
๋๋
|
| 48 |
-
```json
|
| 49 |
-
{
|
| 50 |
-
"data": [
|
| 51 |
-
{"ds": "2023-01-01", "y": 100},
|
| 52 |
-
{"ds": "2023-01-02", "y": 105},
|
| 53 |
-
{"ds": "2023-01-03", "y": 98},
|
| 54 |
-
...
|
| 55 |
-
]
|
| 56 |
-
}
|
| 57 |
-
```
|
| 58 |
-
|
| 59 |
-
## API ์์ฒญ ์์
|
| 60 |
-
|
| 61 |
-
```json
|
| 62 |
-
{
|
| 63 |
-
"model_type": "nbeats",
|
| 64 |
-
"forecast_periods": 30,
|
| 65 |
-
"params": {
|
| 66 |
-
"input_chunk_length": 24,
|
| 67 |
-
"output_chunk_length": 12,
|
| 68 |
-
"generic_architecture": true,
|
| 69 |
-
"num_stacks": 10,
|
| 70 |
-
"num_blocks": 1,
|
| 71 |
-
"num_layers": 4,
|
| 72 |
-
"layer_widths": 256,
|
| 73 |
-
"expansion_coefficient_dim": 5,
|
| 74 |
-
"dropout": 0.1,
|
| 75 |
-
"n_epochs": 100,
|
| 76 |
-
"batch_size": 32,
|
| 77 |
-
"learning_rate": 0.001
|
| 78 |
-
}
|
| 79 |
-
}
|
| 80 |
-
```
|
| 81 |
-
|
| 82 |
-
## ์ฃผ์ ํ๋ผ๋ฏธํฐ ์ค๋ช
|
| 83 |
-
|
| 84 |
-
### ๊ธฐ๋ณธ ํ๋ผ๋ฏธํฐ
|
| 85 |
-
- `model_type`: 'nbeats' (๊ณ ์ ๊ฐ)
|
| 86 |
-
- `forecast_periods`: ์์ธกํ ๊ธฐ๊ฐ ์
|
| 87 |
-
- `input_chunk_length`: ์
๋ ฅ ์ํ์ค ๊ธธ์ด (๊ณผ๊ฑฐ ๋ฐ์ดํฐ ํฌ์ธํธ ์)
|
| 88 |
-
- `output_chunk_length`: ์ถ๋ ฅ ์ํ์ค ๊ธธ์ด (ํ ๋ฒ์ ์์ธกํ ๋ฏธ๋ ๋ฐ์ดํฐ ํฌ์ธํธ ์)
|
| 89 |
-
|
| 90 |
-
### ๊ณ ๊ธ ํ๋ผ๋ฏธํฐ
|
| 91 |
-
- `generic_architecture`: ์ผ๋ฐ ์ํคํ
์ฒ ์ฌ์ฉ ์ฌ๋ถ (true/false)
|
| 92 |
-
- `num_stacks`: ์คํ ์
|
| 93 |
-
- `num_blocks`: ๋ธ๋ก ์
|
| 94 |
-
- `num_layers`: ๋ ์ด์ด ์
|
| 95 |
-
- `layer_widths`: ๋ ์ด์ด ๋๋น
|
| 96 |
-
- `expansion_coefficient_dim`: ํ์ฅ ๊ณ์ ์ฐจ์
|
| 97 |
-
- `dropout`: ๋๋กญ์์ ๋น์จ
|
| 98 |
-
- `n_epochs`: ํ์ต ์ํฌํฌ
|
| 99 |
-
|
| 100 |
-
## ์ค์ ์ฐธ๊ณ ์ฌํญ
|
| 101 |
-
|
| 102 |
-
1. N-BEATS ๋ชจ๋ธ์ ๋ค๋ฅธ ์๊ณ์ด ์์ธก ๋ชจ๋ธ์ ๋นํด ๋ง์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ต์ 50๊ฐ ์ด์์ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
|
| 103 |
-
|
| 104 |
-
2. ๋ ์ง ๋ฐ์ดํฐ๋ ์ผ๊ด๋ ๊ฐ๊ฒฉ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๋ถ๊ท์นํ ๊ฐ๊ฒฉ์ ๋ฐ์ดํฐ๋ ๋ชจ๋ธ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค.
|
| 105 |
-
|
| 106 |
-
3. ๋ชจ๋ ์์ธก ๋ชจ๋ธ(N-BEATS, Prophet, XGBoost, ARIMA, SARIMA)์ ๋์ผํ 'ds'์ 'y' ์ปฌ๋ผ ํ์์ ์ฌ์ฉํ๋ฏ๋ก, ๋ฐ์ดํฐ๋ฅผ ํ์คํํ๋ฉด ์ฌ๋ฌ ๋ชจ๋ธ์ ์ฝ๊ฒ ๋น๊ตํ ์ ์์ต๋๋ค.
|
| 107 |
-
|
| 108 |
-
4. ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ๊ฒฝ์ฐ ํ์ต ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ผ๋ฏ๋ก `n_epochs`์ `batch_size` ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ ํ ์กฐ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
|
| 109 |
-
|
| 110 |
-
5. **์ ๋ขฐ ๊ตฌ๊ฐ ์์**: N-BEATS๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ขฐ ๊ตฌ๊ฐ(์ํ/ํํ ๊ฒฝ๊ณ)์ ์ ๊ณตํ์ง ์๊ณ ๋จ์ผ ์์ธก๊ฐ๋ง ์์ฑํฉ๋๋ค. ์ด๋ Prophet์ด๋ ARIMA์ ๊ฐ์ ํต๊ณ์ ๋ชจ๋ธ๊ณผ์ ์ฃผ์ ์ฐจ์ด์ ์
๋๋ค. ์ ๋ขฐ ๊ตฌ๊ฐ์ด ํ์ํ ๊ฒฝ์ฐ Prophet ๋๋ ARIMA ๋ชจ๋ธ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
|
| 111 |
-
|
| 112 |
-
6. **๋ฐฐ์น ํฌ๊ธฐ ์ ํ**: ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์น ํฌ๊ธฐ ๊ฐ์ด๋๋ผ์ธ์ ๊ถ์ฅํฉ๋๋ค:
|
| 113 |
-
- ๊ธฐ๋ณธ ์ค์ : 8 (์์ ํ ๊ธฐ๋ณธ๊ฐ)
|
| 114 |
-
- ์ผ๋ฐ์ ์ธ ์ฌ์ฉ: 16-32 (๋๋ถ๋ถ์ ์์คํ
์์ ์์ ์ )
|
| 115 |
-
- ์ต๋ ๊ถ์ฅ: 32 (32๋ฅผ ์ด๊ณผํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ ์ํ์ด ๋์์ง๋๋ค)
|
| 116 |
-
- ์์คํ
๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ๋ฉด ์ต๋ 64๊น์ง ์ฌ์ฉ ๊ฐ๋ฅ
|
| 117 |
-
|
| 118 |
-
์์คํ
์์ ์๋์ผ๋ก ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ 32๋ก ์ ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
|
| 119 |
-
|
| 120 |
-
7. **๋ชจ๋ธ ๋ณต์ก์ฑ๊ณผ ํ์ต ์๊ฐ**: ๋ณต์กํ ๋ชจ๋ธ(์คํ, ๋ธ๋ก, ๋ ์ด์ด ์๊ฐ ๋ง์ ๋ชจ๋ธ)์ ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ผ ํ ์ ์์ต๋๋ค. ๋ํ ํ์ต ์๊ฐ์ด ๊ธธ์ด์ง๋ฏ๋ก ์๊ฐ๊ณผ ์ฑ๋ฅ ์ฌ์ด์ ๊ท ํ์ ๊ณ ๋ คํ์ธ์.
|
| 121 |
-
|
| 122 |
-
8. **์ฑ๋ฅ ํ๊ฐ (๋ฐฑํ
์คํธ)**: N-BEATS๋ ์ ๋ขฐ ๊ตฌ๊ฐ์ ์ ๊ณตํ์ง ์์ง๋ง, ๋ฐฑํ
์คํธ๋ก ๋ชจ๋ธ ์ฑ๋ฅ์ ํ๊ฐํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ์ ๋ง์ง๋ง 20%๋ฅผ ๊ฒ์ฆ์ฉ์ผ๋ก ๋ถํ ํ์ฌ ํ์ต ํ ์์ธก๊ฐ๊ณผ ์ค์ ๊ฐ์ ๋น๊ตํ๊ณ , **MAE**, **RMSE**, **MAPE**, **Rยฒ** ์งํ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์์ธก API์ `include_evaluation=true`๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ `/nbeats/evaluate` ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ์ธ์. (์ต์ 60๊ฐ ๋ฐ์ดํฐ ํ์)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requirements.txt
CHANGED
|
@@ -20,7 +20,7 @@ openpyxl==3.1.5
|
|
| 20 |
|
| 21 |
# N-BEATS (Darts)
|
| 22 |
darts==0.45.0
|
| 23 |
-
torch==2.
|
| 24 |
pytorch-lightning==2.6.5
|
| 25 |
|
| 26 |
# Prophet
|
|
|
|
| 20 |
|
| 21 |
# N-BEATS (Darts)
|
| 22 |
darts==0.45.0
|
| 23 |
+
torch==2.13.0+cpu
|
| 24 |
pytorch-lightning==2.6.5
|
| 25 |
|
| 26 |
# Prophet
|