Instalasi yang selesai tanpa pesan galat belum tentu berarti tumpukan pustaka siap dipakai. Wheel bisa terpasang tidak lengkap, lingkungan bisa tertukar, dan konfigurasi hardware tertentu kadang membuat pustaka numerik gagal saat dijalankan meski berhasil diimpor. Sanity check adalah pemeriksaan cepat dari ujung ke ujung: memastikan semua pustaka termuat, operasi dasar berjalan, dan hasilnya dapat direproduksi. Chapter ini membangun pemeriksaan tersebut langkah demi langkah, sekaligus menanamkan kebiasaan determinisme yang dipakai di sepanjang Course ini.

Apa itu Sanity Check #

Istilah sanity check berasal dari dunia rekayasa: uji ringkas yang menjawab pertanyaan “apakah sistem ini berpikir secara masuk akal?” — bukan “apakah sistem ini sempurna?”. Untuk lingkungan machine learning, tiga pertanyaan itulah yang perlu dijawab murah (detik, bukan menit):

  1. Termuat: seluruh pustaka inti dapat diimpor tanpa galat.
  2. Bekerja: operasi representatif — membangun DataFrame, melatih model mini, memprediksi — menghasilkan keluaran yang wajar.
  3. Terreproduksi: operasi yang sama menghasilkan keluaran yang sama ketika diulang.

Mengapa pemeriksaan ketiga ikut masuk? Karena hampir semua alur kerja machine learning menyentuh generator acak: pembagian data latih-uji, inisialisasi model, dan augmentasi data. Bila benih acak (seed) tidak dikendalikan, hasil evaluasi akan berpindah-pindah antar eksekusi dan Anda tidak bisa membedakan perbaikan model dari derau kebetulan. Kebiasaan menetapkan random_state sejak hari pertama adalah investasi reproduktibilitas jangka panjang.

Pemeriksaan Cepat dari Terminal #

Untuk detak jantung pertama, satu baris perintah cukup — memverifikasi bahwa interpreter aktif dapat mengimpor scikit-learn dan melaporkan versinya:

bash
# pastikan ini berjalan DI DALAM venv proyek
python3 -c "import sklearn; print(sklearn.__version__)"

Bila perintah di atas gagal dengan ModuleNotFoundError, hentikan pencarian lebih jauh dan perbaiki dulu lingkungannya — biasanya venv belum aktif atau pustaka terpasang di interpreter lain. Bila berhasil, barulah lanjut ke pemeriksaan menyeluruh berikut.

Uji Menyeluruh: Impor, Fit, dan Determinisme #

Skrip berikut merangkum empat pemeriksaan dalam satu berkas — cukup simpan dan jalankan berkala, terutama setelah memasang pustaka baru atau memperbarui versi:

python
# Sanity check instalasi machine learning dari ujung ke ujung.
# Empat pemeriksaan: impor pustaka inti, operasi DataFrame kecil,
# fit/predict pada dataset mainan, dan kestabilan random_state.

import numpy as np
import pandas as pd
import scipy
import matplotlib
import sklearn
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# Pemeriksaan 1: seluruh pustaka inti berhasil diimpor.
print("impor      : numpy", np.__version__,
      "| pandas", pd.__version__,
      "| scipy", scipy.__version__,
      "| matplotlib", matplotlib.__version__,
      "| scikit-learn", sklearn.__version__)

# Pemeriksaan 2: pandas mampu membangun dan menghitung DataFrame.
df = pd.DataFrame({"nilai": [70.0, 85.0, 90.0, 60.0]})
print("pandas     : DataFrame", len(df), "baris, rata-rata", f"{df['nilai'].mean():.3f}")

# Pemeriksaan 3: fit dan predict pada dataset mainan.
X_latih = [
    [0.45, 14],
    [0.30, 10],
    [0.80, 16],
    [7.20, 13],
    [0.30, 2],
    [6.50, 3],
]
y_latih = [0, 0, 0, 1, 1, 1]

model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_latih, y_latih)

X_uji = [[0.50, 15], [7.00, 2]]
y_uji = [0, 1]
prediksi = model.predict(X_uji)
benar = sum(int(p == t) for p, t in zip(prediksi, y_uji))
print("prediksi   :", prediksi.tolist())
print("benar      :", f"{benar}/{len(y_uji)}")

# Pemeriksaan 4: random_state menghasilkan pembagian data identik.
rng = np.random.default_rng(42)
X = rng.normal(size=(40, 2))
y = (X[:, 0] + X[:, 1] > 0).astype(int)
a1, b1, ta1, tb1 = train_test_split(X, y, test_size=0.25, random_state=42)
a2, b2, ta2, tb2 = train_test_split(X, y, test_size=0.25, random_state=42)
stabil = (np.array_equal(a1, a2) and np.array_equal(b1, b2)
          and np.array_equal(ta1, ta2) and np.array_equal(tb1, tb2))
print("seed stabil:", stabil)

Output yang Dihasilkan:

text
impor      : numpy 2.1.3 | pandas 2.2.3 | scipy 1.14.1 | matplotlib 3.9.2 | scikit-learn 1.5.2
pandas     : DataFrame 4 baris, rata-rata 76.250
prediksi   : [0, 1]
benar      : 2/2
seed stabil: True

Mari kita bedah keempat blok pemeriksaan di atas:

  1. Baris 5–11 (impor): kelima pustaka inti diimpor sekaligus — aksi ini sendiri sudah merupakan uji karena memuat ekstensi C bawaan masing-masing pustaka. Baris 13–18 lalu mencetak versinya sebagai jejak audit; bandingkan daftar ini dengan requirements.txt Anda.
  2. Baris 20–22 (DataFrame): pandas diuji dengan operasi nyata membangun tabel empat baris dan menghitung rata-ratanya, bukan sekadar diimpor — keluaran 76.250 adalah angka yang bisa Anda verifikasi dengan mata.
  3. Baris 24–43 (fit/predict): KNeighborsClassifier sengaja dipilih karena sepenuhnya deterministik tanpa random_state — algoritme k-nearest neighbors hanya mengukur jarak dan mengambil suara mayoritas, tanpa unsur acak. Prediksi dua titik uji yang tepat (2/2) membuktikan jalur data → model → prediksi berfungsi utuh.
  4. Baris 45–53 (seed): data sintetis 40 titik dibuat dengan default_rng(42), lalu train_test_split dipanggil dua kali dengan random_state=42. Nilai True di akhir membuktikan kedua panggilan menghasilkan pembagian identik — properti yang kita andalkan agar eksperimen dapat ditinjau ulang.

Membaca Gejala Ketika Pemeriksaan Gagal #

Keluaran yang tidak sesuai harapan adalah informasi berharga, bukan kehinaan. Empat gejala paling umum beserta penanganannya dirangkum di bawah ini:

GejalaKemungkinan penyebabTindakan pertama
ModuleNotFoundError: No module named 'sklearn'pustaka terpasang di lingkungan lainperiksa interpreter aktif, aktifkan venv yang benar
ImportError soal pustaka bersama (DLL/.so)instalasi tidak lengkap atau wheel tidak cocokpython3 -m pip install --force-reinstall scikit-learn
seed stabil: Falserandom_state tidak sampai ke semua sumber acakaudit setiap estimator/split; pastikan seed diteruskan
Versi tercetak tidak sesuai rencanadependensi lain menaikkan/menurunkan versi diam-diamaudit dengan pip freeze, kunci versi dengan ==

Lingkungan yang lulus uji menyeluruh kini benar-benar siap dipakai bekerja. Alat kerja berikutnya mengubah cara kita bereksperimen: dari skrip sekali jalan menjadi sel interaktif yang dapat diubah dan dijalankan ulang sepotong-sepotong. Mari lanjut ke Chapter Menggunakan Jupyter Notebook.

Referensi Resmi #