Spaces:
Sleeping
Sleeping
SeoYun
Claude Opus 5.5
feat: BAG lite ๋ชจ๋ธ(EHR 5๊ฐ + ๊ณ ํ์ PRS) ์ ์ฉ, PRS ์ ํ ์
๋ ฅ์นธ ์ถ๊ฐ
f666f82 Download scripts/precompute_artifacts.py from thinkhong/AI_Challenge2026: direct link, hf CLI and curl.
- Browser
- Download file 5.42 kB
-
https://huggingface.co/spaces/thinkhong/AI_Challenge2026/resolve/main/scripts/precompute_artifacts.py
- Command line
-
hf download hf://spaces/thinkhong/AI_Challenge2026/scripts/precompute_artifacts.py
-
curl -L -o precompute_artifacts.py https://huggingface.co/spaces/thinkhong/AI_Challenge2026/resolve/main/scripts/precompute_artifacts.py
5.42 kB
| #!/usr/bin/env python3 | |
| """WEB(HF Spaces) ๋ฐฐํฌ์ฉ ์์ฝ ์ฐ์ถ๋ฌผ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด์ WEB/artifacts/์ ์ ์ฅํ๋ค. | |
| ์ด ์คํฌ๋ฆฝํธ๋ ์๋ณธ EHR ๋ฐ์ดํฐ(data/processed/EHR_BASE_merged.csv ๋ฑ)์ | |
| ์ ๊ทผํ ์ ์๋ ์ด ์ ์ฅ์ ํ๊ฒฝ(๋ก์ปฌ)์์๋ง ์คํํ๋ค. **HF Spaces์๋ ์ด | |
| ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ๋ฆฌ์ง ์๊ณ ์ด ์คํฌ๋ฆฝํธ๊ฐ ๋ง๋ WEB/artifacts/ ๊ฒฐ๊ณผ๋ฌผ๋ง ์ฌ๋ฆฐ๋ค** | |
| - ์๋ณธ ๊ฐ์ธ EHR ๋ ์ฝ๋๋ฅผ ๊ณต๊ฐ ์น์ ๋ฐฐํฌํ์ง ์๊ธฐ ์ํจ์ด๋ค. ์ฐ์ถ๋ฌผ์ ์ ๋ถ | |
| ์๋ ์ธ ์ข ๋ฅ๋ฟ์ด๊ณ , ์ด๋ ๊ฒ๋ ๊ฐ์ธ ๋ ์ฝ๋ ์๋ณธ์ด ์๋๋ค: | |
| 1. feature๋ณ ํ๊ท /์ค๊ฐ๊ฐ(์ง๊ณ ํต๊ณ - ๋ช ๋ช ์ด ์ด๋ค ๊ฐ์ธ์ง๋ ์ ์ ์์) | |
| 2. DM SHAP์ฉ ๋ฐฐ๊ฒฝํ๋ณธ - shap.kmeans๋ก 10,000๋ช ์ 100๊ฐ์ "ํฉ์ฑ ๋ํ์ " | |
| ์ผ๋ก ์์ถํ ๊ฒ(๊ฐ ๋ํ์ ์ ์ค์กดํ๋ ํน์ ๊ฐ์ธ์ด ์๋๋ผ ๊ตฐ์ง ์ค์ฌ ์ขํ) | |
| 3. Regression/main_regression.py๊ฐ ์ด๋ฏธ ์ ํฉํด๋ OLS ๊ณ์, | |
| ML/main_dm.py๊ฐ ์ด๋ฏธ ํ์ตํด๋ DM ์ฒดํฌํฌ์ธํธ(๋ ๋ค ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ์ผ | |
| ๋ฟ ์๋ณธ ๋ฐ์ดํฐ๊ฐ ์๋ - ์ฒดํฌํฌ์ธํธ 5๊ฐ ํฉ์ณ๋ 580KB๋ก ์์ฃผ ์์) | |
| BAG๋ lite ๋ฒ์ (ML/config/base_prs_htn.yaml)์ ์ด๋ค: ์์ EHR 15๊ฐ ํ๊ท์์ | |
| FDR ์ ์ํ๋ 5๊ฐ(SEX/HTN/HTNAG/DM/SBP)์ ๊ณ ํ์ PRS(PRS_HTN)๋ฅผ covariate๋ก | |
| ๋ฃ์ Regression/output_prs_htn/effect_sizes.csv(Rยฒ 0.1177 - EHR 15๊ฐ 0.1186๊ณผ | |
| ๊ฑฐ์ ๊ฐ์ผ๋ฉด์ ์ ๋ ฅ์ 6๊ฐ๋ฟ). DM์ PRS ๋ฒ์ (ML/config/dm_prs.yaml) ์ฒดํฌํฌ์ธํธ๋ก PRS_DM์ ๋ฃ๊ณ | |
| --prs-dropout 0.3์ผ๋ก ํ์ตํ ML/checkpoints/dm_prs/(PRS๋ฅผ ์ ๋ฃ์ผ๋ฉด [MASK]๋ก | |
| ์์ธก - ๊ทธ [MASK] ์๋ฒ ๋ฉ๋ ํ์ต๋ผ ์์ด์ EHR๋ง ์ ๋ ฅํด๋ ๋์ํจ). feature | |
| ํต๊ณํ์ PRS ํ(ํ๊ท /์ค๊ฐ๊ฐ, z-ํ์คํ๋ผ ~0)์, DM SHAP ๋ฐฐ๊ฒฝ์ ์ PRS_DM | |
| ์ปฌ๋ผ์ ๊ฐ์ด ๋ฃ๋๋ค(PRS๋ฅผ ์ ๋ ฅํ ์ฌ๋์ PRS๋ SHAP feature๋ก ์ค๋ช ). | |
| WEB ์ชฝ ์ฝ๋(WEB/utils/patient_data.py ๋ฑ)๋ ์ด ์ฐ์ถ๋ฌผ๋ง ์ฝ๊ณ , MultimodalDataset | |
| ์ด๋ ์๋ณธ CSV/ํ ์คํธ ํ์ผ์ ์ ํ ์ฐธ์กฐํ์ง ์๋๋ค - T_ID๋ก ๊ธฐ์กด ์ฌ๋์ | |
| ์กฐํํ๋ ๊ธฐ๋ฅ๋ ๊ทธ๋์ WEB์๋ ์๋ค(์์ EHR ๊ฐ ์ ๋ ฅ๋ง ์ง์). | |
| ์ฌ์ฉ๋ฒ (torch/shap/pandas๊ฐ ์๋ hugging_face ํ๊ฒฝ ํ์, ์ ์ฅ์ ๋ฃจํธ์์ ์คํ): | |
| /data1/software/anaconda3/envs/hugging_face/bin/python WEB/scripts/precompute_artifacts.py | |
| """ | |
| import shutil | |
| import sys | |
| from pathlib import Path | |
| import pandas as pd | |
| import shap | |
| REPO_ROOT = Path(__file__).resolve().parent.parent.parent | |
| sys.path.insert(0, str(REPO_ROOT)) | |
| from src.data_loaders import MultimodalDataset, load_config | |
| ARTIFACTS_DIR = REPO_ROOT / "WEB" / "artifacts" | |
| def save_feature_stats(config_path: str, out_name: str) -> tuple: | |
| """BASE ์ ์ฒด(fold ์์)์์ feature๋ณ ํ๊ท /์ค๊ฐ๊ฐ๋ง ๋ฝ์ ์ ์ฅํ๋ค. | |
| ๋ฐํ: (features, ๊ทธ df) - df๋ ์ด ํจ์๋ฅผ ๋ถ๋ฅธ ๋ค SHAP ๋ฐฐ๊ฒฝ ๊ณ์ฐ์๋ | |
| ์ฌ์ฌ์ฉํ๊ณ ํจ์ ๋ฐ์ผ๋ก๋ ์ ๋๊ฐ(์๋ณธ์ ์ฌ๊ธฐ์๋ง ์ ๊น ๋ฉ๋ชจ๋ฆฌ์ ์๋ค๊ฐ ๋ฒ๋ ค์ง).""" | |
| config = load_config(config_path) | |
| df = MultimodalDataset(config, cohort="base", folds=None).df | |
| # EHR feature ๋ค์ PRS feature(PRS_HTN/PRS_DM)๋ ๋ถ์ธ๋ค - WEB/app.py๋ | |
| # config.yaml์ prs ์ค์ ์ ๋ณด๊ณ PRS ํ์ EHR ์ ๋ ฅ ๋ชฉ๋ก์์ ๋ฐ๋ก ๋บ๋ค. | |
| features = config["data"]["ehr"]["features"] + list(config["data"]["prs"]["features"]) | |
| stats = pd.DataFrame( | |
| { | |
| "feature": features, | |
| "mean": df[features].mean().to_numpy(), | |
| "median": df[features].median().to_numpy(), | |
| } | |
| ) | |
| out_path = ARTIFACTS_DIR / out_name | |
| stats.to_csv(out_path, index=False) | |
| print(f"[INFO] {out_name} ์ ์ฅ ({len(features)}๊ฐ feature ํ๊ท /์ค๊ฐ๊ฐ): {out_path}") | |
| return features, df | |
| def main(): | |
| ARTIFACTS_DIR.mkdir(parents=True, exist_ok=True) | |
| (ARTIFACTS_DIR / "checkpoints").mkdir(exist_ok=True) | |
| print("[INFO] BAG feature ํต๊ณ ๊ณ์ฐ ์ค (ML/config/base_prs_htn.yaml)...") | |
| save_feature_stats("ML/config/base_prs_htn.yaml", "bag_feature_stats.csv") | |
| print("[INFO] DM feature ํต๊ณ ๊ณ์ฐ ์ค (ML/config/dm_prs.yaml)...") | |
| dm_features, dm_df = save_feature_stats("ML/config/dm_prs.yaml", "dm_feature_stats.csv") | |
| print("[INFO] DM local SHAP ๋ฐฐ๊ฒฝํ๋ณธ(kmeans 100๊ฐ ํฉ์ฑ ๋ํ์ ) ๊ณ์ฐ ์ค...") | |
| background = shap.kmeans(dm_df[dm_features].to_numpy(dtype="float32"), 100) | |
| background_df = pd.DataFrame(background.data, columns=dm_features) | |
| background_path = ARTIFACTS_DIR / "dm_shap_background.csv" | |
| background_df.to_csv(background_path, index=False) | |
| print(f"[INFO] dm_shap_background.csv ์ ์ฅ ({len(background_df)}๊ฐ ํฉ์ฑ ๋ํ์ , ์ค์ ๊ฐ์ธ ์๋): {background_path}") | |
| print("[INFO] effect_sizes.csv / DM 5-fold ์ฒดํฌํฌ์ธํธ ๋ณต์ฌ ์ค...") | |
| shutil.copy(REPO_ROOT / "Regression/output_prs_htn/effect_sizes.csv", ARTIFACTS_DIR / "effect_sizes.csv") | |
| for fold_id in range(5): | |
| src = REPO_ROOT / "ML/checkpoints/dm_prs" / f"dm_fold{fold_id}.pt" | |
| shutil.copy(src, ARTIFACTS_DIR / "checkpoints" / f"dm_fold{fold_id}.pt") | |
| total_size = sum(f.stat().st_size for f in ARTIFACTS_DIR.rglob("*") if f.is_file()) | |
| print(f"\n[INFO] ์๋ฃ - {ARTIFACTS_DIR} ์ ์ฒด ํฌ๊ธฐ {total_size / 1024:.1f} KB") | |
| print("[INFO] ์ด ํด๋ ์์ ํ์ผ๋ง WEB ๋ฐฐํฌ์ ํฌํจํ๋ฉด ๋จ (์๋ณธ EHR ๋ฐ์ดํฐ ์์)") | |
| if __name__ == "__main__": | |
| main() | |