์์์ ์กฐ๊ธฐ๊ฒฝ๋ณด AI v2.0
ํ๋ก์ ํธ ๊ตฌ์กฐ
early_warning_ai_v2/
โ
โโโ README.md # ๋ฉ์ธ ๊ฐ์ด๋
โโโ CHANGELOG_V2.md # V2.0 ๊ฐ์ ์ฌํญ
โโโ requirements.txt # ์์กด์ฑ
โโโ LICENSE # โMIT ๋ผ์ด์ ์ค
โโโ .gitignore # Git ์ ์ธ ํ์ผ
โ
โโโ data/ # ๋ฐ์ดํฐ ํด๋
โ โโโ README.md # ๋ฐ์ดํฐ ์ค๋น ๊ฐ์ด๋
โ โโโ raw/ # ์ฌ๊ธฐ์ CSV ํ์ผ ๋ฃ๊ธฐ
โ โ โโโ .gitkeep
โ โโโ processed/ # (์๋ ์์ฑ)
โ
โโโ models/ # ํ์ต๋ ๋ชจ๋ธ (์๋ ์์ฑ)
โ
โโโ src/ # ์์ค ์ฝ๋
โ โโโ README.md # ์ฝ๋ ์ค๋ช
โ โโโ predictor.py # ์์ธก ํด๋์ค (ํ๊น
ํ์ด์ค ์คํ์ผ)
โ โโโ feature_engineering.py # ํน์ง ์์ฑ (47๊ฐ)
โ โโโ train.py # ํ์ต ์คํฌ๋ฆฝํธ
โ
โโโ notebooks/ # Jupyter ๋
ธํธ๋ถ
โโโ train_model.ipynb # ์ ์ฒด ํ์ต ๊ณผ์
์ฃผ์ ํน์ง
1. ๊น๋ํ ๊ตฌ์กฐ
- ํ์ ํ์ผ๋ง ํฌํจ: ์ค์ ๋ก ํ์ํ ์ฝ๋์ ๋ฌธ์๋ง
- ๋ช ํํ ๋๋ ํ ๋ฆฌ: ๊ฐ ํด๋์ ์ฉ๋๊ฐ ๋ถ๋ช ํจ
- ์์ธํ ๊ฐ์ด๋: ๋ชจ๋ ํด๋์ README.md ํฌํจ
2. ์ค์ฉ์ ์ธ ์ค๊ณ
- ๋ฐ์ดํฐ ๋ถ๋ฆฌ:
data/raw/์ CSV๋ง ๋ฃ์ผ๋ฉด ๋จ - ๋ชจ๋ํ: ๊ฐ ๊ธฐ๋ฅ์ด ๋ ๋ฆฝ์ ์ธ ํ์ผ๋ก ๋ถ๋ฆฌ
- ํ์ฅ ๊ฐ๋ฅ: ์๋ก์ด ํน์ง์ด๋ ๋ชจ๋ธ ์ถ๊ฐ ์ฌ์
3. ์๋ฒฝํ ๋ฌธ์ํ
- README.md: ์ ์ฒด ํ๋ก์ ํธ ๊ฐ์
- CHANGELOG_V2.md: V2.0 ์์ธ ๊ฐ์ ์ฌํญ
- src/README.md: ์์ค ์ฝ๋ ์ค๋ช ๋ฐ ์์ ๋ฐฉ๋ฒ
- data/README.md: ๋ฐ์ดํฐ ์ค๋น ๊ฐ์ด๋
๋น ๋ฅธ ์์
1. ์ค์น
cd early_warning_ai_v2
pip install -r requirements.txt
2. ๋ฐ์ดํฐ ์ค๋น
data/raw/ ํด๋์ 3๊ฐ์ CSV ํ์ผ ๋ฃ๊ธฐ:
big_data_set1_f.csvds2_monthly_usage.csvds3_monthly_customers.csv
3. ํ์ต
# Jupyter ๋
ธํธ๋ถ์ผ๋ก
jupyter notebook notebooks/train_model.ipynb
# ๋๋ ์คํฌ๋ฆฝํธ๋ก
python src/train.py
4. ์์ธก
from src.predictor import EarlyWarningPredictor
model = EarlyWarningPredictor.from_pretrained("models/")
result = model.predict(store_data)
์ฃผ์ ํ์ผ ์ค๋ช
README.md
- ํ๋ก์ ํธ ์ ์ฒด ๊ฐ์
- ๋น ๋ฅธ ์์ ๊ฐ์ด๋
- ์ฌ์ฉ ๋ฐฉ๋ฒ
- ํ๋ก์ ํธ ๊ตฌ์กฐ
CHANGELOG_V2.md
- V1.0 โ V2.0 ๋ชจ๋ ๊ฐ์ ์ฌํญ
- ์ฑ๋ฅ ๋น๊ตํ
- ์ค์ ๊ฐ์ ์ฌ๋ก
- ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋ด์ญ
src/predictor.py
- ํ๊น ํ์ด์ค ์คํ์ผ API
from_pretrained()๋ฉ์๋- ๋จ์ผ/๋ฐฐ์น ์์ธก
- ์ํ ์์ธ ๋ถ์
src/feature_engineering.py
- 47๊ฐ ํน์ง ์๋ ์์ฑ
- ๋งค์ถ, ๊ณ ๊ฐ, ์ด์, ํธ๋ ๋, ๋ณ๋์ฑ, ๊ณ์ ์ฑ
- ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ
src/train.py
- ์ ์ฒด ํ์ต ํ์ดํ๋ผ์ธ
- ์ปค๋งจ๋๋ผ์ธ ์ธํฐํ์ด์ค
- SMOTE ํด๋์ค ๋ถ๊ท ํ ์ฒ๋ฆฌ
- ์๋ ํ๊ฐ ๋ฐ ์ ์ฅ
notebooks/train_model.ipynb
- ์ ์ฒด ํ์ต ๊ณผ์ ์๊ฐํ
- EDA (ํ์์ ๋ฐ์ดํฐ ๋ถ์)
- ๋จ๊ณ๋ณ ์ค๋ช
- ์ฑ๋ฅ ํ๊ฐ ๋ฐ ๋ถ์
๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ
์๋ก์ด ๋ฐ์ดํฐ๋ก ํ์ต
1๋จ๊ณ: data/raw/์ CSV ํ์ผ 3๊ฐ ๋ฐฐ์น
2๋จ๊ณ: ํ์ต ์คํ
python src/train.py
3๋จ๊ณ: ์์ฑ๋ ๋ชจ๋ธ ํ์ธ
ls models/
# xgboost_model.pkl, lightgbm_model.pkl, config.json ๋ฑ
ํ๋ผ๋ฏธํฐ ์กฐ์
์์ธก ์๊ณ๊ฐ ๋ณ๊ฒฝ
# src/predictor.py์ predict() ๋ฉ์๋์์
result = model.predict(store_data, threshold=0.3) # ๋ ๋ฏผ๊ฐํ๊ฒ
์์๋ธ ๊ฐ์ค์น ๋ณ๊ฒฝ
// models/config.json์์
{
"ensemble_weights": [0.6, 0.4] // XGBoost 60%, LightGBM 40%
}
ํน์ง ์ถ๊ฐ
# src/feature_engineering.py์ FeatureEngineer ํด๋์ค์
def _create_custom_features(self, df):
features = {}
# ์๋ก์ด ํน์ง ์ถ๊ฐ
features['new_metric'] = df['col1'] / df['col2']
return features
V2.0 ํต์ฌ ๊ฐ์
1. ํน์ง ๊ฐํ (20๊ฐ โ 47๊ฐ)
- ๋ค์ค ๊ธฐ๊ฐ ์ถ์ธ ๋ถ์
- ๊ณ์ ์ฑ ํจํด ๊ฐ์ง
- ๊ณ ๊ฐ ํ๋ ๋ณํ ์ถ์
2. ํด๋์ค ๋ถ๊ท ํ ํด๊ฒฐ
- SMOTE ์ ์ฉ
- Recall +17.5%p ํฅ์
3. ๋ชจ๋ธ ์ต์ ํ
- XGBoost + LightGBM ์์๋ธ
- ํ์ดํผํ๋ผ๋ฏธํฐ ์๋ ํ๋
4. ์ฑ๋ฅ ํฅ์
| ์งํ | V1.0 | V2.0 | ๊ฐ์ |
|---|---|---|---|
| Accuracy | 94.3% | 97.2% | +2.9%p |
| Recall | 68.2% | 85.7% | +17.5%p |
| Precision | 76.5% | 89.3% | +12.8%p |
๋ฌธ์ ์์น
- ์ ์ฒด ๊ฐ์ด๋:
README.md - ๊ฐ์ ์ฌํญ:
CHANGELOG_V2.md - ์ฝ๋ ์ค๋ช
:
src/README.md - ๋ฐ์ดํฐ ๊ฐ์ด๋:
data/README.md - ํ์ต ๊ณผ์ :
notebooks/train_model.ipynb
์ฌ์ฉ ํ
์ฒซ ํ์ต ์
- ์ํ ๋ฐ์ดํฐ๋ก ํ ์คํธ (๋น ๋ฆ)
- ์ ์ฒด ๋ฐ์ดํฐ๋ก ํ์ต (์ ํํจ)
- ์ฑ๋ฅ ํ๊ฐ ํ ํ๋ผ๋ฏธํฐ ์กฐ์
์ฑ๋ฅ ๊ฐ์ ์
- ํน์ง ์ถ๊ฐ:
feature_engineering.py์์ - ํ์ดํผํ๋ผ๋ฏธํฐ:
train.py์์ ์กฐ์ - ์์๋ธ ๊ฐ์ค์น:
config.json์์
๋ฐฐํฌ ์
models/ํด๋ ์ ์ฒด ๋ณต์ฌsrc/predictor.py๋ง ์ฌ์ฉ- API ์๋ฒ ๊ตฌ์ถ (FastAPI ์ถ์ฒ)
์ฃผ์์ฌํญ
๋ฐ์ดํฐ ์ค๋น
- 3๊ฐ์ CSV ํ์ผ ๋ชจ๋ ํ์
- ์ต์ 3๊ฐ์ ์ด์์ ์๋ณ ๋ฐ์ดํฐ
- ํ์ ๋งค์ฅ 1-5% ๊ถ์ฅ
๋ชจ๋ธ ์ฌ์ฉ
- ์์ธก์ ์ฐธ๊ณ ์ฉ, ์ค์ ํ๋จ์ ์ ๋ฌธ๊ฐ์ ์๋ด
- ์ฃผ๊ธฐ์ ์ฌํ์ต ๊ถ์ฅ (3-6๊ฐ์)
- ์ ์ข ๋ณ ์ฐจ์ด ๊ณ ๋ ค
๊ธฐ์ฌ ๋ฐ ๋ฌธ์
- GitHub Issues: ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์ ์
- Pull Request: ์ฝ๋ ๊ฐ์ , ๋ฌธ์ ์์ ํ์
๋ผ์ด์ ์ค
MIT License - ์์ ๋กญ๊ฒ ์ฌ์ฉ, ์์ , ๋ฐฐํฌ ๊ฐ๋ฅ