Machine Learning Academy · Pelajaran

Memantau Prediksi: Mencatat Input dan Output

Peserta akan menambahkan pencatatan prediksi ke API, membahas pergeseran data dan keusangan model, serta membuat rancangan pemicu pelatihan ulang dan pipeline penerapan.

Pelajaran 4 dari 413 langkah

Memantau Prediksi: Mencatat Input dan Output adalah pelajaran Machine Learning Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Machine Learning Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Machine Learning Academy mencakup 4 pelajaran total.

Mengapa Memantau Model yang Telah Diterapkan?

Model yang berkinerja sangat baik saat diterapkan dapat menurun secara diam-diam ketika dunia nyata berubah. Perilaku pelanggan bergeser, kategori produk baru muncul, sensor mengalami pergeseran, dan kondisi ekonomi berubah—semuanya menyebabkan distribusi masukan menyimpang dari data pelatihan. Tanpa pemantauan, Anda baru menyadari kegagalan model ketika pengguna mengeluh atau metrik bisnis menurun. Pemantauan prediksi mendeteksi penurunan kinerja lebih awal, sebelum berdampak pada pengguna.

Yang Perlu Dicatat: Tiga W

Setiap peristiwa prediksi harus mencatat: Kapan (stempel waktu), Apa (fitur masukan dan keluaran/prediksi/probabilitas model), dan idealnya Apakah (label kebenaran aktual yang diperoleh kemudian, setelah tersedia). Fitur masukan diperlukan untuk mendeteksi pergeseran data; keluaran memungkinkan pemantauan keyakinan; kebenaran aktual memungkinkan pemantauan akurasi dari waktu ke waktu.

Menambahkan Pencatatan ke Titik Akhir FastAPI

Perluas rute prediksi FastAPI agar mencatat setiap permintaan ke berkas JSONL terstruktur (JSON Lines—satu objek JSON per baris). JSONL mudah ditambahkan, mudah diuraikan, dan berfungsi baik dengan alat seperti pandas, Spark, serta pengumpul log awan. Setiap baris log merupakan satu peristiwa prediksi.

import json
from datetime import datetime
from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np

app = FastAPI()
LOG_FILE = '/tmp/prediction_log.jsonl'

def log_prediction(features: dict, prediction: int, confidence: float):
    entry = {
        'timestamp': datetime.utcnow().isoformat(),
        'features': features,
        'predicted_class': prediction,
        'confidence': confidence
    }
    with open(LOG_FILE, 'a') as f:
        f.write(json.dumps(entry) + '\n')

# Call inside the predict route:
# log_prediction(features.dict(), pred, confidence)
print('Logging enabled — entries written to', LOG_FILE)

Menyimulasikan dan Membaca Log

Setelah prediksi terkumpul, baca berkas JSONL ke dalam DataFrame pandas untuk dianalisis. Setiap baris merupakan satu peristiwa prediksi. Anda dapat menghitung statistik untuk jangka waktu apa pun: rata-rata keyakinan bergulir, pergeseran distribusi fitur, dan frekuensi kelas prediksi.

import json
import pandas as pd
from datetime import datetime
import random

# Simulate log entries
LOG_FILE = '/tmp/prediction_log.jsonl'
with open(LOG_FILE, 'w') as f:
    for i in range(100):
        entry = {
            'timestamp': datetime.utcnow().isoformat(),
            'features': {'sepal_length': round(4.5 + random.gauss(1, 0.5), 2),
                         'sepal_width': round(3.0 + random.gauss(0, 0.3), 2),
                         'petal_length': round(1.0 + random.gauss(2, 1), 2),
                         'petal_width': round(0.2 + random.gauss(0.5, 0.2), 2)},
            'predicted_class': random.choice([0, 1, 2]),
            'confidence': round(random.uniform(0.6, 1.0), 4)
        }
        f.write(json.dumps(entry) + '\n')

# Read back as DataFrame
rows = [json.loads(line) for line in open(LOG_FILE)]
df = pd.json_normalize(rows)
print(df.shape)
print(df[['confidence', 'predicted_class']].describe())

Memantau Keyakinan dari Waktu ke Waktu

Buat grafik rata-rata keyakinan bergulir dari waktu ke waktu. Tren menurun menandakan bahwa model menjadi kurang yakin terhadap prediksinya—tanda peringatan dini klasik dari pergeseran data. Tetapkan ambang batas (misalnya, keyakinan bergulir di bawah 0,7) dan picu peringatan. Dengan demikian, Anda memperoleh peringatan sebelum akurasi benar-benar menurun.

import pandas as pd
import matplotlib.pyplot as plt
import json

df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])
df['timestamp'] = pd.to_datetime(df['timestamp'])
df = df.sort_values('timestamp').reset_index(drop=True)

# Rolling window of 20 predictions
df['rolling_confidence'] = df['confidence'].rolling(20).mean()

plt.figure(figsize=(10, 4))
plt.plot(df.index, df['confidence'], alpha=0.3, label='Per-prediction')
plt.plot(df.index, df['rolling_confidence'], linewidth=2, label='Rolling mean (n=20)')
plt.axhline(0.7, color='red', linestyle='--', label='Alert threshold')
plt.xlabel('Prediction number')
plt.ylabel('Confidence')
plt.title('Prediction Confidence Over Time')
plt.legend()
plt.show()

Mendeteksi Pergeseran Distribusi Fitur

Bandingkan distribusi setiap fitur masukan pada prediksi terbaru dengan distribusi pelatihan. Indeks Stabilitas Populasi (PSI) adalah metrik yang umum digunakan: PSI 0,1 berarti tidak ada pergeseran signifikan; 0,1–0,2 berarti pergeseran sedang; >0,2 berarti pergeseran parah yang memerlukan pelatihan ulang. Sebagai alternatif, uji Kolmogorov-Smirnov menguji apakah dua sampel berasal dari distribusi yang sama.

import numpy as np
from scipy import stats
import pandas as pd
import json

df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])

# Simulated training distribution for sepal_length
train_sepal = np.random.normal(5.8, 0.8, 500)  # reference
recent_sepal = df['features.sepal_length'].values

# KS test: tests if two samples come from same distribution
stat, p_value = stats.ks_2samp(train_sepal, recent_sepal)
print(f'KS statistic: {stat:.4f}  p-value: {p_value:.4f}')
if p_value < 0.05:
    print('WARNING: sepal_length distribution has drifted!')
else:
    print('No significant drift detected in sepal_length')

Memantau Frekuensi Kelas Prediksi

Buat grafik frekuensi bergulir setiap kelas yang diprediksi. Jika kelas 0 diprediksi 60% dari waktu selama evaluasi pada periode pelatihan, tetapi kini hanya diprediksi 10% dari waktu, berarti ada sesuatu yang berubah pada data masukan. Pergeseran distribusi kelas sering kali lebih mudah dideteksi daripada perubahan halus pada distribusi fitur dan dapat digunakan sebagai peringatan awal yang cepat.

import pandas as pd
import json

df = pd.json_normalize([json.loads(l) for l in open('/tmp/prediction_log.jsonl')])

# Compute rolling class frequencies in windows of 20
window = 20
rolling_freq = pd.get_dummies(df['predicted_class']).rolling(window).mean()
rolling_freq.columns = [f'class_{c}' for c in rolling_freq.columns]

print('Recent class frequencies (last 20 predictions):')
print(rolling_freq.tail(1).to_string())

print('\nTraining class frequency (expected):')
print('class_0: 0.33  class_1: 0.33  class_2: 0.33')

Pencatatan Terstruktur untuk Produksi

Dalam produksi, tulis log ke sistem pencatatan terstruktur, bukan ke berkas biasa. Pilihannya meliputi: modul pencatatan Python dengan pemformat JSON, layanan pencatatan awan (AWS CloudWatch, GCP Cloud Logging, Datadog), atau basis data. Log terstruktur dapat dibuat kuerinya, mudah diskalakan, dan terintegrasi dengan dasbor seperti Grafana untuk pemantauan waktu nyata.

import logging
import json
from datetime import datetime

# Configure structured JSON logging
class JSONFormatter(logging.Formatter):
    def format(self, record):
        log_data = {
            'time': datetime.utcnow().isoformat(),
            'level': record.levelname,
            'message': record.getMessage()
        }
        if hasattr(record, 'prediction_data'):
            log_data.update(record.prediction_data)
        return json.dumps(log_data)

logger = logging.getLogger('ml_predictor')
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)

# Usage in prediction route:
extra = {'prediction_data': {'features': {'x': 1.5}, 'pred': 0, 'conf': 0.95}}
logger.info('prediction', extra=extra)

Pergeseran Data vs Pergeseran Konsep

Ada dua mode kegagalan yang berbeda: Pergeseran data—distribusi fitur masukan berubah (misalnya, sensor dikalibrasi ulang atau demografi pelanggan baru muncul). Pergeseran konsep—hubungan antara masukan dan target berubah (misalnya, definisi 'penipuan' berkembang ketika pelaku penipuan beradaptasi). Pergeseran data terkadang dapat ditangani dengan melatih ulang model menggunakan data terbaru; pergeseran konsep memerlukan pemikiran ulang terhadap fitur atau pendekatan pemodelan.

Pemicu Pelatihan Ulang

Tentukan pemicu pelatihan ulang yang jelas sebelum penerapan. Pemicu yang umum meliputi: terjadwal (melatih ulang setiap 30 hari tanpa pengecualian), berdasarkan kinerja (melatih ulang jika AUC pada data uji tertahan berlabel turun di bawah ambang batas), atau berdasarkan pergeseran (melatih ulang ketika PSI melebihi 0,2 pada fitur penting mana pun). Mengotomatiskan pemicu dan alur pelatihan ulang mencegah penurunan kinerja model secara diam-diam.

from datetime import datetime, timedelta

class RetrainingPolicy:
    def __init__(self, last_trained: datetime, max_age_days=30,
                 min_auc=0.85, max_drift_psi=0.2):
        self.last_trained = last_trained
        self.max_age_days = max_age_days
        self.min_auc = min_auc
        self.max_drift_psi = max_drift_psi

    def should_retrain(self, current_auc=None, max_psi=None):
        age = (datetime.utcnow() - self.last_trained).days
        if age >= self.max_age_days:
            return True, f'Model is {age} days old (max {self.max_age_days})'
        if current_auc and current_auc < self.min_auc:
            return True, f'AUC {current_auc:.3f} below threshold {self.min_auc}'
        if max_psi and max_psi > self.max_drift_psi:
            return True, f'PSI {max_psi:.3f} above threshold {self.max_drift_psi}'
        return False, 'No trigger met — model healthy'

policy = RetrainingPolicy(last_trained=datetime.utcnow() - timedelta(days=35))
print(policy.should_retrain(current_auc=0.90))

Rancangan Dasbor Pemantauan

Dasbor pemantauan ML produksi biasanya menampilkan: keyakinan prediksi bergulir dari waktu ke waktu, distribusi kelas dari waktu ke waktu, histogram distribusi fitur yang membandingkan pelatihan dengan prediksi terbaru, serta (ketika label tersedia) akurasi atau AUC bergulir. Alat seperti Grafana + Prometheus, Evidently AI, atau WhyLogs menyediakan komponen siap pakai untuk pemantauan ML tanpa harus membangunnya dari awal.

# Evidently AI example (pip install evidently)
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset
import pandas as pd
import numpy as np

# Reference: training feature distributions
reference = pd.DataFrame({
    'sepal_length': np.random.normal(5.8, 0.8, 300),
    'petal_length': np.random.normal(3.7, 1.7, 300)
})

# Current: recent predictions features
current = pd.DataFrame({
    'sepal_length': np.random.normal(6.5, 1.2, 100),  # drifted!
    'petal_length': np.random.normal(3.7, 1.7, 100)
})

report = Report(metrics=[DataDriftPreset()])
report.run(reference_data=reference, current_data=current)
report.save_html('/tmp/drift_report.html')
print('Drift report saved to /tmp/drift_report.html')

Pemeriksaan Singkat

Uji pemahaman Anda tentang pemantauan prediksi dan pencatatan dari pelajaran ini.

Ringkasan Pelajaran

Dalam pelajaran ini Anda telah mempelajari cara mencatat setiap peristiwa prediksi beserta stempel waktu, fitur masukan, kelas yang diprediksi, dan keyakinan untuk memungkinkan deteksi pergeseran, memantau keyakinan bergulir dan distribusi fitur untuk mendeteksi penurunan kinerja sebelum memengaruhi pengguna, serta menentukan pemicu pelatihan ulang otomatis (jadwal, ambang kinerja, atau ambang pergeseran) agar model tetap sehat dalam produksi. Dengan ini, kursus Dasar-Dasar Persistensi dan Penerapan Model telah selesai.

Gratis untuk memulai

Belajar Python dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
30
Pelajaran
120

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memantau Prediksi: Mencatat Input dan Output” gratis?

Ya — teks lengkap “Memantau Prediksi: Mencatat Input dan Output” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Machine Learning Academy, upgrade ke CoddyKit PRO. Kursus Machine Learning Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memantau Prediksi: Mencatat Input dan Output”?

Peserta akan menambahkan pencatatan prediksi ke API, membahas pergeseran data dan keusangan model, serta membuat rancangan pemicu pelatihan ulang dan pipeline penerapan. Kamu berlatih Machine Learning Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Machine Learning Academy?

Tidak diperlukan pengalaman sebelumnya. Machine Learning Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Memantau Prediksi: Mencatat Input dan Output” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Machine Learning Academy ini?

Ya. Setiap pelajaran Machine Learning Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menyimpan Model dengan joblib dan pickle
  2. Membuat Versi Model: Pentingnya Nama File dan Metadata
  3. Menyediakan Prediksi dengan Endpoint FastAPI
  4. Memantau Prediksi: Mencatat Input dan Output
← Kembali ke Machine Learning Academy