Commit
·
f0626a3
1
Parent(s):
6c53d33
Add Dockerfile, main.py, model.h5, requirements, scaler
Browse files- Dockerfile +24 -0
- main.py +104 -0
- model.h5 +3 -0
- requirements.txt +0 -0
- scaler.joblib +3 -0
Dockerfile
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Gunakan base image Python yang kompatibel dengan TensorFlow di requirements.txt Anda
|
| 2 |
+
# Python 3.10 atau 3.11 direkomendasikan untuk TensorFlow versi terbaru.
|
| 3 |
+
FROM python:3.10-slim
|
| 4 |
+
|
| 5 |
+
# Set direktori kerja di dalam container
|
| 6 |
+
WORKDIR /app
|
| 7 |
+
|
| 8 |
+
# Salin file requirements.txt terlebih dahulu untuk memanfaatkan cache Docker
|
| 9 |
+
COPY requirements.txt .
|
| 10 |
+
|
| 11 |
+
# Instal semua dependensi Python dari requirements.txt
|
| 12 |
+
# --no-cache-dir digunakan untuk mengurangi ukuran image
|
| 13 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 14 |
+
|
| 15 |
+
# Salin semua file proyek lainnya (main.py, model.h5, scaler.joblib, dll.)
|
| 16 |
+
# ke dalam direktori kerja (/app) di container.
|
| 17 |
+
COPY . .
|
| 18 |
+
|
| 19 |
+
# Ekspos port tempat aplikasi FastAPI akan berjalan (sesuai dengan CMD di bawah)
|
| 20 |
+
EXPOSE 7860
|
| 21 |
+
|
| 22 |
+
# Perintah untuk menjalankan aplikasi FastAPI menggunakan Uvicorn
|
| 23 |
+
# "--host 0.0.0.0" membuat aplikasi dapat diakses dari luar container.
|
| 24 |
+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
|
main.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""main.ipynb
|
| 3 |
+
|
| 4 |
+
Automatically generated by Colab.
|
| 5 |
+
|
| 6 |
+
Original file is located at
|
| 7 |
+
https://colab.research.google.com/drive/1BUdDfCHYR8XGZnFHDOP2QK8rR1GXqNv3
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
import os
|
| 11 |
+
import numpy as np
|
| 12 |
+
import pandas as pd
|
| 13 |
+
import joblib
|
| 14 |
+
import tensorflow as tf
|
| 15 |
+
from fastapi import FastAPI, HTTPException
|
| 16 |
+
from pydantic import BaseModel
|
| 17 |
+
from enum import Enum
|
| 18 |
+
|
| 19 |
+
# Load model dan scaler
|
| 20 |
+
model_path = "model.h5"
|
| 21 |
+
scaler_path = "scaler.joblib"
|
| 22 |
+
|
| 23 |
+
try:
|
| 24 |
+
model = tf.keras.models.load_model(model_path, compile=False)
|
| 25 |
+
scaler = joblib.load(scaler_path)
|
| 26 |
+
except Exception as e:
|
| 27 |
+
model = None
|
| 28 |
+
scaler = None
|
| 29 |
+
print("Gagal memuat model atau scaler:", e)
|
| 30 |
+
|
| 31 |
+
# Fitur yang digunakan saat pelatihan
|
| 32 |
+
features = [
|
| 33 |
+
"age", "hypertension", "heart_disease", "bmi",
|
| 34 |
+
"female", "male",
|
| 35 |
+
"no_info_smoke", "current_smoke", "ever_smoke",
|
| 36 |
+
"former_smoke", "never_smoke", "no_current_smoke"
|
| 37 |
+
]
|
| 38 |
+
|
| 39 |
+
# Enum untuk input gender dan riwayat merokok
|
| 40 |
+
class Gender(str, Enum):
|
| 41 |
+
female = "Female"
|
| 42 |
+
male = "Male"
|
| 43 |
+
|
| 44 |
+
class Smoke(str, Enum):
|
| 45 |
+
never = "never"
|
| 46 |
+
no_info = "No Info"
|
| 47 |
+
current = "current"
|
| 48 |
+
ever = "ever"
|
| 49 |
+
former = "former"
|
| 50 |
+
not_current = "not current"
|
| 51 |
+
|
| 52 |
+
# Skema input
|
| 53 |
+
class InputData(BaseModel):
|
| 54 |
+
age: int
|
| 55 |
+
hypertension: int
|
| 56 |
+
heart_disease: int
|
| 57 |
+
bmi: float
|
| 58 |
+
gender: Gender
|
| 59 |
+
smoking_history: Smoke
|
| 60 |
+
|
| 61 |
+
# Inisialisasi FastAPI
|
| 62 |
+
app = FastAPI(title="Simple Diabetes Predictor")
|
| 63 |
+
|
| 64 |
+
@app.get("/")
|
| 65 |
+
def home():
|
| 66 |
+
return {"message": "API siap digunakan"}
|
| 67 |
+
|
| 68 |
+
@app.post("/predict/")
|
| 69 |
+
def predict(data: InputData):
|
| 70 |
+
if model is None or scaler is None:
|
| 71 |
+
raise HTTPException(status_code=500, detail="Model belum dimuat.")
|
| 72 |
+
|
| 73 |
+
df = pd.DataFrame([data.dict()])
|
| 74 |
+
|
| 75 |
+
# One-hot encoding manual
|
| 76 |
+
df["female"] = int(data.gender == "Female")
|
| 77 |
+
df["male"] = int(data.gender == "Male")
|
| 78 |
+
|
| 79 |
+
for col in ["no_info_smoke", "current_smoke", "ever_smoke", "former_smoke", "never_smoke", "no_current_smoke"]:
|
| 80 |
+
df[col] = 0
|
| 81 |
+
|
| 82 |
+
smoke_map = {
|
| 83 |
+
"No Info": "no_info_smoke",
|
| 84 |
+
"current": "current_smoke",
|
| 85 |
+
"ever": "ever_smoke",
|
| 86 |
+
"former": "former_smoke",
|
| 87 |
+
"never": "never_smoke",
|
| 88 |
+
"not current": "no_current_smoke"
|
| 89 |
+
}
|
| 90 |
+
smoke_col = smoke_map.get(data.smoking_history.value, None)
|
| 91 |
+
if smoke_col:
|
| 92 |
+
df[smoke_col] = 1
|
| 93 |
+
|
| 94 |
+
df = df[features] # urutkan kolom
|
| 95 |
+
scaled = scaler.transform(df)
|
| 96 |
+
pred = model.predict(scaled)[0]
|
| 97 |
+
|
| 98 |
+
if len(pred) == 1:
|
| 99 |
+
prob = float(pred[0])
|
| 100 |
+
label = int(prob > 0.5)
|
| 101 |
+
return {"diabetes_probability": round(prob, 4), "prediction": label}
|
| 102 |
+
else:
|
| 103 |
+
prob = float(pred[1])
|
| 104 |
+
return {"diabetes_probability": round(prob, 4), "prediction": int(np.argmax(pred))}
|
model.h5
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:410846166ffcb5ee46577a4871e3f59f1b81ffb072ab571dd016db75d65f297c
|
| 3 |
+
size 17960
|
requirements.txt
ADDED
|
Binary file (170 Bytes). View file
|
|
|
scaler.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2843a8c45446955abb8d70dad272bb71de19f6f26469024bcb788bb1938af0ac
|
| 3 |
+
size 903
|