amirulhaqm's picture
Add Dockerfile, main.py, model.h5, requirements, scaler
f0626a3
# -*- coding: utf-8 -*-
"""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
# Load model dan scaler
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)
# Fitur yang digunakan saat pelatihan
features = [
"age", "hypertension", "heart_disease", "bmi",
"female", "male",
"no_info_smoke", "current_smoke", "ever_smoke",
"former_smoke", "never_smoke", "no_current_smoke"
]
# Enum untuk input gender dan riwayat merokok
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"
# Skema input
class InputData(BaseModel):
age: int
hypertension: int
heart_disease: int
bmi: float
gender: Gender
smoking_history: Smoke
# Inisialisasi FastAPI
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()])
# One-hot encoding manual
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] # urutkan kolom
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))}