본 프로젝트는 가맹점의 다양한 데이터를(기본 정보, 고객, 매출) 기반으로 향후 폐업 위험을 예측하는 머신러닝 모델이다.
이 프로젝트는 2가지 모델(XGBoost, Random Forest)의 예측 확률을 조합하여 가맹점의 위험 상태를 [안전, 주의, 위험] 3단계로 분류한다.
최종 완성된 모델은 Flask와 Gunicorn을 통해 API 서버로 제공되며, Docker를 통해 컨테이너 환경에서 손쉽게 배포할 수 있도록 설계되었다.
이 프로젝트는 **학습(train.py)**과 **예측(predict.py)**의 파이프라인이 분리되어 있으며, preprocessing.py 모듈을 공유하여 데이터 일관성을 유지한다.
.
├── 📜 app.py # API 서버 실행 (Flask)
├── 📜 predict.py # API 요청 시 실제 예측 수행 로직
├── 📜 preprocessing.py # 데이터 전처리 및 피처 엔지니어링 모듈
|
├── 📜 train.py # 모델 학습 및 아티팩트(산출물) 생성 스크립트
├── 📜 check_importance.py # (유틸리티) 학습된 모델의 피처 중요도 시각화
|
├── 📦 dockerfile # API 서버 배포용 Docker 이미지 빌드 파일
├── 📦 requirements.txt # Python 의존성 패키지 목록
|
├── 💾 final_xgboost_model.pkl # (train.py 실행 후 생성됨)
├── 💾 final_randomforest_model.pkl # (train.py 실행 후 생성됨)
├── 💾 model_columns.json # (train.py 실행 후 생성됨)
├── 💾 industry_config.json # (train.py 실행 후 생성됨)
└── 💾 optimal_thresholds_final.json # (train.py 실행 후 생성됨)-
Raw 데이터(CSV)를 로드하여
preprocessing.py를 통해 피처 엔지니어링을 수행 -
XGBoost, Random Forest 두 모델을 학습
-
비즈니스 요구사항(특정 Recall/Precision)에 맞는 최적의 임계값(Threshold)을 계산
-
예측에 필요한 5가지 핵심 산출물(pkl 2개 + JSON 3개)을 저장
-
공통 전처리 로직을 담당
-
학습 모드 / 예측 모드 지원
-
수행 기능:
- 결측치 예측
- 원-핫 인코딩
- 스키마 정렬
- 업종/지역 등 카테고리 전처리
- 시간 기반 파생 변수 생성
-
API 서버가 시작 시 학습된 모델과 JSON config 5종 로드
-
get_prediction(raw_data_dict)실행 시- 입력 JSON 전처리
- 두 모델 확률 계산
- 임계값 기준으로 안전/주의/위험 등급 산출
- Flask 기반
/predict엔드포인트를 제공 - 클라이언트의 POST JSON 입력 ->
predict.py호출 -> JSON 출력
- 학습된 모델 두 개를 불러와 피처 중요도 시각화
xgb_feature_importance.png,rf_feature_importance.png생성
프로젝트 실행에 필요한 주요 패키지
pandas
scikit-learn
xgboost
Flask
gunicornpython:3.9-slim기반- 의존성 설치 후 전체 프로젝트 복사
- Gunicorn으로
app:app실행 (port 80)
pip install -r requirements.txttrain.py 내부의 PATH_INFO, PATH_CUSTOMER, PATH_SALES 경로를 실제 CSV 위치로 맞춘 뒤
python train.py실행 후 아래 5개 파일이 생성되어야 함
- final_xgboost_model.pkl
- final_randomforest_model.pkl
- model_columns.json
- industry_config.json
- optimal_thresholds_final.json
(선택) 피처 중요도 확인
python check_importance.pypython app.py
이미지 빌드
docker build -t store-closure-api .
컨테이너 실행
docker run -p 8000:80 store-closure-api
API 주소
http://localhost:8000/predict
요청 형식(JSON) predict.py -> preprocessing.py의 입력 스키마와 동일해야 함.
{
"TA_YM": 202310,
"HPSN_MCT_ZCD_NM": "커피전문점",
"MCT_BRD_NUM": "BRAND_ID_123",
"MCT_OPE_MS_CN": 15,
"DLV_SAA_RAT": 0.0,
"M12_MAL_1020_RAT": 0.15,
"M12_MAL_30_RAT": 0.25,
"M12_MAL_40_RAT": 0.20,
"M12_MAL_50_RAT": 0.10,
"M12_MAL_60_RAT": 0.05,
"MCT_UE_CLN_REU_RAT": 0.8,
"RC_M1_SHC_FLP_UE_CLN_RAT": 0.5,
"M12_SME_RY_ME_MCT_RAT": 1.2,
"M1SME_RY_SAA_RAT": 0.9,
"M1_SME_RY_CNT_RAT": 1.1,
"M12_SME_RY_SAA_PCE_RT": 30.0,
"ARE_D": "서울 강남구"
}{
"prediction_tier": "주의",
"xgb_probability": 0.625,
"rf_probability": 0.310,
"threshold_caution": 0.581,
"threshold_danger": 0.752
}{
"error": "예측 중 오류 발생: 'M12_MAL_1020_RAT' key not found"
}