Membangun Machine Learning hingga Deploy Menggunakan Streamlit dan GitHub
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.
Sumber Dataset: https://github.com/adiscreate/belajar_klasifikasi_jeruk
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:
BagusSedangJelek
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:
| Library | Kegunaan |
|---|---|
| Pandas | Membaca dan mengolah dataset |
| Matplotlib | Membuat visualisasi |
| Scikit-learn | Preprocessing, training dan evaluasi |
| Joblib | Menyimpan model |
| Streamlit | Membuat aplikasi web |
| Python | Bahasa 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:
| Feature | Mean | Minimum | Maximum |
|---|---|---|---|
| Diameter | 6.514780 | 3.99 | 8.73 |
| Berat | 150.670600 | 74.4 | 277.1 |
| Tebal Kulit | 0.730460 | 0.27 | 1.62 |
| Kadar Gula | 10.020200 | 5.8 | 14.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, danJelekmemiliki 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.
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, danJelekmembentuk 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.
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:
| Aktual | Prediksi Bagus | Prediksi Jelek | Prediksi Sedang |
|---|---|---|---|
| Bagus | 35 | 0 | 0 |
| Jelek | 0 | 40 | 1 |
| Sedang | 0 | 0 | 24 |
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:
- Memuat model.
- Menampilkan input pengguna.
- Membentuk DataFrame.
- Memanggil model.
- Menampilkan hasil prediksi.
- 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 menggunakanPrediksiagar 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:
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:
- Pilih opsi untuk membuat aplikasi baru.
- Pilih repository GitHub.
- Pilih branch.
- Tentukan file utama aplikasi.
- Konfigurasikan subdomain jika diperlukan.
- 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.txtdibuat - 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.
