amirulhaqm commited on
Commit
f0626a3
·
1 Parent(s): 6c53d33

Add Dockerfile, main.py, model.h5, requirements, scaler

Browse files
Files changed (5) hide show
  1. Dockerfile +24 -0
  2. main.py +104 -0
  3. model.h5 +3 -0
  4. requirements.txt +0 -0
  5. 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