Model yang dilatih pada pelanggan Bandung tidak otomatis berlaku untuk pelanggan Surabaya, dan model yang dilatih pada transaksi tahun lalu tidak otomatis berlaku untuk selera tahun ini. Model tidak membawa batas berlakunya sendiri saat dipindahkan — batas itu dibawa oleh dokumentasinya, atau tidak dibawa sama sekali. Kekeliruan paling umum dalam pemakaian model bukan salah hitung, melainkan pemakaian di luar wilayah keabsahannya tanpa ada yang menyadarinya. Chapter ini membahas cara menentukan populasi yang dijangkau model, menolak input di luar jangkauan lewat kode, dan menuliskan keterbatasan dengan kalimat yang jujur.

Populasi yang Dijangkau Model #

Setiap model dilatih pada satu potret dunia: populasi tertentu, periode tertentu, cara pengukuran tertentu. Luas keberlakuan prediksinya mengikuti potret itu. Model kebiasaan belanja yang dilatih dari 60 pelanggan gerai di Bandung selama satu bulan berkata banyak tentang pelanggan serupa di periode serupa, sedikit tentang pelanggan kota lain, dan nyaris tidak berkata apa-apa tentang pelanggan yang bertransaksi lewat aplikasi. Penalaran ke luar potret itu disebut ekstrapolasi, dan ekstrapolasi pada model machine learning berbeda dari pada manusia: model tetap mengembalikan angka yang tampak meyakinkan meski inputnya jauh dari apa pun yang pernah dilihatnya.

Karena itu menuliskan populasi berlaku adalah bagian dari pekerjaan, bukan sopan santun dokumentasi. Pertanyaan yang dijawabnya: model ini dilatih dari siapa, kapan, dengan definisi kolom apa, dan untuk keputusan apa. Penulisan itu juga berkelindan dengan kejujuran angka: skor evaluasi hanya mengukur sebaran data yang diwakilinya, sebagaimana cara membaca skor lintas lipatan yang sudah kita bahas pada chapter Cross-Validation — angka bagus pada satu populasi tidak bisa dipinjam ke populasi lain.

Menolak Input di Luar Jangkauan #

Pertahanan pertama terhadap pemakaian di luar keabsahan bersifat teknis: sebelum prediksi dijalankan, kode memeriksa apakah input berada di dalam rentang data latih. Kode berikut melatih model sederhana untuk mengestimasi total belanja bulanan dari jumlah kunjungan, lalu memasang gerbang tiga jalur — terima, peringatkan di tepi, tolak di luar rentang:

python
import numpy as np
from sklearn.linear_model import LinearRegression

rng = np.random.default_rng(42)
n = 60
kunjungan = rng.integers(1, 15, n)
total_belanja = kunjungan * rng.integers(20, 45, n) + rng.normal(0, 15, n)

model = LinearRegression().fit(kunjungan.reshape(-1, 1), total_belanja)
batas_bawah, batas_atas = kunjungan.min(), kunjungan.max()

print(f"rentang data latih: {batas_bawah} sampai {batas_atas} kunjungan")
print()

def prediksi_aman(kunjungan_baru):
    if not batas_bawah <= kunjungan_baru <= batas_atas:
        return (f"TOLAK: {kunjungan_baru} kunjungan di luar rentang data latih "
                f"({batas_bawah} sampai {batas_atas})")
    estimasi = model.predict(np.array([[kunjungan_baru]]))[0]
    if kunjungan_baru <= batas_bawah + 1 or kunjungan_baru >= batas_atas - 1:
        return f"PERINGATAN: di tepi rentang data latih, estimasi belanja {estimasi:.0f} ribu"
    return f"OK: estimasi belanja {estimasi:.0f} ribu"

for uji in [7, 13, 30, 0]:
    print(f"kunjungan {uji:>2} -> {prediksi_aman(uji)}")

Output yang Dihasilkan:

text
rentang data latih: 1 sampai 14 kunjungan

kunjungan  7 -> OK: estimasi belanja 222 ribu
kunjungan 13 -> PERINGATAN: di tepi rentang data latih, estimasi belanja 413 ribu
kunjungan 30 -> TOLAK: 30 kunjungan di luar rentang data latih (1 sampai 14)
kunjungan  0 -> TOLAK: 0 kunjungan di luar rentang data latih (1 sampai 14)

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 9-10 (rentang dari data, bukan asumsi): model dilatih, lalu batas_bawah dan batas_atas dihitung dari data latih itu sendiri. Menyalin angka rentang secara manual berisiko usang begitu model dilatih ulang; menghitungnya ulang setiap pelatihan membuat gerbang ikut berganti otomatis.
  2. Baris 16-18 (tolak lebih dulu): pemeriksaan rentang ditempatkan sebelum predict() dipanggil. Input luar jangkauan tidak pernah sampai ke model, sehingga tidak ada angka palsu yang sempat lahir dan dikutip orang.
  3. Baris 20-21 (tepi rentang diberi peringatan): kepadatan data biasanya menipis di tepi rentang, sehingga prediksi di sana lebih rapuh. Pelanggan 13 kunjungan tetap dilayani, tetapi hasilnya disertai peringatan — kejujuran yang murah sebelum jadi kesalahan yang mahal.
  4. Hasil output: dua input pertama dilayani (satu dengan peringatan tepi), dua input terakhir ditolak dengan alasan yang bisa dibaca — termasuk 0 yang secara domain tidak mungkin, sebab tidak ada pelanggan dengan nol kunjungan pada data latih.

Gerbang seperti ini paling berharga justru saat model sudah dipakai orang lain: layanan prediksi yang menolak input luar jangkauan melindungi penggunanya dari angka yang tampak sah, dan alasan penolakannya menjadi pendidikan bagi pemakai mengenai wilayah keberlakuan model.

Kalimat Batasan yang Tepat #

Setelah gerbang teknis berdiri, sisa keterbatasan dikomunikasikan lewat kalimat. Pembeda antara kalimat lemah dan kalimat jujur ada pada tiga hal: populasi, angka dengan konteksnya, dan apa yang tidak dicakup:

Kalimat lemahKalimat yang tepat
“Model ini akurat 90%”“Model mencapai MAE 12 ribu rupiah pada 60 pelanggan uji di Bandung, Desember 2025”
“Model bisa memprediksi semua pelanggan”“Model berlaku untuk pelanggan gerai dengan profil seperti data latih; pelanggan luar profil memerlukan validasi tambahan”
“Hasilnya pasti seperti ini”“Estimasi ini adalah nilai tengah; nilai sebenarnya bisa di sekitarnya — seberapa jauh dijelaskan pada laporan”
“Model sudah otomatis aman dipakai”“Input di luar rentang 1-14 kunjungan otomatis ditolak oleh layanan”

Kolom kanan memakai pola yang bisa ditiru: sebut populasi dan waktunya, beri angka bersama ukurannya, lalu nyatakan apa yang tidak dicakup. Cara menyampaikan rentang ketidakpastian di rapat sudah kita latih pada chapter Menjelaskan Ketidakpastian — di sini kita menambahkan satu unsur lagi: pernyataan eksplisit soal siapa yang tidak diwakili model.

Rangkuman #

  • Keberlakuan model sebatas potret dunia saat pelatihannya: populasi, periode, dan definisi kolom menentukan seberapa jauh prediksinya sah.
  • Model tetap mengembalikan angka untuk input mustahil; menolak input di luar rentang data latih adalah tanggung jawab kode, dan rentangnya dihitung dari data, bukan disalin manual.
  • Tepi rentang patut diberi peringatan karena kepadatan data menipis di sana — prediksi tetap diberikan, kerapuhannya diumumkan.
  • Kalimat batasan yang jujur menyebut populasi, angka beserta ukurannya, dan apa yang tidak dicakup; kumpulkan semuanya pada satu bagian tetap di dokumentasi model.

Sebuah model yang batasnya jujur ditulis masih menyisakan satu tuntutan: orang lain harus bisa memeriksa bahwa klaim-klaimnya benar. Angka yang tidak bisa dijalankan ulang adalah klaim yang tidak bisa diaudit — pekerjaan yang kita bahas pada chapter Reproduksibilitas Penelitian .

Referensi: