File size: 2,694 Bytes
f0626a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# -*- 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))}