# -*- 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))}