|
|
|
|
|
"""main.ipynb |
|
|
|
|
|
Automatically generated by Colab. |
|
|
|
|
|
Original file is located at |
|
|
https://colab.research.google.com/drive/1BUdDfCHYR8XGZnFHDOP2QK8rR1GXqNv3 |
|
|
""" |
|
|
|
|
|
import os |
|
|
import numpy as np |
|
|
import pandas as pd |
|
|
import joblib |
|
|
import tensorflow as tf |
|
|
from fastapi import FastAPI, HTTPException |
|
|
from pydantic import BaseModel |
|
|
from enum import Enum |
|
|
|
|
|
|
|
|
model_path = "model.h5" |
|
|
scaler_path = "scaler.joblib" |
|
|
|
|
|
try: |
|
|
model = tf.keras.models.load_model(model_path, compile=False) |
|
|
scaler = joblib.load(scaler_path) |
|
|
except Exception as e: |
|
|
model = None |
|
|
scaler = None |
|
|
print("Gagal memuat model atau scaler:", e) |
|
|
|
|
|
|
|
|
features = [ |
|
|
"age", "hypertension", "heart_disease", "bmi", |
|
|
"female", "male", |
|
|
"no_info_smoke", "current_smoke", "ever_smoke", |
|
|
"former_smoke", "never_smoke", "no_current_smoke" |
|
|
] |
|
|
|
|
|
|
|
|
class Gender(str, Enum): |
|
|
female = "Female" |
|
|
male = "Male" |
|
|
|
|
|
class Smoke(str, Enum): |
|
|
never = "never" |
|
|
no_info = "No Info" |
|
|
current = "current" |
|
|
ever = "ever" |
|
|
former = "former" |
|
|
not_current = "not current" |
|
|
|
|
|
|
|
|
class InputData(BaseModel): |
|
|
age: int |
|
|
hypertension: int |
|
|
heart_disease: int |
|
|
bmi: float |
|
|
gender: Gender |
|
|
smoking_history: Smoke |
|
|
|
|
|
|
|
|
app = FastAPI(title="Simple Diabetes Predictor") |
|
|
|
|
|
@app.get("/") |
|
|
def home(): |
|
|
return {"message": "API siap digunakan"} |
|
|
|
|
|
@app.post("/predict/") |
|
|
def predict(data: InputData): |
|
|
if model is None or scaler is None: |
|
|
raise HTTPException(status_code=500, detail="Model belum dimuat.") |
|
|
|
|
|
df = pd.DataFrame([data.dict()]) |
|
|
|
|
|
|
|
|
df["female"] = int(data.gender == "Female") |
|
|
df["male"] = int(data.gender == "Male") |
|
|
|
|
|
for col in ["no_info_smoke", "current_smoke", "ever_smoke", "former_smoke", "never_smoke", "no_current_smoke"]: |
|
|
df[col] = 0 |
|
|
|
|
|
smoke_map = { |
|
|
"No Info": "no_info_smoke", |
|
|
"current": "current_smoke", |
|
|
"ever": "ever_smoke", |
|
|
"former": "former_smoke", |
|
|
"never": "never_smoke", |
|
|
"not current": "no_current_smoke" |
|
|
} |
|
|
smoke_col = smoke_map.get(data.smoking_history.value, None) |
|
|
if smoke_col: |
|
|
df[smoke_col] = 1 |
|
|
|
|
|
df = df[features] |
|
|
scaled = scaler.transform(df) |
|
|
pred = model.predict(scaled)[0] |
|
|
|
|
|
if len(pred) == 1: |
|
|
prob = float(pred[0]) |
|
|
label = int(prob > 0.5) |
|
|
return {"diabetes_probability": round(prob, 4), "prediction": label} |
|
|
else: |
|
|
prob = float(pred[1]) |
|
|
return {"diabetes_probability": round(prob, 4), "prediction": int(np.argmax(pred))} |