YAML Metadata Warning: empty or missing yaml metadata in repo card (https://huggingface.co/docs/hub/model-cards#model-card-metadata)
๊ฐ์๊ฑฐ๋ฆฌ(Visibility) ์์ธก ๋ชจ๋ธ๋ง ํ๋ก์ ํธ
๊ธฐ์ยท๋๊ธฐ์ค์ผยทํญ๊ณต์ ๋ณด(ASOS, DataOn, TAF)๋ฅผ ํตํฉํด ๊ฐ์๊ฑฐ๋ฆฌ(visi)๋ฅผ ์์ธกํฉ๋๋ค. ๋ถ๊ท ํ ๋ฐ์ดํฐ๋ฅผ SMOTENC/CTGAN์ผ๋ก ๋ณด๊ฐํ๊ณ , GBDT(LightGBM/XGBoost)์ ์ ํ๋ฐ์ดํฐ ํนํ ๋ฅ๋ฌ๋(ResNet-like, FT-Transformer, DeepGBM)์ ๊ฒฐํฉํด ๋ค์ค/์ด์ง ๋ถ๋ฅ๋ฅผ ์ํํฉ๋๋ค.
๊ธฐ์ ์คํ(Tech Stack)
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ:
pandas,numpy - EDA/์๊ฐํ:
matplotlib,seaborn - ์ํ๋ง/๋ถ๊ท ํ ์ฒ๋ฆฌ:
imbalanced-learn (SMOTENC),CTGAN,Optuna(CTGAN ํ์ดํผํ๋ผ๋ฏธํฐ), ์ง์ญ/์ฐ๋ ๊ธฐ๋ฐ ๋ถํ - ๋ชจ๋ธ๋ง(GBDT):
LightGBM,XGBoost(GPU ์ต์ ํฌํจ, ์ฌ์ฉ์ ์ ์ CSI ํ๊ฐ) - ๋ชจ๋ธ๋ง(๋ฅ๋ฌ๋):
PyTorch๊ธฐ๋ฐResNetLike,FTTransformer,DeepGBM - ์ต์ ํ:
hyperopt(LightGBM/XGBoost),Optuna(CTGAN) - ์ ํธ/์ ์ฅ:
joblib
์์คํ ์ํคํ ์ฒ(ํ์ดํ๋ผ์ธ)
- ๋ฐ์ดํฐ ์์ง/์ ์ฌ:
data/ASOS,data/dataon,data/data_for_TAF - ๋ณํฉ/์ ์ฒ๋ฆฌ:
0.air_data_merge.ipynbโ1.data_merge.ipynbโ2.eda_preproccesing.ipynb - ๋ฐ์ดํฐ ์ฆ๊ฐ(๋ถ๊ท ํ ์ฒ๋ฆฌ):
Analysis_code/make_oversample_data/๋ดSMOTENCโCTGAN(+Optuna)โ ๊ท์น ๊ธฐ๋ฐ ํํฐ๋ง - ๋ฐ์ดํฐ ๋ถํ : ์ง์ญ๋ณ(
*_train.csv,*_test.csv), ์ฐ๋ ๊ธฐ๋ฐ 3-Fold ํ๋์์ - ํ์ต: GBDT(
optima/*.py)์ ๋ฅ๋ฌ๋ ๋ ธํธ๋ถ(deeplearning_model_*) - ํ๊ฐ/๋ถ์: ์ฌ์ฉ์ ์ ์
CSI+ F1/Accuracy,model_visualize.ipynb,find_reason/*(ํธ๋ ๋, ๋ถํฌ ๋น๊ต) - ์์๋ธ/์ต์ข
:
model_voting_test_best_sample/*,final_test/final.ipynb
TL;DR (๋น ๋ฅธ ์์)
- ํ์ด์ฌ ํ๊ฒฝ ์ค๋น ํ ํ์ ํจํค์ง ์ค์น
pip install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install pandas numpy scikit-learn matplotlib seaborn imbalanced-learn optuna ctgan xgboost lightgbm joblib
- ๋ฐ์ดํฐ ๋ฐฐ์น
- ์์ฒ/์ค๊ฐ ์ฐ์ถ๋ฌผ์
data/ํ์์ ๋ฐฐ์น. ํ์ต์ฉ CSV/feather๋data/data_for_modeling/์ฐธ๊ณ .
- ์ค๋ฒ์ํ๋ง ์ํ(SMOTE/CTGAN)
cd Analysis_code/make_oversample_data
python smote_sample_1.py
python oversampling_code.py
- GBDT ์ต์ ํ/ํ์ต ์์(์์ธ์)
cd ../optima
python LGB_smote_seoul.py
python XGB_smote_seoul.py
- ๋ฅ๋ฌ๋ ๋ชจ๋ธ ํ์ต/ํ๊ฐ: ๋
ธํธ๋ถ ์คํ(
Analysis_code/๋ด.ipynb)
ํ๋ก์ ํธ ๊ตฌ์กฐ
visibility_prediction/
โโโ Analysis_code/
โ โโโ 0.air_data_merge.ipynb
โ โโโ 1.data_merge.ipynb
โ โโโ 2.eda_preproccesing.ipynb
โ โโโ 3.oversampling.ipynb
โ โโโ deeplearning_model_binary.ipynb
โ โโโ deeplearning_model_multi.ipynb
โ โโโ make_train_test.ipynb
โ โโโ model_visualize.ipynb
โ โโโ final_test/
โ โ โโโ final.ipynb
โ โโโ find_reason/ # ์ง์ญ๋ณ ํธ๋ ๋/์์ธ ๋ถ์ ๋
ธํธ๋ถ
โ โโโ sampling_data_test/ # ์ํ๋ง ๋ฐ์ดํฐ ์ฑ๋ฅ ํ
์คํธ ๋
ธํธ๋ถ
โ โโโ model_voting_test_best_sample/
โ โ โโโ ensemble__voting_best_sample.ipynb
โ โโโ make_oversample_data/
โ โ โโโ oversampling_code.py # SMOTENC+CTGAN ํ์ดํ๋ผ์ธ
โ โ โโโ smote_sample_1.py # ์ฐ๋/์ ์ฒ๋ฆฌ ํฌํจ SMOTE ์ํ
โ โ โโโ (gan_sample_*.py ๋ฑ)
โ โโโ optima/ # GBDT ํ์ดํผํ๋ผ๋ฏธํฐ ํ์/ํ์ต ์คํฌ๋ฆฝํธ
โ โ โโโ LGB_smote_seoul.py
โ โ โโโ XGB_smote_seoul.py
โ โโโ models/
โ โ โโโ best_resnet_model.pth
โ โ โโโ tabnet_model.zip
โ โโโ deepgbm.py
โ โโโ ft_transformer.py
โ โโโ resnet_like.py
โโโ data/
โ โโโ ASOS/ # ๊ธฐ์
โ โโโ dataon/ # ๋๊ธฐ์ค์ผ(๋์ฉ๋ ์ผ์๋ณ CSV)
โ โโโ data_for_modeling/ # ์ง์ญ๋ณ train/test CSV ๋ฐ feather
โ โโโ data_for_demo/
โ โโโ data_for_TAF/ # ๊ณตํญ TAF(ํญ๊ณต๊ธฐ์) CSV
โ โโโ data_oversampled/
โ โโโ smote/
โ โโโ ctgan7000/
โ โโโ ctgan10000/
โ โโโ ctgan20000/
โโโ README.md
๋ฐ์ดํฐ ๋ฐ ๋ณ์(Variables)
๋ชฉํ ๋ณ์
visi: ๊ฐ์๊ฑฐ๋ฆฌ(์ฐ์๊ฐ). ํฉ์ฑ ํ๋ณธ ํํฐ๋ง ๊ท์น์์ ํ์ธ๋๋ ๊ตฌ๊ฐ ์์: class 0์ [0,100), class 1์ [100,500), class 2๋ ๊ทธ ์ธ ๊ตฌ๊ฐ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.multi_class: ๋ค์ค ๋ถ๋ฅ ๋ผ๋ฒจ(์ ์ 0/1/2)binary_class: ์ด์ง ๋ผ๋ฒจ. ๊ท์น:binary_class = 0 if multi_class == 2 else 1
์ฃผ์ ํผ์ฒ ๊ทธ๋ฃน(์ฝ๋ ๊ธฐ์ค)
- ๊ธฐ์(ASOS):
temp_C,precip_mm,wind_speed,wind_dir(์ ์จโ0 ์นํ),hm,vap_pressure,dewpoint_C,loc_pressure,sea_pressure,solarRad,snow_cm,cloudcover(int),lm_cloudcover(int),low_cloudbase,groundtemp - ๋๊ธฐ์ค์ผ(DataOn):
O3,NO2,PM10,PM25 - ์๊ฐ/์ฃผ๊ธฐ:
year(int),month(int),hour(int),hour_sin,hour_cos,month_sin,month_cos - ํ์:
ground_temp - temp_C(์ง๋ฉด-๊ธฐ์จ ์ฐจ)
- ๊ธฐ์(ASOS):
๋ฒ์ฃผํ ๋ณ์(๋ชจ๋ธ/์ํ๋ง ๊ด์ )
wind_dir,cloudcover,lm_cloudcover, ๊ทธ๋ฆฌ๊ณintํ์ ์ ์๊ฐ ๋ณ์(year,month,hour)๋ SMOTENC/GBDT์์ ๋ฒ์ฃผํ์ผ๋ก ์ทจ๊ธ๋จ(์ฝ๋์์float64๊ฐ ์๋ ์ด ์ธ๋ฑ์ค ์๋ ํ์ง)
์ ์ฒ๋ฆฌ ๊ท์น(๋ฐ์ท)
wind_dir์ค'์ ์จ'์ "0"์ผ๋ก ์นํ ํ ์ ์ํ ๋ณํcloudcover, lm_cloudcover์ ์ํ ๋ณํ- ํ์ต ์ ํ๊น/๋ณด์กฐ ์ด(
multi_class, binary_class) ๋ถ๋ฆฌ ํ ํ์ ์ ์ฌ๊ณ์ฐ
EDA ๋ฐ ์ ์ฒ๋ฆฌ
๋ณํฉ/์ ๋ฆฌ
- ์ธ๋ฑ์ค ์ด ์ ๊ฑฐ:
Unnamed: 0๋๋กญ - ์๋ฃํ ์ ํฉ์ฑ:
cloudcover,lm_cloudcover์ ์ํ;year,month,hour์ ์ํ - ํน์๊ฐ ์นํ:
wind_dir == '์ ์จ'โ "0" ํ ์ ์ํ ๋ณํ
- ์ธ๋ฑ์ค ์ด ์ ๊ฑฐ:
ํน์ง ๊ณตํ
- ์ฃผ๊ธฐํ ์ธ์ฝ๋ฉ:
hour_sin,hour_cos,month_sin,month_cos - ์ฐจ๋ถํ ํ์:
ground_temp - temp_C
- ์ฃผ๊ธฐํ ์ธ์ฝ๋ฉ:
๋ถํฌ/ํธ๋ ๋ ๋ถ์
- ์ง์ญ๋ณ ์๊ณ์ด ํธ๋ ๋:
find_reason/*_trend.ipynb - ๋ถํฌ ๋น๊ต/๋ณํ ๊ฐ์ง:
find_reason/wasserstein_distance.ipynb(Wasserstein ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ ๋ถํฌ ์ฐจ์ด ์ ๋ํ)
- ์ง์ญ๋ณ ์๊ณ์ด ํธ๋ ๋:
๋ฐ์ดํฐ ๋ถํ
- ์ง์ญ ๋จ์ ๋ฐ์ดํฐ์
(
*_train.csv,*_test.csv) - ์ฐ๋ ๊ธฐ๋ฐ ํ๋์์ 3-Fold(2018โ2020 ์กฐํฉ)๋ก ์ผ๋ฐํ ์ฑ๋ฅ ๊ฒ์ฆ
- ์ง์ญ ๋จ์ ๋ฐ์ดํฐ์
(
๋ถ๊ท ํ ์ฒ๋ฆฌ ๋ฐ ํฉ์ฑ ์ํ๋ง
SMOTENC
- ๋ฒ์ฃผํ ์ธ๋ฑ์ค: ์
๋ ฅ ํน์ฑ ์ค
float64๊ฐ ์๋ ์ด์ ์์น ์ธ๋ฑ์ค ์ฌ์ฉ - ์ํ๋ง ์ ๋ต ์์:
{0: 10000, 1: 10000, 2: ๊ธฐ์กด ๊ฐ์}๋๋ ๋ฐ์ดํฐ ๊ท๋ชจ์ ๋ฐ๋ผ{0: 500/1000, 1: ceil(n1/100)*100, 2: n2}๋ก ์ด๊ธฐ ์ฆ๊ฐ ํ CTGAN์ผ๋ก ์ต์ข ์ฆ๊ฐ (<-> 155ํ) - ์ฌ๊ณ์ฐ: ์ํ๋ง ํ
multi_class์์binary_class๋ฐ ์ฃผ๊ธฐ/์ฐจ๋ถ ํ์์ ๋ณต๊ตฌ
- ๋ฒ์ฃผํ ์ธ๋ฑ์ค: ์
๋ ฅ ํน์ฑ ์ค
CTGAN(+Optuna)
- ํด๋์ค 0, 1์ ์ด๊ธฐ ๋ฐ์ดํฐ ์ํ ์ ํ๋ณด๋ฅผ ์ํด SMOTENC๋ฅผ ์ฌ์ฉํ 1์ฐจ ์ฆ๊ฐ์ ์ํํ ๋ค, CTGAN์ ์ ์ฉํ์ฌ ์ต์ข ๋ฐ์ดํฐ ์ฆ๊ฐ์ ์งํ (<-> 151ํ)
- ํด๋์ค 0, 1์ ๋์์ผ๋ก Optuna๋ก
embedding_dim, generator_dim, discriminator_dim, pac, batch_size, discriminator_stepsํ์ ํ ํฉ์ฑ - ์์ฑ ํ๋ณธ ํ์ง ํํฐ:
class 0 โ 0 โค visi < 100,class 1 โ 100 โค visi < 500 - ์ต์ข
ํฉ๋ณธ ํ ํ์/๋ณด์กฐ ํผ์ฒ(
binary_class, ์ฃผ๊ธฐ/์ฐจ๋ถ ํญ๋ชฉ) ๋ณต๊ตฌ
์ฐ์ถ๋ฌผ
data/data_oversampled/smote/,ctgan7000/,ctgan10000/,ctgan20000/ํ์์ ์ง์ญ๋ณ CSV ์ ์ฅ
๋ชจ๋ธ ์ํคํ ์ฒ(์์ธ)
๋ฅ๋ฌ๋(tabular)
resnet_like.py- ์
๋ ฅ:
x_num [B, N_num],x_cat [B, N_cat]โ concat โ ์ ๋ ฅ์ ํ(d_main=128) โ ์์ฐจ๋ธ๋ก(n_blocks=4,d_hidden=64,dropout_first=0.25) โ ์ถ๋ ฅ์ธต - ์ถ๋ ฅ:
num_classes == 2 โ 1 ๋ก์ง,> 2 โ K ๋ก์ง
- ์
๋ ฅ:
ft_transformer.py- ์์น: Linear(
num_features โ d_token=192), ๋ฒ์ฃผ:cat_cardinalities๋ณnn.Embedding(d_token)ํ ํฉ์ฑ - ์ธ์ฝ๋:
TransformerEncoderLayer(d_model=d_token, nhead=8, dropoutโ0.2)รn_blocks=6โ ํ๊ท ํ๋ง โ ๋ถ๋ฅ ํค๋
- ์์น: Linear(
deepgbm.py- ์์น Linear(
d_main=128) + ๋ฒ์ฃผ ์๋ฒ ๋ฉ ํฉ์ฐ โ ์์ฐจ MLP ๋ธ๋ก(n_blocks=4,d_hidden=64,dropoutโ0.2) โ ๋ถ๋ฅ ํค๋
- ์์น Linear(
GBDT
- LightGBM(
optima/LGB_smote_seoul.py):objective='multiclassova',n_estimatorsโ4000, ์กฐ๊ธฐ์ข ๋ฃ, GPU ์ต์ ์์ ์กด์ฌ,hyperopt๋กmax_depth, min_child_weight, num_leaves, subsample, learning_rateํ์ - XGBoost(
optima/XGB_smote_seoul.py):objective='multi:softprob',tree_method='hist',enable_categorical=True, GPU ์ต์ ,hyperopt๋ก ํต์ฌ ํ์ดํผํ๋ผ๋ฏธํฐ ํ์,eval_metric=CSI
- LightGBM(
ํ์ต/๊ฒ์ฆ ์ ๋ต
- ์ฐ๋ ๊ธฐ๋ฐ ํ๋์์ 3-Fold(์์)
- Fold1: Train 2018โ2019 โ Val 2020
- Fold2: Train 2018โ2020 โ Val 2019
- Fold3: Train 2019โ2020 โ Val 2018
- ์ง์ญ ๋จ์๋ก ๋ณ๋ ํ์ต(์:
seoul_train.csv๋ฑ)
ํ๊ฐ ์งํ
- ์ฌ์ฉ์ ์ ์ CSI(Critical Success Index) ๋ค์ค๋ถ๋ฅ ๋ฒ์
H = cm[0, 0] + cm[1, 1]
F = (cm[1, 0] + cm[2, 0] + cm[0, 1] + cm[2, 1])
M = (cm[0, 2] + cm[1, 2])
CSI = H / (H + F + M + 1e-10)
- ๊ทธ ์ธ: ์ ํ๋, F1 ๋ฑ ๋ ธํธ๋ถ/์คํฌ๋ฆฝํธ์์ ๋ณํ ํ์ธ
์คํ ๋ฐฉ๋ฒ(์์ธ)
ํ๊ฒฝ ์ค๋น
- Python 3.8+ ๊ถ์ฅ, CUDA ์ง์ ์ GPU ์ฌ์ฉ ๊ฐ๋ฅ(CTGAN/GBDT ์๋ ํฅ์)
- LightGBM GPU๊ฐ ๋ฏธ์ค์น๋ผ๋ฉด
pip install lightgbm์ผ๋ก CPU ๋ฒ์ ์ฌ์ฉ ๋๋ GPU ๋น๋ ํ์
๋ฐ์ดํฐ ์ค๋น
data/ASOS/: ์ฐ๋๋ณ ๊ธฐ์ ์์ฒdata/dataon/: ๋๊ธฐ์ค์ผ ์ผ์๋ณ CSV(๋์ฉ๋)data/data_for_modeling/: ์ง์ญ๋ณ ํ์ต/ํ๊ฐ ์ธํธ(*_train.csv,*_test.csv,df_*.feather)data/data_for_TAF/: ๊ณตํญ๋ณ TAF(ํญ๊ณต๊ธฐ์)
์ ์ฒ๋ฆฌ/ํ์
Analysis_code/0.air_data_merge.ipynbโ1.data_merge.ipynbโ2.eda_preproccesing.ipynb
์ค๋ฒ์ํ๋ง
Analysis_code/make_oversample_data/์์ ์คํฌ๋ฆฝํธ ์คํ(์๋จ TL;DR ์ฐธ์กฐ)
GBDT ์ต์ ํ/ํ์ต
Analysis_code/optima/LGB_smote_seoul.py,XGB_smote_seoul.py์คํ- ์ฐ์ถ ๋ชจ๋ธ์
Analysis_code/save_model/ํ์์.pkl๋ก ์ ์ฅ
๋ฅ๋ฌ๋ ํ์ต
deeplearning_model_*๋ ธํธ๋ถ์์ ์ ํ๋ฐ์ดํฐ ๋ชจ๋ธ ํ์ต/ํ๊ฐ,model_visualize.ipynb๋ก ์๊ฐํ
์์๋ธ/์ต์ข ํ๊ฐ
model_voting_test_best_sample/ensemble__voting_best_sample.ipynbfinal_test/final.ipynb
๋ชจ๋ธ ์ ์ถ๋ ฅ ๊ท๊ฒฉ(์์ฝ)
- ์์น ์
๋ ฅ
x_num:float32ํ ์[batch, num_numeric_features] - ๋ฒ์ฃผ ์
๋ ฅ
x_cat: ์ ์ ์ธ๋ฑ์ค ํ ์[batch, num_categorical_features] - ์ถ๋ ฅ: ์ด์ง(1 ๋ก์ง) ๋๋ ๋ค์ค๋ถ๋ฅ(K ๋ก์ง). ์์ค/์๊ณ๊ฐ์ ๋ ธํธ๋ถ ๋ด ์ค์ ์ฐธ๊ณ
์ฌํ์ฑ/์๋
random_state=42(SMOTENC), ๋ชจ๋ธ ์คํฌ๋ฆฝํธ ๋ดrandom_state=120๋ฑ์ ๊ณ ์ ๊ฐ ์ฌ์ฉ- ๋ฐ์ดํฐ/ํ๋์จ์ด ์ฐจ์ด์ ๋ฐ๋ผ ์ฌํ๋ฅ ์ด ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก fold/seed๋ฅผ ๋ช ์์ ์ผ๋ก ์ค์ ๊ถ์ฅ
์ฃผ์/ํธ๋ฌ๋ธ์ํ
optima/LGB_smote_seoul.py์sys.path.append(...)๋ ํ๊ฒฝ ์์กด์ ๊ฒฝ๋ก์ ๋๋ค. ์ผ๋ฐ ํ๊ฒฝ์์๋ ์ ๊ฑฐํด๋from lightgbm import LGBMClassifier๊ฐ ๋์ํด์ผ ํฉ๋๋ค.- ์คํฌ๋ฆฝํธ๋ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์คํ ์ ํ์ฌ ์์
๋๋ ํฐ๋ฆฌ๊ฐ
Analysis_code/*ํ์์ธ์ง ํ์ธํ์ธ์. wind_dir์'์ ์จ'๊ฐ ์นํ/ํ๋ณํ์ด ๋๋ฝ๋๋ฉด GBDT/XGB์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.dataon/์ ๋งค์ฐ ๋์ฉ๋์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ ๋ฅผ ํ๋ณดํ๊ฑฐ๋ ์ฐ๋/์ง์ญ ๋จ์๋ก ์ฒ๋ฆฌํ์ธ์.
์์กด์ฑ
- Python 3.8+
- PyTorch, pandas, numpy, scikit-learn, imbalanced-learn, optuna, ctgan, xgboost, lightgbm, joblib, matplotlib, seaborn
๋ผ์ด์ ์ค/์ธ์ฉ
- ๋ผ์ด์ ์ค: ์ถํ ์ ๋ฐ์ดํธ ์์
- ๋ณธ ํ๋ก์ ํธ/๊ฒฐ๊ณผ๋ฌผ์ ์ธ์ฉ ์
visibility_prediction์ ์ฅ์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ ์์ค(ASOS, DataOn, TAF)๋ฅผ ๋ช ์ํด ์ฃผ์ธ์.
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐ Ask for provider support