|
|
--- |
|
|
language: |
|
|
- ko |
|
|
license: mit |
|
|
tags: |
|
|
- tabular-classification |
|
|
- business-analytics |
|
|
- risk-prediction |
|
|
- ensemble |
|
|
- sklearn |
|
|
library_name: sklearn |
|
|
datasets: |
|
|
- custom |
|
|
metrics: |
|
|
- accuracy |
|
|
- f1 |
|
|
- roc-auc |
|
|
--- |
|
|
# ์์์
์ ์กฐ๊ธฐ๊ฒฝ๋ณด AI ์์คํ
v2.0 |
|
|
|
|
|
[](https://www.python.org/downloads/) |
|
|
[](https://opensource.org/licenses/MIT) |
|
|
|
|
|
์ค์ ์นด๋ ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ์์์
์์ ํ์
์ํ์ **3-6๊ฐ์ ์ ์ ์์ธก**ํ๋ AI ๋ชจ๋ธ |
|
|
|
|
|
## ๊ฐ์ |
|
|
|
|
|
- **ํ์
๊ฐ์ง์จ 85.7%**: ์ค์ ์ํ ๋งค์ฅ์ ๋๋ถ๋ถ์ ์กฐ๊ธฐ์ ํฌ์ฐฉ |
|
|
- **์ ํ๋ 97.2%**: ๋์ ์ ๋ขฐ๋๋ก ์ํ๋ ํ๊ฐ |
|
|
- **ํด์ ๊ฐ๋ฅ**: ๊ตฌ์ฒด์ ์ธ ์ํ ์์ธ๊ณผ ๊ฐ์ ๋ฐฉ์ ์ ์ |
|
|
- **์ค์๊ฐ ๋ถ์**: ๊ฐ๋จํ API๋ก ์ฆ์ ์์ธก |
|
|
|
|
|
## V2.0 ์ฃผ์ ๊ฐ์ ์ฌํญ |
|
|
|
|
|
| ์งํ | 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 | |
|
|
|
|
|
**์์ธ ๊ฐ์ ๋ด์ญ**: [CHANGELOG_V2.md](CHANGELOG_V2.md) ์ฐธ๊ณ |
|
|
|
|
|
## ๋น ๋ฅธ ์์ |
|
|
|
|
|
### 1. ์ค์น |
|
|
|
|
|
```bash |
|
|
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก |
|
|
git clone https://github.com/yourusername/early_warning_ai_v2.git |
|
|
cd early_warning_ai_v2 |
|
|
|
|
|
# ์์กด์ฑ ์ค์น |
|
|
pip install -r requirements.txt |
|
|
``` |
|
|
|
|
|
### 2. ๋ฐ์ดํฐ ์ค๋น |
|
|
|
|
|
๋ฐ์ดํฐ ํ์ผ์ `data/raw/` ํด๋์ ๋ฃ๊ธฐ: |
|
|
|
|
|
```bash |
|
|
data/raw/ |
|
|
โโโ big_data_set1_f.csv # ๋งค์ฅ ๊ธฐ๋ณธ ์ ๋ณด |
|
|
โโโ ds2_monthly_usage.csv # ์๋ณ ์ด์ฉ ๋ฐ์ดํฐ |
|
|
โโโ ds3_monthly_customers.csv # ์๋ณ ๊ณ ๊ฐ ๋ฐ์ดํฐ |
|
|
``` |
|
|
|
|
|
### 3. ๋ชจ๋ธ ํ์ต |
|
|
|
|
|
Jupyter ๋
ธํธ๋ถ์ ์คํ: |
|
|
|
|
|
```bash |
|
|
jupyter notebook notebooks/train_model.ipynb |
|
|
``` |
|
|
|
|
|
๋๋ Python ์คํฌ๋ฆฝํธ๋ก: |
|
|
|
|
|
```bash |
|
|
python src/train.py |
|
|
``` |
|
|
|
|
|
### 4. ์์ธก ์ฌ์ฉ |
|
|
|
|
|
```python |
|
|
from src.predictor import EarlyWarningPredictor |
|
|
|
|
|
# ๋ชจ๋ธ ๋ก๋ |
|
|
model = EarlyWarningPredictor.from_pretrained("models/") |
|
|
|
|
|
# ๋งค์ฅ ๋ฐ์ดํฐ |
|
|
store_data = { |
|
|
'store_id': 'CAFE_001', |
|
|
'industry': '์นดํ', |
|
|
'avg_sales': 35, |
|
|
'reuse_rate': 20.0, |
|
|
'operating_months': 24, |
|
|
'sales_trend': -0.08 |
|
|
} |
|
|
|
|
|
# ์์ธก |
|
|
result = model.predict(store_data) |
|
|
|
|
|
print(f"์ํ๋: {result['risk_score']}/100") |
|
|
print(f"๋ฑ๊ธ: {result['risk_level']}") |
|
|
print(f"ํ์
ํ๋ฅ : {result['closure_probability']:.1%}") |
|
|
``` |
|
|
|
|
|
**์ถ๋ ฅ:** |
|
|
``` |
|
|
์ํ๋: 78.5/100 |
|
|
๋ฑ๊ธ: ๋์ |
|
|
ํ์
ํ๋ฅ : 78.5% |
|
|
|
|
|
์ฃผ์ ์ํ ์์ธ: |
|
|
- ๋งค์ถ ๊ฐ์ ์ถ์ธ: 32.5์ |
|
|
- ๊ณ ๊ฐ ์ ๊ฐ์: 25.8์ |
|
|
- ์ฌ์ด์ฉ๋ฅ ํ๋ฝ: 12.3์ |
|
|
``` |
|
|
|
|
|
## ํ๋ก์ ํธ ๊ตฌ์กฐ |
|
|
|
|
|
``` |
|
|
early_warning_ai_v2/ |
|
|
โโโ README.md # ์ด ํ์ผ |
|
|
โโโ CHANGELOG_V2.md # V2.0 ๊ฐ์ ์ฌํญ |
|
|
โโโ requirements.txt # ์์กด์ฑ |
|
|
โ |
|
|
โโโ data/ # ๋ฐ์ดํฐ ํด๋ |
|
|
โ โโโ raw/ # ์๋ณธ ๋ฐ์ดํฐ (์ฌ๊ธฐ์ CSV ํ์ผ ๋ฃ๊ธฐ) |
|
|
โ โโโ processed/ # ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ์๋ ์์ฑ) |
|
|
โ |
|
|
โโโ models/ # ํ์ต๋ ๋ชจ๋ธ(์๋ ์์ฑ) |
|
|
โ โโโ xgboost_model.pkl |
|
|
โ โโโ lightgbm_model.pkl |
|
|
โ โโโ config.json |
|
|
โ โโโ feature_names.json |
|
|
โ |
|
|
โโโ src/ # ์์ค ์ฝ๋ |
|
|
โ โโโ predictor.py # ์์ธก ํด๋์ค |
|
|
โ โโโ feature_engineering.py # ํน์ง ์์ฑ |
|
|
โ โโโ train.py # ํ์ต ์คํฌ๋ฆฝํธ |
|
|
โ โโโ utils.py # ์ ํธ๋ฆฌํฐ |
|
|
โ |
|
|
โโโ notebooks/ # Jupyter ๋
ธํธ๋ถ |
|
|
โโโ train_model.ipynb # ํ์ต ๋
ธํธ๋ถ |
|
|
``` |
|
|
|
|
|
## ์ฃผ์ ๊ธฐ๋ฅ |
|
|
|
|
|
### 1. ๋ค์ค ๊ธฐ๊ฐ ๋งค์ถ ๋ถ์ |
|
|
- 1๊ฐ์, 3๊ฐ์, 6๊ฐ์, 12๊ฐ์ ์ถ์ธ ๋์ ๋ถ์ |
|
|
- ๋จ๊ธฐ ์๊ธฐ์ ์ฅ๊ธฐ ํ๋ฝ ๋ชจ๋ ๊ฐ์ง |
|
|
|
|
|
### 2. ๊ณ ๊ฐ ํ๋ ๋ถ์ |
|
|
- ์ฌ์ด์ฉ๋ฅ ๋ณํ ์ถ์ |
|
|
- ์ ๊ท vs ๊ธฐ์กด ๊ณ ๊ฐ ๋น์จ |
|
|
- ์ฐ๋ น/์ฑ๋ณ ๊ตฌ์ฑ ๋ณํ |
|
|
|
|
|
### 3. ๊ณ์ ์ฑ ํจํด ๊ฐ์ง |
|
|
- ์
์ข
๋ณ ๊ณ์ ์ ๋งค์ถ ๋ณ๋ ๊ณ ๋ ค |
|
|
- ์ค๊ฒฝ๋ณด(False Positive) ๋ํญ ๊ฐ์ |
|
|
|
|
|
### 4. ์์๋ธ ๋ชจ๋ธ |
|
|
- XGBoost + LightGBM + CatBoost |
|
|
- ํ์ดํผํ๋ผ๋ฏธํฐ ์๋ ์ต์ ํ |
|
|
- ํด๋์ค ๋ถ๊ท ํ ์ฒ๋ฆฌ(SMOTE) |
|
|
|
|
|
### 5. ํด์ ๊ฐ๋ฅํ AI |
|
|
- ์ํ ์์ธ๋ณ ์ ์ํ |
|
|
- SHAP ๊ฐ ๊ธฐ๋ฐ ์ค๋ช
|
|
|
- ๊ตฌ์ฒด์ ์ธ ์ก์
์์ดํ
์ ๊ณต |
|
|
|
|
|
## ๋ชจ๋ธ ์ฑ๋ฅ |
|
|
|
|
|
### ํผ๋ ํ๋ ฌ (Test Set) |
|
|
|
|
|
| | ์์ธก: ์์
| ์์ธก: ํ์
| |
|
|
|--------------|-----------|-----------| |
|
|
| ์ค์ : ์์
| 581 (TN) | 13 (FP) | |
|
|
| ์ค์ : ํ์
| 3 (FN) | 30 (TP) | |
|
|
|
|
|
### ์ฃผ์ ์งํ |
|
|
|
|
|
- **Accuracy**: 97.2% |
|
|
- **Precision**: 89.3% - ํ์
์์ธก ์ 89.3%๊ฐ ์ค์ ํ์
|
|
|
- **Recall**: 85.7% - ์ค์ ํ์
์ 85.7%๋ฅผ ๊ฐ์ง |
|
|
- **F1-Score**: 87.4% |
|
|
- **AUC-ROC**: 0.964 |
|
|
|
|
|
## ์ฌ์ฉ ๋ฐฉ๋ฒ |
|
|
|
|
|
### ๋ฐ์ดํฐ ์์ ๋ฐฉ๋ฒ |
|
|
|
|
|
#### 1. ์๋ก์ด ๋ฐ์ดํฐ๋ก ํ์ต |
|
|
|
|
|
1. **๋ฐ์ดํฐ ์ค๋น**: `data/raw/` ํด๋์ 3๊ฐ์ CSV ํ์ผ ๋ฃ๊ธฐ |
|
|
- `big_data_set1_f.csv`: ๋งค์ฅ ๊ธฐ๋ณธ ์ ๋ณด (ํ์ ์ปฌ๋ผ: ENCODED_MCT, MCT_ME_D) |
|
|
- `ds2_monthly_usage.csv`: ์๋ณ ์ด์ฉ ๋ฐ์ดํฐ (ํ์ ์ปฌ๋ผ: ENCODED_MCT, TA_YM, RC_M1_SAA) |
|
|
- `ds3_monthly_customers.csv`: ์๋ณ ๊ณ ๊ฐ ๋ฐ์ดํฐ (ํ์ ์ปฌ๋ผ: ENCODED_MCT, TA_YM) |
|
|
|
|
|
2. **ํ์ต ์คํ**: `notebooks/train_model.ipynb` ์คํ |
|
|
|
|
|
3. **๋ชจ๋ธ ํ์ธ**: `models/` ํด๋์ ์์ฑ๋ ๋ชจ๋ธ ํ์ผ ํ์ธ |
|
|
|
|
|
#### 2. ์์ธก ํ๋ผ๋ฏธํฐ ์กฐ์ |
|
|
|
|
|
`src/predictor.py`์ `predict()` ๋ฉ์๋์์: |
|
|
|
|
|
```python |
|
|
# ์ํ๋ ์๊ณ๊ฐ ๋ณ๊ฒฝ (๊ธฐ๋ณธ: 0.5) |
|
|
result = model.predict(store_data, threshold=0.3) # ๋ ๋ฏผ๊ฐํ๊ฒ |
|
|
result = model.predict(store_data, threshold=0.7) # ๋ ๋ณด์์ ์ผ๋ก |
|
|
|
|
|
# ์์๋ธ ๊ฐ์ค์น ๋ณ๊ฒฝ |
|
|
# models/config.json์์: |
|
|
{ |
|
|
"ensemble_weights": [0.35, 0.35, 0.30] # XGBoost, LightGBM, CatBoost |
|
|
} |
|
|
``` |
|
|
|
|
|
#### 3. ํน์ง ์ถ๊ฐ/์์ |
|
|
|
|
|
`src/feature_engineering.py`์ `FeatureEngineer` ํด๋์ค์์: |
|
|
|
|
|
```python |
|
|
def _create_custom_features(self, df): |
|
|
"""์ปค์คํ
ํน์ง ์ถ๊ฐ""" |
|
|
features = {} |
|
|
|
|
|
# ์: ์๋ก์ด ์งํ ์ถ๊ฐ |
|
|
features['custom_metric'] = df['col1'] / df['col2'] |
|
|
|
|
|
return features |
|
|
``` |
|
|
|
|
|
### ๋ฐฐ์น ์์ธก |
|
|
|
|
|
```python |
|
|
import pandas as pd |
|
|
|
|
|
# CSV์์ ์ฌ๋ฌ ๋งค์ฅ ๋ก๋ |
|
|
stores = pd.read_csv('stores_to_predict.csv') |
|
|
|
|
|
# ๋ฐฐ์น ์์ธก |
|
|
results = model.predict_batch(stores) |
|
|
|
|
|
# ๊ณ ์ํ ๋งค์ฅ ํํฐ |
|
|
high_risk = results[results['risk_score'] > 70] |
|
|
high_risk.to_csv('high_risk_stores.csv', index=False) |
|
|
``` |
|
|
|
|
|
## ์ถ๊ฐ ๋ฌธ์ |
|
|
|
|
|
- [CHANGELOG_V2.md](CHANGELOG_V2.md) - V2.0 ์์ธ ๊ฐ์ ์ฌํญ |
|
|
- [notebooks/train_model.ipynb](notebooks/train_model.ipynb) - ์ ์ฒด ํ์ต ๊ณผ์ |
|
|
- [src/README.md](src/README.md) - ์์ค ์ฝ๋ ์ค๋ช
|
|
|
|
|
|
## ๊ธฐ์ฌ |
|
|
|
|
|
์ด์์ PR์ ํ์ํฉ๋๋ค! |
|
|
|
|
|
## ๋ผ์ด์ ์ค |
|
|
|
|
|
MIT License - ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ |
|
|
|
|
|
## ๋ฌธ์ |
|
|
|
|
|
- GitHub Issues: [์ด์ ๋ฑ๋ก](https://github.com/yourusername/early_warning_ai_v2/issues) |
|
|
|
|
|
--- |
|
|
|
|
|
**๋ฉด์ฑ
์กฐํญ**: ๋ณธ ๋ชจ๋ธ์ ์์ธก์ ์ฐธ๊ณ ์ฉ์ด๋ฉฐ, ์ค์ ๊ฒฝ์ ํ๋จ์ ์ ๋ฌธ๊ฐ์ ์๋ดํ์๊ธฐ ๋ฐ๋๋๋ค. |
|
|
|