WildOjisan commited on
Commit
ae02f3c
ยท
1 Parent(s): 67f4842
Files changed (2) hide show
  1. app.py +69 -0
  2. requirements.txt +5 -1
app.py ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI, HTTPException
2
+ from pydantic import BaseModel
3
+ import pandas as pd
4
+ from catboost import CatBoostRegressor
5
+ import os
6
+
7
+ app = FastAPI(title="Hospital Recommendation Model")
8
+
9
+ # 1. ๋ชจ๋ธ ์„ค์ • ๋ฐ ๋กœ๋“œ
10
+ MODEL_PATH = 'catboost_model.bin'
11
+ model = CatBoostRegressor()
12
+
13
+ # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ ๋ชจ๋ธ ๋กœ๋“œ
14
+ if os.path.exists(MODEL_PATH):
15
+ try:
16
+ model.load_model(MODEL_PATH)
17
+ print(f"โœ… CatBoost ๋ชจ๋ธ์„ '{MODEL_PATH}'์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.")
18
+ except Exception as e:
19
+ print(f"โŒ ๋ชจ๋ธ ๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
20
+ # ์‹ค์ œ ๋ฐฐํฌ์‹œ์—๋Š” ๋ชจ๋ธ์ด ์—†์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๊ฒŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
21
+ else:
22
+ print(f"โš ๏ธ ๊ฒฝ๊ณ : '{MODEL_PATH}' ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.")
23
+
24
+ # 2. ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ์„ ์œ„ํ•œ Pydantic ๋ชจ๋ธ ์ •์˜
25
+ class HospitalInput(BaseModel):
26
+ distance_m: float # ๊ฑฐ๋ฆฌ (๋ฏธํ„ฐ)
27
+ rating: float # ํ‰์ 
28
+ congestion_level: int # ํ˜ผ์žก๋„ (1~5 ๋“ฑ)
29
+
30
+ class Config:
31
+ json_schema_extra = {
32
+ "example": {
33
+ "distance_m": 500,
34
+ "rating": 4.5,
35
+ "congestion_level": 2
36
+ }
37
+ }
38
+
39
+ # 3. ์˜ˆ์ธก ์—”๋“œํฌ์ธํŠธ
40
+ @app.post("/predict")
41
+ def predict_recommendation(input_data: HospitalInput):
42
+ # ๋ชจ๋ธ์ด ๋กœ๋“œ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
43
+ if model.tree_count_ is None:
44
+ raise HTTPException(status_code=500, detail="Model is not loaded.")
45
+
46
+ try:
47
+ # ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ DataFrame์œผ๋กœ ๋ณ€ํ™˜ (ํŠน์„ฑ ์ด๋ฆ„๊ณผ ์ˆœ์„œ๋ฅผ ๋งž์ถค)
48
+ # ํ•™์Šต ์‹œ ์ˆœ์„œ: ['distance_m', 'rating', 'congestion_level']
49
+ data_df = pd.DataFrame([{
50
+ 'distance_m': input_data.distance_m,
51
+ 'rating': input_data.rating,
52
+ 'congestion_level': input_data.congestion_level
53
+ }])
54
+
55
+ # ์˜ˆ์ธก ์ˆ˜ํ–‰
56
+ prediction = model.predict(data_df)
57
+
58
+ # ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ (float ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜)
59
+ return {
60
+ "status": "success",
61
+ "predicted_score": float(prediction[0])
62
+ }
63
+ except Exception as e:
64
+ raise HTTPException(status_code=500, detail=str(e))
65
+
66
+ # 4. ํ—ฌ์Šค ์ฒดํฌ (์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ์šฉ)
67
+ @app.get("/")
68
+ def read_root():
69
+ return {"message": "Hospital Recommendation API is running"}
requirements.txt CHANGED
@@ -11,4 +11,8 @@ python-mecab-ko
11
  soynlp
12
  datasets
13
  evaluate
14
- accelerate
 
 
 
 
 
11
  soynlp
12
  datasets
13
  evaluate
14
+ accelerate
15
+ fastapi
16
+ uvicorn
17
+ catboost
18
+ pydantic