Saving & Loading Model dengan Pickle
Setelah melakukan:
Data Preparation
↓
Model Training
↓
Model Evaluation
↓
Hyperparameter Tuning
↓
Best Model
kita biasanya tidak ingin melakukan proses training dari awal setiap kali model akan digunakan.
Solusinya adalah menyimpan model yang sudah dilatih ke dalam sebuah file.
Model yang telah disimpan kemudian dapat dimuat kembali dan digunakan untuk melakukan prediksi.
Mengapa Model Perlu Disimpan?
Menyimpan model Machine Learning memiliki beberapa manfaat.
1. Tidak Perlu Training Ulang
Model yang sudah dilatih dapat digunakan kembali tanpa melakukan training dari awal.
2. Digunakan dalam Aplikasi
Model dapat diintegrasikan ke dalam:
- Web application
- REST API
- Mobile application
- Dashboard
- Sistem backend
3. Membagikan Model
Model yang sudah dilatih dapat dibagikan kepada anggota tim atau dipindahkan ke server.
4. Deployment
Model yang sudah disimpan dapat digunakan pada environment production untuk melakukan prediksi terhadap data baru.
Pickle
Python menyediakan module pickle untuk melakukan serialisasi objek Python.
Serialisasi adalah proses mengubah objek Python menjadi format yang dapat disimpan ke dalam file.
Secara sederhana:
Python Object
│
▼
Serialization
│
▼
File
Kemudian ketika ingin menggunakannya kembali:
File
│
▼
Deserialization
│
▼
Python Object
Untuk model Machine Learning:
Trained Model
│
▼
pickle
│
▼
model.pkl
Kemudian:
model.pkl
│
▼
pickle
│
▼
Loaded Model
│
▼
predict()
Menyimpan Model dengan Pickle
Import module:
import pickle
Misalnya kita telah memiliki model hasil GridSearchCV:
gs_clf
Model tersebut dapat disimpan menggunakan:
pickle.dump(
gs_clf,
open("gs_random_forest_model_1.pkl", "wb")
)
Memahami pickle.dump()
Fungsi:
pickle.dump()
digunakan untuk menyimpan objek Python ke file.
Strukturnya:
pickle.dump(
object,
file
)
Pada contoh:
pickle.dump(
gs_clf,
open("gs_random_forest_model_1.pkl", "wb")
)
berarti:
gs_clf
↓
pickle.dump()
↓
gs_random_forest_model_1.pkl
Mode wb
Perhatikan bagian:
"wb"
wb berarti:
w = write
b = binary
Jadi:
wb = write binary
Karena pickle menyimpan objek dalam format binary, file dibuka menggunakan mode wb.
Memuat Model dengan Pickle
Setelah model tersimpan, kita dapat memuatnya kembali menggunakan:
pickle.load()
Contoh:
loaded_pickle_model = pickle.load(
open(
"gs_random_forest_model_1.pkl",
"rb"
)
)
Sekarang:
loaded_pickle_model
berisi model yang sebelumnya telah disimpan.
Mode rb
Perhatikan:
"rb"
Artinya:
r = read
b = binary
Sehingga:
rb = read binary
Digunakan ketika membaca file binary yang telah disimpan menggunakan pickle.
Membuat Prediksi dengan Model yang Telah Di-load
Setelah model berhasil dimuat:
loaded_pickle_model
kita dapat menggunakannya seperti model biasa.
Contoh:
pickle_y_preds = loaded_pickle_model.predict(
X_test
)
Model yang telah di-load dapat langsung digunakan untuk melakukan prediksi.
Evaluasi Model yang Telah Di-load
Gunakan fungsi evaluasi yang telah dibuat sebelumnya:
pickle_metrics = evaluate_preds(
y_test,
pickle_y_preds
)
pickle_metrics
Hasilnya dapat berupa:
{
"accuracy": 0.84,
"precision": 0.85,
"recall": 0.82,
"f1": 0.83
}
Nilai tersebut hanya contoh.
Memverifikasi Model
Salah satu cara untuk memastikan proses penyimpanan dan pemuatan berhasil adalah membandingkan hasil prediksi atau metric model sebelum dan sesudah disimpan.
Misalnya sebelum disimpan:
gs_y_preds = gs_clf.predict(
X_test
)
gs_metrics = evaluate_preds(
y_test,
gs_y_preds
)
Setelah di-load:
pickle_y_preds = loaded_pickle_model.predict(
X_test
)
pickle_metrics = evaluate_preds(
y_test,
pickle_y_preds
)
Bandingkan:
print(gs_metrics)
print(pickle_metrics)
Jika model dan environment yang digunakan konsisten, hasil prediksi dan metric seharusnya sama.
Membandingkan Prediksi Secara Langsung
Kita juga dapat membandingkan prediksi sebelum dan sesudah model disimpan:
gs_y_preds == pickle_y_preds
Untuk memeriksa apakah seluruh prediksi sama:
(gs_y_preds == pickle_y_preds).all()
Jika menghasilkan:
True
berarti prediksi keduanya sama pada data tersebut.
Membandingkan Metric
Kita juga dapat membuat perbandingan:
compare_metrics = {
"original_model": gs_metrics,
"loaded_pickle_model": pickle_metrics
}
compare_metrics
Jika hasilnya sama:
Original Model
│
├── Accuracy
├── Precision
├── Recall
└── F1
=
Loaded Pickle Model
│
├── Accuracy
├── Precision
├── Recall
└── F1
maka proses save dan load berhasil.
Praktik yang Lebih Baik Saat Membuka File
Daripada menggunakan:
pickle.dump(
gs_clf,
open("model.pkl", "wb")
)
lebih baik menggunakan with open():
with open(
"gs_random_forest_model_1.pkl",
"wb"
) as file:
pickle.dump(
gs_clf,
file
)
Kemudian untuk membaca:
with open(
"gs_random_forest_model_1.pkl",
"rb"
) as file:
loaded_pickle_model = pickle.load(
file
)
Pendekatan ini lebih baik karena file akan ditutup secara otomatis setelah selesai digunakan.
Full Code
Berikut contoh lengkap menyimpan, memuat, dan mengevaluasi model.
import pickle
# ==========================================
# 1. Membuat prediksi dengan model asli
# ==========================================
gs_y_preds = gs_clf.predict(
X_test
)
gs_metrics = evaluate_preds(
y_test,
gs_y_preds
)
print("Original model:")
print(gs_metrics)
# ==========================================
# 2. Menyimpan model
# ==========================================
with open(
"gs_random_forest_model_1.pkl",
"wb"
) as file:
pickle.dump(
gs_clf,
file
)
# ==========================================
# 3. Memuat model
# ==========================================
with open(
"gs_random_forest_model_1.pkl",
"rb"
) as file:
loaded_pickle_model = pickle.load(
file
)
# ==========================================
# 4. Membuat prediksi
# ==========================================
pickle_y_preds = loaded_pickle_model.predict(
X_test
)
# ==========================================
# 5. Evaluasi model yang telah di-load
# ==========================================
pickle_metrics = evaluate_preds(
y_test,
pickle_y_preds
)
print("Loaded Pickle model:")
print(pickle_metrics)
# ==========================================
# 6. Membandingkan prediksi
# ==========================================
print(
"Predictions are the same:",
(gs_y_preds == pickle_y_preds).all()
)
# ==========================================
# 7. Membandingkan metrics
# ==========================================
print(
"Original metrics:",
gs_metrics
)
print(
"Pickle metrics:",
pickle_metrics
)
Struktur File
Setelah menjalankan proses tersebut, kita akan memiliki file:
project/
├── notebook.ipynb
├── data/
│ └── ...
└── gs_random_forest_model_1.pkl
File:
gs_random_forest_model_1.pkl
berisi model yang telah disimpan.
File tersebut kemudian dapat dipindahkan ke environment lain yang kompatibel untuk digunakan kembali.
Apa yang Sebenarnya Disimpan?
Ketika kita melakukan:
pickle.dump(
gs_clf,
file
)
yang disimpan bukan hanya angka hasil prediksi.
Pickle menyimpan representasi objek Python sehingga objek model dapat direkonstruksi kembali ketika di-load.
Setelah di-load:
loaded_pickle_model
kita dapat menggunakan:
loaded_pickle_model.predict(...)
tanpa melakukan training ulang.
Pickle Bukan Dataset
Perlu dibedakan antara:
Dataset
dan:
Trained Model
Dataset digunakan untuk melatih model:
Dataset
↓
Training
↓
Trained Model
Sedangkan model yang sudah dilatih dapat disimpan:
Trained Model
↓
Pickle
↓
model.pkl
Kemudian:
model.pkl
↓
Load
↓
Trained Model
↓
Prediction
Kapan Pickle Berguna?
Pickle dapat digunakan ketika:
- Model sudah selesai dilatih.
- Model ingin digunakan kembali.
- Model ingin dipindahkan ke aplikasi.
- Model ingin digunakan untuk deployment.
- Kita ingin menghindari training ulang.
- Model perlu disimpan untuk eksperimen atau prototyping.
Catatan Keamanan
Ada satu hal penting ketika menggunakan pickle.
Jangan melakukan pickle.load() terhadap file yang berasal dari sumber yang tidak dipercaya.
Pickle dapat melakukan proses deserialisasi objek Python dan file berbahaya berpotensi menjalankan kode ketika di-load.
Contoh:
pickle.load(
untrusted_file
)
sebaiknya dihindari.
Gunakan hanya file model yang:
- Dibuat sendiri.
- Berasal dari sumber yang dipercaya.
- Telah diverifikasi integritas dan asalnya.
Dalam konteks deployment, model artifact juga sebaiknya dikelola seperti file executable atau dependency aplikasi lainnya.
Catatan Environment
Model yang disimpan menggunakan pickle sebaiknya digunakan pada environment yang kompatibel dengan environment saat model dibuat.
Perhatikan:
- Versi Python.
- Versi Scikit-Learn.
- Versi NumPy.
- Dependency model lainnya.
Contohnya:
Training Environment
Python 3.x
Scikit-Learn x.x
NumPy x.x
│
▼
Model
│
▼
.pkl
│
▼
Production Environment
Perbedaan versi library dapat menyebabkan masalah ketika model di-load atau digunakan.
Untuk deployment yang serius, dependency environment sebaiknya dicatat, misalnya menggunakan:
requirements.txt
Ringkasan
pickle memungkinkan kita menyimpan model Machine Learning yang telah dilatih ke dalam file.
Prosesnya:
Trained Model
↓
pickle.dump()
↓
model.pkl
↓
pickle.load()
↓
Loaded Model
↓
predict()
Untuk menyimpan:
with open("model.pkl", "wb") as file:
pickle.dump(model, file)
Untuk memuat:
with open("model.pkl", "rb") as file:
model = pickle.load(file)
Keuntungan utamanya adalah kita dapat menggunakan model kembali tanpa melakukan training dari awal.
Checklist
Sebelum menggunakan model hasil pickle, pastikan:
- Model sudah dilatih.
- Model sudah dievaluasi.
- Model sudah dipilih sebagai model yang akan digunakan.
- Model disimpan menggunakan
pickle.dump(). - File model berhasil dibuat.
- Model dapat di-load menggunakan
pickle.load(). - Prediksi model yang di-load sudah diverifikasi.
- Environment dan dependency kompatibel.
- File
.pklberasal dari sumber yang dipercaya.