Cara Menyimpan Data ke Database dari Pipeline ML
Setiap kali selesai melatih model, kamu menjalankan skrip yang sama: memuat data, memprediksi, lalu menulis hasilnya ke file CSV. File itu menumpuk di folder unduhan, dan tidak ada cara cepat untuk mencari prediksi dari minggu lalu atau membandingkan performa antar versi model. Kalau kamu ingin hasil prediksi bisa diakses tim lain tanpa mengirim file manual, menyimpan data ke database dari pipeline machine learning adalah jawabannya.
Panduan ini memandu kamu menghubungkan pipeline yang sudah ada ke database, mulai dari memilih jenis database, membuat skema, menulis hasil prediksi, hingga memastikan prosesnya berjalan otomatis.
Kapan pipeline perlu menulis ke database?
Pipeline yang hanya menghasilkan satu model untuk laporan sekali jalan cukup menyimpan output ke CSV atau file joblib. Database baru diperlukan saat hasil prediksi dipakai berulang, misalnya:
- Aplikasi web menampilkan prediksi terbaru untuk tiap pelanggan.
- Tim analis ingin memfilter hasil berdasarkan tanggal atau segmen.
- Kamu menjalankan model secara berkala dan perlu menyimpan riwayat versi.
Menulis ke database juga memudahkan proses otomatis. Skrip yang dijalankan oleh penjadwal cukup melakukan insert, tanpa perlu membaca seluruh file lama untuk menggabungkan data.
Pilih database yang sesuai dengan kebutuhan
Untuk eksperimen lokal, SQLite sudah cukup. Database ini tidak memerlukan server terpisah dan filenya bisa dipindahkan seperti file biasa. Jika pipeline akan berjalan di server dan diakses beberapa pengguna, PostgreSQL atau MySQL lebih tepat karena mendukung koneksi bersamaan dan tipe data yang lebih kaya.
Pilihan lain adalah menyimpan hasil ke layanan penyimpanan terstruktur. Jika pipeline kamu berjalan di perangkat edge, pertimbangkan media penyimpanan yang sesuai, seperti yang dibahas di panduan memilih penyimpanan data untuk perangkat IoT. Prinsipnya sama: sesuaikan media dengan frekuensi tulis dan ketahanan yang dibutuhkan.
Menyiapkan koneksi dan skema tabel
Contoh berikut memakai SQLite dan SQLAlchemy, pustaka Python yang menyediakan lapisan abstraksi di atas berbagai mesin database. Instal dulu paketnya:
pip install sqlalchemy pandas
Buat file koneksi dan definisikan tabel. Pisahkan logika koneksi dari skrip pelatihan agar bisa dipakai ulang.
from sqlalchemy import create_engine, Column, Integer, Float, String, DateTime
from sqlalchemy.orm import declarative_base, sessionmaker
from datetime import datetime
Base = declarative_base()
class Prediksi(Base):
__tablename__ = "prediksi"
id = Column(Integer, primary_key=True)
model_versi = Column(String, nullable=False)
skor = Column(Float, nullable=False)
label = Column(String, nullable=False)
dibuat_pada = Column(DateTime, default=datetime.utcnow)
engine = create_engine("sqlite:///hasil_prediksi.db")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
Kolom dibuat_pada penting agar kamu bisa melacak kapan prediksi dihasilkan. Tanpa kolom waktu, data lama dan baru akan bercampur tanpa penanda.
Menulis hasil prediksi dari pipeline
Anggap kamu sudah punya model yang tersimpan, misalnya mengikuti cara di panduan menyimpan model dengan joblib. Langkah berikutnya adalah memuat model, memproses data baru, dan menulis hasilnya ke database.
import joblib
import pandas as pd
model = joblib.load("model_churn.joblib")
data_baru = pd.read_csv("pelanggan_baru.csv")
fitur = data_baru.drop(columns=["id_pelanggan"])
skor = model.predict_proba(fitur)[:, 1]
label = model.predict(fitur)
sesi = Session()
for i, row in data_baru.iterrows():
sesi.add(Prediksi(
model_versi="v1.2",
skor=float(skor[i]),
label=str(label[i])
))
sesi.commit()
sesi.close()
Menambahkan data satu per satu dalam loop memang mudah dibaca, tetapi lambat untuk ribuan baris. Untuk volume besar, kumpulkan dulu ke list of dict lalu gunakan session.bulk_insert_mappings(Prediksi, daftar). Cara ini memangkas waktu tulis secara signifikan.
Menyimpan metrik evaluasi bersama hasil
Prediksi saja tidak cukup. Kamu perlu tahu performa model saat prediksi itu dibuat. Buat tabel terpisah untuk metrik agar bisa membandingkan antar versi.
class Metrik(Base):
__tablename__ = "metrik_model"
id = Column(Integer, primary_key=True)
model_versi = Column(String, nullable=False)
akurasi = Column(Float)
f1 = Column(Float)
dicatat_pada = Column(DateTime, default=datetime.utcnow)
Setelah evaluasi selesai, simpan hasilnya di tabel ini. Dengan begitu, saat akurasi menurun, kamu bisa menelusuri versi model mana yang perlu diperiksa. Untuk memahami pola penurunan performa, lihat juga cara membaca kurva learning.
Menjalankan proses secara otomatis
Setelah skrip berjalan stabil, langkah berikutnya adalah menjalankannya terjadwal. Di server Linux, cron bisa memanggil skrip setiap malam. Di lingkungan cloud, layanan penjadwal akan menjalankan kontainer atau fungsi pada interval tertentu.
Pastikan skrip menangani kegagalan koneksi. Bungkus blok tulis dengan try/except, lalu catat error ke file log. Pipeline yang gagal tanpa jejak log akan sulit diperbaiki, terutama jika berjalan di luar jam kerja.
Poin penting sebelum produksi
- Gunakan kredensial database dari variabel lingkungan, bukan ditulis langsung di kode.
- Buat indeks pada kolom yang sering difilter, misalnya
model_versidandibuat_pada. - Simpan salinan data mentah yang dipakai untuk prediksi agar hasil bisa direproduksi.
- Uji proses tulis dengan database sementara sebelum menyentuh data produksi.
Ringkasan
Menghubungkan pipeline machine learning ke database mengubah hasil prediksi dari file statis menjadi data yang bisa dicari, dibandingkan, dan dipakai aplikasi lain. Mulai dari SQLite, definisikan skema, tulis hasil prediksi dan metrik, lalu jadwalkan prosesnya. Setelah alur ini berjalan, kamu bisa beralih ke database server tanpa mengubah banyak kode.
Pertanyaan yang Sering Diajukan
Apakah harus selalu memakai SQLAlchemy?
Tidak. Kamu bisa memakai pustaka konektor bawaan seperti sqlite3 atau psycopg2. SQLAlchemy membantu ketika kamu ingin kode yang sama berjalan di beberapa jenis database tanpa menulis ulang query.
Bagaimana jika skema tabel berubah di tengah proyek?
Gunakan alat migrasi seperti Alembic. Alat ini mencatat perubahan skema dan menjalankannya secara berurutan, sehingga database lama tidak perlu dibuat ulang dari nol.
Apakah prediksi perlu disimpan semua?
Tergantung kebutuhan. Jika hanya butuh hasil terbaru, simpan satu baris per entitas dan perbarui saat ada prediksi baru. Jika butuh riwayat, simpan setiap prediksi beserta waktunya, lalu bersihkan data lama secara berkala agar tabel tidak membengkak.


