Skip to main content

Membangun Machine Learning hingga Deploy Menggunakan Streamlit dan GitHub

· 60 min read
Ucup TopekoX
Ucup TopekoX
TimposuLabs creator

Machine learning tidak berhenti ketika model berhasil dilatih. Dalam proyek nyata, model perlu dikemas menjadi sebuah aplikasi agar dapat digunakan oleh pengguna.

Pada tutorial ini kita akan membangun proyek machine learning klasifikasi kualitas jeruk mulai dari membaca dataset, memahami data, melakukan exploratory data analysis (EDA), preprocessing, training model, evaluasi, menyimpan model, membuat aplikasi menggunakan Streamlit, hingga melakukan deployment melalui GitHub.

Proyek ini menggunakan dataset jeruk_balance_500.csv dengan 500 data dan 8 kolom. Model yang digunakan adalah Logistic Regression yang dikombinasikan dengan StandardScaler, OneHotEncoder, OrdinalEncoder, ColumnTransformer, dan Pipeline.

Alur keseluruhan proyek:

Dataset
↓
Load Data
↓
Data Understanding
↓
Exploratory Data Analysis
↓
Preprocessing
↓
Train-Test Split
↓
Model Training
↓
Evaluation
↓
Prediction
↓
Save Model
↓
Streamlit Application
↓
GitHub
↓
Streamlit Community Cloud
↓
Aplikasi Online

1. Gambaran Proyek​

Kita akan membuat sistem yang dapat memprediksi kualitas jeruk berdasarkan beberapa karakteristik.

Input yang digunakan:

  • Diameter
  • Berat
  • Tebal kulit
  • Kadar gula
  • Asal daerah
  • Warna
  • Musim panen

Output model:

  • Bagus
  • Sedang
  • Jelek

Secara sederhana:

Karakteristik Jeruk
↓
Machine Learning
↓
Logistic Regression
↓
Prediksi Kualitas Jeruk
↓
Bagus / Sedang / Jelek

Model kemudian disimpan ke dalam file:

model_klasifikasi_jeruk.joblib

File tersebut akan digunakan oleh aplikasi Streamlit sehingga aplikasi tidak perlu melatih model kembali setiap kali dijalankan.


2. Struktur Project​

Sebelum mulai, buat struktur project seperti berikut:

klasifikasi-jeruk/
│
├── data/
│ └── jeruk_balance_500.csv
│
├── notebook/
│ └── klasifikasi_jeruk.ipynb
│
├── model_klasifikasi_jeruk.joblib
│
├── app.py
│
├── requirements.txt
│
└── README.md

Untuk deployment sederhana, sebenarnya struktur dapat dibuat lebih sederhana:

klasifikasi-jeruk/
│
├── app.py
├── model_klasifikasi_jeruk.joblib
├── requirements.txt
├── README.md
└── jeruk_balance_500.csv

Dataset tidak harus disertakan apabila aplikasi hanya membutuhkan model hasil training.


3. Menyiapkan Environment Python​

Sebaiknya project machine learning menggunakan environment tersendiri agar dependency antarproject tidak saling bertabrakan.

Contoh menggunakan Conda:

conda create -n ml-jeruk python=3.12

Aktifkan environment:

conda activate ml-jeruk

Kemudian install library:

pip install pandas matplotlib scikit-learn joblib streamlit

Library yang digunakan:

LibraryKegunaan
PandasMembaca dan mengolah dataset
MatplotlibMembuat visualisasi
Scikit-learnPreprocessing, training dan evaluasi
JoblibMenyimpan model
StreamlitMembuat aplikasi web
PythonBahasa pemrograman

4. Memuat Dataset​

Dataset yang digunakan bernama:

jeruk_balance_500.csv

Notebook memuat dataset menggunakan Pandas:

import pandas as pd

df = pd.read_csv("jeruk_balance_500.csv")

df

Dataset berisi:

500 rows × 8 columns

Kolom yang tersedia:

diameter
berat
tebal_kulit
kadar_gula
asal_daerah
warna
musim_panen
kualitas

Hal ini sesuai dengan hasil notebook ketika dataset pertama kali dimuat.


5. Memahami Struktur Dataset​

Melihat ukuran dataset​

Gunakan:

df.shape

Output:

(500, 8)

Artinya terdapat:

  • 500 baris
  • 8 kolom

Notebook menghasilkan ukuran dataset (500, 8).

Melihat nama kolom​

df.columns

Output:

Index([
'diameter',
'berat',
'tebal_kulit',
'kadar_gula',
'asal_daerah',
'warna',
'musim_panen',
'kualitas'
])

Melihat informasi dataset​

df.info()

Hasil notebook menunjukkan bahwa seluruh 500 baris memiliki nilai pada seluruh kolom.

Empat kolom numerik memiliki tipe float64, sedangkan empat kolom lainnya berupa data string.


6. Memahami Feature dan Target​

Dalam supervised learning terdapat dua bagian utama:

Feature
↓
Input untuk model

Target
↓
Jawaban yang ingin diprediksi

Pada proyek ini:

Feature​

X = df[
[
'diameter',
'berat',
'tebal_kulit',
'kadar_gula',
'asal_daerah',
'warna',
'musim_panen'
]
]

Target​

y = df['kualitas']

Dengan demikian:

X
├── diameter
├── berat
├── tebal_kulit
├── kadar_gula
├── asal_daerah
├── warna
└── musim_panen

y
└── kualitas

Notebook menggunakan tujuh feature tersebut untuk memprediksi kolom kualitas.


7. Exploratory Data Analysis​

EDA dilakukan sebelum training untuk memahami pola data.

Beberapa informasi statistik numerik dari dataset:

FeatureMeanMinimumMaximum
Diameter6.5147803.998.73
Berat150.67060074.4277.1
Tebal Kulit0.7304600.271.62
Kadar Gula10.0202005.814.6

Nilai tersebut berasal dari df.describe() pada notebook.

EDA membantu menjawab pertanyaan seperti:

  • Bagaimana hubungan ukuran jeruk dengan beratnya?
  • Apakah kadar gula berkaitan dengan ketebalan kulit?
  • Apakah data dari kelas Bagus, Sedang, dan Jelek memiliki pola tertentu?
  • Apakah terdapat pemisahan pola antar kelas?

Dalam notebook, dua visualisasi utama digunakan untuk melihat hubungan antarfeature tersebut.


8. Visualisasi 1 - Diameter vs Berat​

Visualisasi pertama menggunakan scatter plot untuk melihat hubungan antara diameter dan berat jeruk.

Notebook membagi data berdasarkan kualitas:

bagus = df[df["kualitas"] == "Bagus"]
sedang = df[df["kualitas"] == "Sedang"]
jelek = df[df["kualitas"] == "Jelek"]

Kemudian dibuat scatter plot:

import matplotlib.pyplot as plt

plt.style.use('default')

bagus = df[df["kualitas"] == "Bagus"]
sedang = df[df["kualitas"] == "Sedang"]
jelek = df[df["kualitas"] == "Jelek"]

plt.figure(figsize=(6, 5))

plt.scatter(
bagus["diameter"],
bagus["berat"],
s=100,
alpha=0.7,
color="green",
label="Bagus"
)

plt.scatter(
sedang["diameter"],
sedang["berat"],
s=100,
alpha=0.7,
color="orange",
label="Sedang"
)

plt.scatter(
jelek["diameter"],
jelek["berat"],
s=100,
alpha=0.7,
color="red",
label="Jelek"
)

plt.xlabel("Diameter")
plt.ylabel("Berat")
plt.title("Diameter vs Berat")
plt.legend()

plt.grid(True, linestyle="--", alpha=0.3)

plt.show()

Kode tersebut merupakan visualisasi yang digunakan di notebook.

visualisasi

Tujuan visualisasi​

Scatter plot digunakan untuk melihat apakah terdapat hubungan antara:

Diameter
↕
Berat

sekaligus melihat penyebaran masing-masing kelas kualitas.

Apa yang diamati?​

Perhatikan:

  • posisi titik pada sumbu X;
  • posisi titik pada sumbu Y;
  • kepadatan titik;
  • apakah kelas Bagus, Sedang, dan Jelek membentuk pola berbeda;
  • apakah terdapat titik yang jauh dari kelompok lainnya.

Interpretasi​

Jika kelompok kelas terlihat memiliki pola yang cukup berbeda, feature tersebut berpotensi membantu model melakukan klasifikasi.

Namun, visualisasi tidak cukup untuk membuktikan bahwa diameter dan berat merupakan penyebab kualitas jeruk. Visualisasi hanya menunjukkan pola pada dataset.


9. Visualisasi 2 - Tebal Kulit vs Kadar Gula​

Visualisasi kedua melihat hubungan:

Tebal Kulit
↕
Kadar Gula

Notebook menggunakan kode:

import matplotlib.pyplot as plt

bagus = df[df["kualitas"] == "Bagus"]
sedang = df[df["kualitas"] == "Sedang"]
jelek = df[df["kualitas"] == "Jelek"]

plt.figure(figsize=(6, 5))

plt.scatter(
bagus["tebal_kulit"],
bagus["kadar_gula"],
s=100,
alpha=0.7,
color="green",
label="Bagus"
)

plt.scatter(
sedang["tebal_kulit"],
sedang["kadar_gula"],
s=100,
alpha=0.7,
color="orange",
label="Sedang"
)

plt.scatter(
jelek["tebal_kulit"],
jelek["kadar_gula"],
s=100,
alpha=0.7,
color="red",
label="Jelek"
)

plt.xlabel("Tebal Kulit")
plt.ylabel("Kadar Gula")
plt.title("Tebal Kulit vs Kadar Gula")
plt.legend()

plt.grid(True, linestyle="--", alpha=0.3)

plt.show()

Visualisasi ini juga merupakan bagian dari notebook asli.

Visualisasi

Tujuan visualisasi​

Visualisasi digunakan untuk melihat apakah terdapat pola hubungan antara:

  • ketebalan kulit;
  • kadar gula;
  • kualitas jeruk.

Interpretasi​

Jika titik-titik berdasarkan kelas kualitas membentuk kelompok atau pola tertentu, informasi tersebut dapat membantu memahami mengapa model dapat melakukan klasifikasi.

Namun sekali lagi, scatter plot hanya menunjukkan pola data, bukan hubungan sebab-akibat.


10. Mengapa Visualisasi Penting?​

Visualisasi bukan sekadar membuat notebook terlihat menarik.

Dalam machine learning, visualisasi membantu kita memahami:

Data
↓
Pola
↓
Hubungan Feature
↓
Kemungkinan Informasi yang Berguna
↓
Model

Misalnya jika feature tertentu tidak menunjukkan variasi yang berarti antar kelas, feature tersebut mungkin kurang informatif.

Sebaliknya, apabila terdapat pola yang cukup jelas, feature tersebut berpotensi memberikan informasi yang berguna untuk model.


11. Membagi Data Training dan Testing​

Setelah memahami data, dataset dibagi menjadi:

80% Training
20% Testing

Notebook menggunakan:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42
)

Parameter:

test_size=0.2

berarti 20% data digunakan sebagai data testing.

Sedangkan:

random_state=42

digunakan agar pembagian data dapat direproduksi.


12. Memisahkan Feature Berdasarkan Jenis Data​

Tidak semua feature dapat diproses dengan cara yang sama.

Notebook membagi feature menjadi tiga kelompok.

Feature numerik​

numerical_collumns = [
'diameter',
'berat',
'tebal_kulit',
'kadar_gula'
]

Feature kategorikal​

categorical_collumns = [
'asal_daerah',
'musim_panen'
]

Feature ordinal​

ordinal_collumns = [
'warna'
]

Notebook menggunakan warna sebagai data ordinal dan menetapkan urutan:

warna_order = [
'hijau',
'kuning',
'oranye'
]

Urutan tersebut kemudian digunakan oleh OrdinalEncoder.


13. StandardScaler​

Feature numerik memiliki skala yang berbeda.

Contohnya:

diameter → sekitar 4–9
berat → sekitar 74–277
tebal_kulit → sekitar 0.27–1.62
kadar_gula → sekitar 5.8–14.6

Perbedaan skala tersebut dapat memengaruhi algoritma tertentu.

Karena itu notebook menggunakan:

StandardScaler()

untuk feature numerik.

Secara sederhana standardisasi mengubah data sehingga memiliki skala berdasarkan:

z = (x - mean) / standard deviation

14. OneHotEncoder​

Feature:

asal_daerah
musim_panen

merupakan data kategorikal.

Contohnya:

asal_daerah:
- Kalimantan
- Jawa Barat
- Jawa Tengah

Machine learning membutuhkan representasi numerik sehingga kategori tersebut diproses menggunakan:

OneHotEncoder()

Konsep sederhananya:

Kalimantan
Jawa Barat
Jawa Tengah

diubah menjadi representasi numerik berbasis kolom indikator.


15. OrdinalEncoder​

Berbeda dengan kategori biasa, warna memiliki urutan yang ditentukan dalam notebook:

hijau
↓
kuning
↓
oranye

Notebook menggunakan:

OrdinalEncoder(
categories=[[
'hijau',
'kuning',
'oranye'
]]
)

Tujuannya adalah mempertahankan informasi urutan yang telah ditentukan.


16. ColumnTransformer​

Ketiga preprocessing tersebut kemudian digabungkan menggunakan ColumnTransformer:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import (
StandardScaler,
OneHotEncoder,
OrdinalEncoder
)

warna_order = ['hijau', 'kuning', 'oranye']

ordinal_order = [warna_order]

preprocessor = ColumnTransformer(
transformers=[
(
"scaller",
StandardScaler(),
numerical_collumns
),
(
"onehot",
OneHotEncoder(),
categorical_collumns
),
(
"ordinal",
OrdinalEncoder(
categories=ordinal_order
),
ordinal_collumns
)
]
)

Dengan pendekatan tersebut, preprocessing dapat dilakukan secara terstruktur berdasarkan tipe feature.


17. Pipeline Machine Learning​

Notebook kemudian menggabungkan preprocessing dengan algoritma machine learning menggunakan Pipeline.

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression

model = Pipeline(
steps=[
(
"preprocessor",
preprocessor
),
(
"classifier",
LogisticRegression()
)
]
)

Strukturnya:

Data
↓
Preprocessor
├── StandardScaler
├── OneHotEncoder
└── OrdinalEncoder
↓
Logistic Regression
↓
Prediction

Pipeline sangat berguna karena preprocessing dan model menjadi satu kesatuan.


18. Mengapa Pipeline Penting?​

Bayangkan preprocessing dilakukan secara manual.

Saat training:

Training Data
↓
Scaling
↓
Encoding
↓
Model

Kemudian ketika melakukan prediction:

Data Baru
↓
Scaling
↓
Encoding
↓
Model

Proses preprocessing harus konsisten.

Dengan Pipeline, proses tersebut dapat dikemas menjadi satu object model:

Input Data
↓
Pipeline
├── Preprocessing
└── Model
↓
Prediction

Inilah salah satu alasan mengapa model yang disimpan dari notebook dapat langsung digunakan oleh aplikasi Streamlit.


19. Training Model​

Model dilatih menggunakan data training:

model.fit(X_train, y_train)

Pada tahap ini model mempelajari hubungan antara:

Feature
↓
Kualitas

Model menggunakan:

diameter
berat
tebal_kulit
kadar_gula
asal_daerah
warna
musim_panen

untuk mempelajari target:

Bagus
Sedang
Jelek

20. Membuat Prediksi Data Testing​

Setelah training:

y_pred = model.predict(X_test)

Variabel:

y_test

berisi label sebenarnya.

Sedangkan:

y_pred

berisi hasil prediksi model.

Keduanya kemudian dibandingkan untuk mengevaluasi performa model.


21. Evaluasi Model​

Notebook menggunakan:

from sklearn.metrics import (
accuracy_score,
classification_report,
confusion_matrix
)

Kemudian:

print(
"Akurasi Model: ",
accuracy_score(y_test, y_pred)
)

print(
"\nClassification Report:\n",
classification_report(y_test, y_pred)
)

print(
"\nConfusion Matrix:\n",
confusion_matrix(y_test, y_pred)
)

Hasil eksperimen pada notebook:

Akurasi Model: 0.99

Classification report:

precision recall f1-score support

Bagus 1.00 1.00 1.00 35
Jelek 1.00 0.98 0.99 41
Sedang 0.96 1.00 0.98 24

accuracy 0.99 100
macro avg 0.99 0.99 0.99 100
weighted avg 0.99 0.99 0.99 100

Hasil tersebut merupakan hasil eksperimen yang tersimpan pada notebook, bukan angka ilustrasi.


22. Memahami Accuracy​

Accuracy menunjukkan proporsi prediksi yang benar dari seluruh data testing.

Pada eksperimen:

Accuracy = 0.99

atau:

99%

Data testing berjumlah 100 data.

Secara sederhana:

100 data testing
↓
99 prediksi benar
↓
1 prediksi salah

Namun accuracy saja tidak selalu cukup untuk menilai model.

Karena itu digunakan pula:

  • precision;
  • recall;
  • F1-score;
  • confusion matrix.

23. Memahami Precision​

Precision menjawab pertanyaan:

Dari seluruh data yang diprediksi sebagai suatu kelas, berapa banyak yang benar-benar termasuk kelas tersebut?

Pada hasil eksperimen:

Bagus → 1.00
Jelek → 1.00
Sedang → 0.96

Precision kelas Sedang lebih rendah dibandingkan dua kelas lainnya.


24. Memahami Recall​

Recall menjawab:

Dari seluruh data yang sebenarnya termasuk suatu kelas, berapa banyak yang berhasil ditemukan model?

Hasil:

Bagus → 1.00
Jelek → 0.98
Sedang → 1.00

Recall kelas Jelek sedikit lebih rendah karena terdapat satu data Jelek yang diprediksi sebagai kelas lain.


25. Memahami F1-Score​

F1-score merupakan ukuran yang menggabungkan precision dan recall.

Hasil eksperimen:

Bagus → 1.00
Jelek → 0.99
Sedang → 0.98

Nilai tersebut menunjukkan performa model pada ketiga kelas cukup tinggi pada data testing yang digunakan.


26. Confusion Matrix​

Confusion matrix dari notebook:

[[35 0 0]
[ 0 40 1]
[ 0 0 24]]

Secara konseptual:

AktualPrediksi BagusPrediksi JelekPrediksi Sedang
Bagus3500
Jelek0401
Sedang0024

Confusion matrix menunjukkan bahwa terdapat satu kesalahan klasifikasi pada kelas Jelek, sementara data lainnya pada testing diklasifikasikan sesuai label aktual.


27. Membuat Prediksi Data Baru​

Setelah model selesai dibuat, kita dapat menggunakannya untuk memprediksi data baru.

Contoh data:

data_baru = pd.DataFrame(
[[
7.5,
150,
0.5,
12,
"Jawa Tengah",
"hijau",
"hujan"
]],
columns=[
'diameter',
'berat',
'tebal_kulit',
'kadar_gula',
'asal_daerah',
'warna',
'musim_panen'
]
)

Kemudian:

prediksi = model.predict(data_baru)[0]

prediksi_proba = model.predict_proba(
data_baru
)[0]

presentase = max(prediksi_proba)

print(
f"Hasil prediksi {prediksi} "
f"dengan tingkat keyakinan "
f"{presentase * 100:.2f}%"
)

Notebook menghasilkan:

Hasil prediksi Sedang dengan tingkat keyakinan 83.21%

28. Memahami Probabilitas Prediksi​

predict_proba() menghasilkan probabilitas untuk masing-masing kelas.

Contohnya secara konsep:

Bagus → probabilitas tertentu
Jelek → probabilitas tertentu
Sedang → probabilitas tertentu

Kemudian notebook mengambil probabilitas terbesar:

presentase = max(prediksi_proba)

Perlu diperhatikan bahwa nilai tersebut lebih tepat disebut probabilitas/keyakinan model, bukan jaminan bahwa prediksi benar.


29. Menyimpan Model​

Setelah model selesai dilatih, model tidak perlu dilatih kembali ketika aplikasi digunakan.

Model disimpan menggunakan Joblib:

import joblib

joblib.dump(
model,
"model_klasifikasi_jeruk.joblib"
)

Notebook menghasilkan:

['model_klasifikasi_jeruk.joblib']

File tersebut sangat penting karena akan digunakan oleh Streamlit.


30. Mengapa Model Disimpan?​

Tanpa menyimpan model, aplikasi harus melakukan:

Load Dataset
↓
Preprocessing
↓
Training
↓
Model
↓
Prediction

setiap kali aplikasi dijalankan.

Hal tersebut tidak ideal.

Dengan model yang sudah disimpan:

model_klasifikasi_jeruk.joblib
↓
Load Model
↓
Data Pengguna
↓
Prediction

Training dilakukan satu kali pada tahap development.

Inference dilakukan ketika aplikasi digunakan.


31. Membuat Aplikasi Streamlit​

Sekarang kita membuat file:

app.py

Aplikasi akan:

  1. Memuat model.
  2. Menampilkan input pengguna.
  3. Membentuk DataFrame.
  4. Memanggil model.
  5. Menampilkan hasil prediksi.
  6. Menampilkan probabilitas tertinggi.

32. Kode Lengkap Streamlit​

import streamlit as st
import pandas as pd
import joblib


st.set_page_config(
page_title="Belajar Klasifikasi Jeruk",
page_icon=":tangerine:",
)


# Memuat model yang sudah dilatih
model = joblib.load(
"model_klasifikasi_jeruk.joblib"
)


st.title(":tangerine: Belajar Klasifikasi Jeruk")

st.markdown(
"Aplikasi classification machine learning "
"untuk memprediksi kualitas jeruk"
)


# Input numerik
diameter = st.slider(
"Diameter",
4.0,
10.0,
6.5
)

berat = st.slider(
"Berat",
100.0,
250.0,
175.0
)

tebal_kulit = st.slider(
"Tebal Kulit",
0.2,
1.0,
0.5
)

kadar_gula = st.slider(
"Kadar Gula",
10.0,
15.0,
12.5
)


# Input kategorikal
asal_daerah = st.pills(
"Asal Daerah",
[
"Kalimantan",
"Jawa Barat",
"Jawa Tengah"
],
default="Kalimantan"
)

warna = st.pills(
"Warna",
[
"hijau",
"kuning",
"oranye"
],
default="hijau"
)

musim_panen = st.pills(
"Musim Panen",
[
"kemarau",
"hujan"
],
default="kemarau"
)


# Tombol prediksi
if st.button(
"Predikasi",
type="primary"
):

data_baru = pd.DataFrame(
[[
diameter,
berat,
tebal_kulit,
kadar_gula,
asal_daerah,
warna,
musim_panen
]],
columns=[
'diameter',
'berat',
'tebal_kulit',
'kadar_gula',
'asal_daerah',
'warna',
'musim_panen'
]
)


# Melakukan prediksi
prediction = model.predict(
data_baru
)[0]


# Mengambil probabilitas terbesar
persentase = max(
model.predict_proba(
data_baru
)[0]
)


st.success(
f"Model memprediksi **{prediction}** "
f"dengan tingkat keyakinan "
f"Persentase: "
f"**{persentase * 100:.2f}%**"
)


st.balloons()


st.divider()

st.caption(
"Demo aplikasi prediksi kualitas 🍊"
)

Kode aplikasi tersebut menggunakan model yang telah disimpan dari notebook.

Catatan: Pada kode asli terdapat teks tombol Predikasi. Untuk aplikasi publik, lebih baik menggunakan Prediksi agar lebih tepat secara bahasa.


33. Cara Kerja Aplikasi Streamlit​

Ketika pengguna membuka aplikasi:

Streamlit
↓
Load model_klasifikasi_jeruk.joblib
↓
Menampilkan form input

Pengguna kemudian memasukkan:

Diameter
Berat
Tebal Kulit
Kadar Gula
Asal Daerah
Warna
Musim Panen

Setelah tombol prediksi ditekan:

Input User
↓
DataFrame
↓
Pipeline
↓
Preprocessing
↓
Logistic Regression
↓
Prediction
↓
Hasil

34. Menjalankan Streamlit Secara Lokal​

Pastikan terminal berada pada folder project:

cd klasifikasi-jeruk

Kemudian jalankan:

streamlit run app.py

Biasanya Streamlit akan menjalankan aplikasi pada alamat lokal:

http://localhost:8501

Browser akan membuka halaman aplikasi.


35. Pengujian Aplikasi​

Sebelum melakukan deployment, aplikasi sebaiknya diuji secara lokal.

Checklist:

  • Model berhasil dimuat.
  • Semua slider dapat digunakan.
  • Semua pilihan kategori tersedia.
  • Tombol prediksi dapat ditekan.
  • Tidak terdapat error.
  • Prediksi muncul.
  • Persentase muncul.
  • Model memberikan hasil untuk beberapa kombinasi input.
  • Nama file model sesuai.
  • Semua dependency tersedia.

36. Membuat requirements.txt​

Aplikasi Streamlit membutuhkan daftar dependency agar environment deployment mengetahui library yang harus di-install.

Buat:

requirements.txt

Isi:

streamlit
pandas
scikit-learn
joblib

Jika menggunakan versi tertentu untuk memastikan kompatibilitas, versi package dapat ditentukan, misalnya:

streamlit==versi
pandas==versi
scikit-learn==versi
joblib==versi

Untuk deployment, penting memastikan versi library yang digunakan saat training kompatibel dengan environment tempat model digunakan.


37. Membuat README​

Buat file:

README.md

Contoh:

# Klasifikasi Kualitas Jeruk

Aplikasi machine learning untuk memprediksi
kualitas jeruk menggunakan Logistic Regression.

## Feature

- Diameter
- Berat
- Tebal Kulit
- Kadar Gula
- Asal Daerah
- Warna
- Musim Panen

## Target

- Bagus
- Sedang
- Jelek

## Teknologi

- Python
- Pandas
- Scikit-learn
- Joblib
- Streamlit

README membantu orang lain memahami tujuan repository.


38. Membuat Repository GitHub​

Buat repository baru di GitHub.

Contohnya:

klasifikasi-jeruk-streamlit

Struktur repository:

klasifikasi-jeruk-streamlit/
│
├── app.py
├── model_klasifikasi_jeruk.joblib
├── requirements.txt
└── README.md

Jika dataset tidak diperlukan saat aplikasi berjalan, dataset tidak wajib dimasukkan ke repository.


39. Inisialisasi Git​

Masuk ke folder project:

cd klasifikasi-jeruk

Kemudian:

git init

Tambahkan file:

git add .

Buat commit:

git commit -m "Initial Streamlit machine learning app"

40. Menghubungkan Project dengan GitHub​

Tambahkan remote repository:

git remote add origin https://github.com/USERNAME/klasifikasi-jeruk-streamlit.git

Kemudian:

git branch -M main

Push ke GitHub:

git push -u origin main

Setelah berhasil, file project akan tersedia di repository GitHub.


41. Mengapa GitHub Digunakan?​

GitHub bukan tempat menjalankan model.

GitHub digunakan sebagai repository untuk:

Source Code
Model
Requirements
Documentation
Version Control

Arsitekturnya:

Developer
↓
Git
↓
GitHub Repository
↓
Streamlit Community Cloud
↓
Streamlit Application

Dengan demikian GitHub menjadi sumber kode aplikasi.


42. Deployment Menggunakan Streamlit Community Cloud​

Setelah repository tersedia di GitHub, aplikasi dapat dideploy menggunakan Streamlit Community Cloud.

Alur deployment resmi Streamlit adalah memilih repository GitHub, branch, dan file aplikasi Streamlit. Streamlit kemudian melakukan proses deployment dan memberikan URL aplikasi.

Secara sederhana:

GitHub Repository
↓
Streamlit Community Cloud
↓
Install requirements.txt
↓
Menjalankan app.py
↓
Aplikasi Online

43. Login ke Streamlit Community Cloud​

Buka:

Streamlit Community Cloud

Kemudian login menggunakan akun yang terhubung dengan GitHub.

Streamlit menyediakan integrasi dengan GitHub untuk mengambil source code aplikasi.


44. Membuat Deployment Baru​

Setelah masuk ke Streamlit Community Cloud:

  1. Pilih opsi untuk membuat aplikasi baru.
  2. Pilih repository GitHub.
  3. Pilih branch.
  4. Tentukan file utama aplikasi.
  5. Konfigurasikan subdomain jika diperlukan.
  6. Jalankan deployment.

Untuk project ini:

Repository:
klasifikasi-jeruk-streamlit

Branch:
main

Main file:
app.py

Sehingga konfigurasi dasarnya:

Repository
↓
klasifikasi-jeruk-streamlit
↓
main
↓
app.py

Streamlit mendokumentasikan bahwa konfigurasi deployment mencakup repository, branch, dan file path aplikasi.


45. Apa yang Terjadi Saat Deployment?​

Ketika deployment dijalankan, platform perlu menyiapkan environment aplikasi.

Secara konseptual:

GitHub
↓
Clone Repository
↓
Baca requirements.txt
↓
Install Dependency
↓
Load app.py
↓
Load model_klasifikasi_jeruk.joblib
↓
Start Streamlit
↓
Aplikasi Online

Jadi file berikut sangat penting:

app.py
requirements.txt
model_klasifikasi_jeruk.joblib

46. Hasil Deployment​

Jika deployment berhasil, aplikasi akan mendapatkan alamat web pada domain Streamlit.

Contoh bentuk URL:

https://nama-aplikasi.streamlit.app

URL aktual akan bergantung pada nama aplikasi dan konfigurasi deployment.

Streamlit Community Cloud menggunakan domain streamlit.app untuk aplikasi yang dideploy.


47. Update Aplikasi​

Salah satu keuntungan menggunakan GitHub adalah perubahan aplikasi dapat dilakukan melalui repository.

Misalnya kita mengubah:

st.title(":tangerine: Belajar Klasifikasi Jeruk")

menjadi:

st.title(":tangerine: Klasifikasi Kualitas Jeruk")

Kemudian:

git add .
git commit -m "Update application title"
git push

Repository berubah:

Local
↓
Git Push
↓
GitHub
↓
Streamlit
↓
Aplikasi diperbarui

Streamlit mendukung workflow berbasis GitHub, sehingga perubahan pada repository dapat digunakan untuk memperbarui aplikasi yang dideploy.


48. Arsitektur Keseluruhan Project​

Setelah deployment, keseluruhan sistem dapat digambarkan seperti berikut:

DEVELOPMENT
│
▼
┌─────────────────┐
│ Dataset Jeruk │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Jupyter Notebook│
└────────┬────────┘
│
┌───────────┴───────────┐
▼ ▼
Data Analysis Model Training
│
▼
Logistic Regression
│
▼
model_klasifikasi_jeruk.joblib
│
▼
┌────────────────┐
│ GitHub │
└───────┬────────┘
│
▼
Streamlit Community Cloud
│
▼
┌───────────────┐
│ Streamlit App │
└───────┬───────┘
│
▼
User
│
▼
Prediksi Jeruk

49. Training vs Inference​

Hal penting dalam deployment machine learning adalah membedakan training dan inference.

Training​

Training dilakukan ketika membangun model:

Dataset
↓
Preprocessing
↓
Training
↓
Evaluation
↓
Save Model

Output:

model_klasifikasi_jeruk.joblib

Inference​

Inference dilakukan ketika aplikasi digunakan:

User Input
↓
Load Model
↓
Preprocessing
↓
Prediction
↓
Output

Aplikasi Streamlit tidak perlu melakukan training ulang.


50. Mengapa Tidak Melatih Model di Streamlit?​

Jika aplikasi melakukan training setiap kali dibuka:

User membuka aplikasi
↓
Load dataset
↓
Training model
↓
Model selesai
↓
Prediction

Hal tersebut dapat menyebabkan aplikasi menjadi lebih lambat dan tidak efisien.

Lebih baik:

TRAINING

Dataset
↓
Model
↓
Save


DEPLOYMENT

Load Model
↓
User Input
↓
Prediction

Pendekatan ini lebih sesuai untuk aplikasi inference sederhana.


51. Keterbatasan Model​

Walaupun model menghasilkan accuracy:

99%

hasil tersebut tidak boleh langsung dianggap sebagai bukti bahwa model akan selalu memiliki akurasi 99% pada data dunia nyata.

Beberapa alasan:

  • Dataset hanya terdiri dari 500 data.
  • Data testing hanya 100 data.
  • Dataset yang digunakan dalam eksperimen belum tentu mewakili seluruh kondisi jeruk di dunia nyata.
  • Performa dapat berubah ketika model menerima data dari sumber yang berbeda.
  • Probabilitas model bukan jaminan kebenaran.

Karena itu, model sebaiknya diuji kembali menggunakan data baru sebelum digunakan untuk keputusan produksi.


52. Masalah yang Sering Terjadi Saat Deployment​

Model tidak ditemukan​

Error:

FileNotFoundError:
model_klasifikasi_jeruk.joblib

Pastikan:

app.py
model_klasifikasi_jeruk.joblib

berada pada lokasi yang sesuai.


Library tidak ditemukan​

Contoh:

ModuleNotFoundError

Periksa:

requirements.txt

Pastikan library yang digunakan sudah dicantumkan.


Versi Scikit-learn bermasalah​

Model yang disimpan menggunakan versi tertentu dari Scikit-learn sebaiknya digunakan dengan versi yang kompatibel ketika model di-load.

Karena itu, untuk project yang lebih serius, catat dependency dan versinya.


Aplikasi berjalan lokal tetapi gagal di Streamlit​

Periksa:

requirements.txt
nama file
path file
versi Python
versi library
log deployment

Jangan hanya memeriksa app.py.

Deployment melibatkan environment yang berbeda dengan komputer lokal.


53. Pengembangan Selanjutnya​

Project ini dapat dikembangkan menjadi lebih kompleks.

Beberapa pengembangan yang dapat dilakukan:

Menambahkan visualisasi di aplikasi​

Misalnya:

Distribusi kualitas
Confusion matrix
Probabilitas prediksi
Statistik dataset

Membandingkan beberapa algoritma​

Misalnya:

Logistic Regression
Decision Tree
Random Forest
K-Nearest Neighbors
Support Vector Machine

Kemudian membandingkan:

Accuracy
Precision
Recall
F1-score

Menambahkan validasi input​

Misalnya memastikan:

Diameter > 0
Berat > 0
Kadar gula berada dalam range tertentu

Menambahkan model monitoring​

Jika aplikasi digunakan dalam skala lebih besar, model perlu dipantau terhadap:

  • perubahan distribusi data;
  • perubahan performa;
  • data baru;
  • data yang tidak sesuai pola training.

54. Alur Lengkap dari Notebook hingga Deployment​

Sekarang seluruh proses dapat dirangkum menjadi:

1. Dataset
↓
2. Load Dataset
↓
3. Data Understanding
↓
4. EDA
↓
5. Visualisasi
↓
6. Feature dan Target
↓
7. Train-Test Split
↓
8. Preprocessing
↓
9. Pipeline
↓
10. Logistic Regression
↓
11. Training
↓
12. Evaluation
↓
13. Prediction
↓
14. Save Model
↓
15. Streamlit
↓
16. Testing Local
↓
17. Git
↓
18. GitHub
↓
19. Streamlit Community Cloud
↓
20. Aplikasi Online

55. Struktur Final Repository​

Pada akhirnya repository dapat memiliki struktur:

klasifikasi-jeruk-streamlit/
│
├── app.py
│
├── model_klasifikasi_jeruk.joblib
│
├── requirements.txt
│
├── README.md
│
└── .gitignore

Jika notebook juga ingin disimpan:

klasifikasi-jeruk-streamlit/
│
├── app.py
├── model_klasifikasi_jeruk.joblib
├── requirements.txt
├── README.md
├── klasifikasi_jeruk.ipynb
└── .gitignore

56. Contoh .gitignore​

Untuk project Python:

__pycache__/
*.pyc
.ipynb_checkpoints/
.env
.venv/
venv/

Jika dataset tidak ingin di-upload:

jeruk_balance_500.csv

dapat ditambahkan ke .gitignore.

Namun, pastikan aplikasi memang tidak membutuhkan dataset tersebut saat inference.


57. Konsep Penting yang Dipelajari​

Project sederhana ini sebenarnya memperkenalkan banyak konsep machine learning sekaligus.

Data​

Dataset
Feature
Target

Data Understanding​

shape
columns
info
describe

EDA​

Scatter Plot
Analisis hubungan feature

Preprocessing​

StandardScaler
OneHotEncoder
OrdinalEncoder
ColumnTransformer

Modeling​

Pipeline
Logistic Regression

Evaluation​

Accuracy
Precision
Recall
F1-score
Confusion Matrix

Deployment​

Joblib
Streamlit
Git
GitHub
Streamlit Community Cloud

58. Kesimpulan​

Membangun machine learning bukan hanya tentang memilih algoritma dan menjalankan model.fit().

Sebuah project machine learning yang lengkap memiliki alur:

Data
↓
Understanding
↓
EDA
↓
Preprocessing
↓
Modeling
↓
Evaluation
↓
Prediction
↓
Deployment

Pada project ini kita menggunakan dataset 500 data dengan tujuh feature untuk memprediksi tiga kategori kualitas jeruk. Notebook menggunakan preprocessing berbeda untuk data numerik, kategorikal, dan ordinal, kemudian menggabungkannya dengan Logistic Regression menggunakan Pipeline.

Eksperimen pada notebook menghasilkan accuracy sebesar 0.99 pada 100 data testing, dengan classification report dan confusion matrix yang menunjukkan hanya satu kesalahan klasifikasi pada data testing.

Model kemudian disimpan menggunakan Joblib dan digunakan kembali oleh aplikasi Streamlit.

Akhirnya:

Jupyter Notebook
↓
Machine Learning Model
↓
Joblib
↓
Streamlit
↓
GitHub
↓
Streamlit Community Cloud
↓
Aplikasi Machine Learning Online

Inilah salah satu pola dasar yang penting untuk dipahami ketika mulai belajar machine learning deployment: model yang telah dilatih harus dapat dikemas menjadi sebuah aplikasi yang dapat menerima input baru dan menghasilkan prediksi.


59. Checklist Project​

Sebelum menganggap project selesai, pastikan:

Machine Learning​

  • Dataset berhasil dimuat
  • Data dipahami
  • EDA dilakukan
  • Visualisasi dibuat
  • Feature ditentukan
  • Target ditentukan
  • Train-test split dilakukan
  • Preprocessing dilakukan
  • Pipeline dibuat
  • Model dilatih
  • Model dievaluasi
  • Model diuji dengan data baru
  • Model disimpan

Deployment​

  • Streamlit dibuat
  • Model di-load
  • Input pengguna dibuat
  • Prediction dibuat
  • requirements.txt dibuat
  • Repository Git dibuat
  • Repository GitHub dibuat
  • Aplikasi diuji lokal
  • Aplikasi dideploy ke Streamlit Community Cloud

Dengan demikian, kita tidak hanya memiliki model machine learning, tetapi sebuah end-to-end machine learning application yang dapat digunakan melalui web.

Referensi​