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):
- Termuat: seluruh pustaka inti dapat diimpor tanpa galat.
- Bekerja: operasi representatif — membangun DataFrame, melatih model mini, memprediksi — menghasilkan keluaran yang wajar.
- 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:
# 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:
# 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:
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: TrueMari kita bedah keempat blok pemeriksaan di atas:
- 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.txtAnda. - Baris 20–22 (DataFrame): pandas diuji dengan operasi nyata membangun tabel empat baris dan menghitung rata-ratanya, bukan sekadar diimpor — keluaran
76.250adalah angka yang bisa Anda verifikasi dengan mata. - Baris 24–43 (fit/predict):
KNeighborsClassifiersengaja dipilih karena sepenuhnya deterministik tanparandom_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. - Baris 45–53 (seed): data sintetis 40 titik dibuat dengan
default_rng(42), lalutrain_test_splitdipanggil dua kali denganrandom_state=42. NilaiTruedi 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:
| Gejala | Kemungkinan penyebab | Tindakan pertama |
|---|---|---|
ModuleNotFoundError: No module named 'sklearn' | pustaka terpasang di lingkungan lain | periksa interpreter aktif, aktifkan venv yang benar |
ImportError soal pustaka bersama (DLL/.so) | instalasi tidak lengkap atau wheel tidak cocok | python3 -m pip install --force-reinstall scikit-learn |
seed stabil: False | random_state tidak sampai ke semua sumber acak | audit setiap estimator/split; pastikan seed diteruskan |
| Versi tercetak tidak sesuai rencana | dependensi lain menaikkan/menurunkan versi diam-diam | audit 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 #
- Common pitfalls and recommended practices — scikit-learn — bagian controlling randomness menjelaskan kendali benih acak secara resmi.
- KNeighborsClassifier — scikit-learn API — dokumentasi estimator yang dipakai pada pemeriksaan ketiga.
- Random sampling — NumPy
— rujukan sistem generator acak NumPy dan pola
default_rng(seed).