7 Kesalahan Umum Saat Menyiapkan Dataset Machine Learning
Sabtu pagi, kamu sudah menyiapkan kopi dan membuka notebook. Model klasifikasi sudah jalan, akurasinya 0,94 di data latih, tapi begitu diuji ke data baru hasilnya jatuh ke 0,61. Setelah dicek, masalahnya bukan di algoritma. Ada baris duplikat, kolom tanggal yang bocor ke fitur, dan nilai kosong yang terisi angka nol. Kesalahan menyiapkan dataset machine learning seperti ini paling sering terjadi karena dikerjakan cepat, bukan karena kurang paham.
Tujuh poin di bawah adalah jebakan yang paling sering muncul di proyek pertama. Setiap poin menyebut gejalanya, alasan kenapa berbahaya, dan langkah perbaikan yang bisa langsung kamu jalankan.
1. Membersihkan data latih dan data uji secara terpisah
Beberapa orang menganggap dua file ini harus diperlakukan sebagai dua proyek berbeda. Akibatnya, aturan pengisian nilai kosong, batas outlier, dan skala normalisasi dihitung dari masing-masing set. Model lalu belajar dari dua dunia yang aturannya tidak sama, sehingga evaluasi tidak lagi mencerminkan performa sebenarnya.
Latih semua parameter pembersihan pada data latih, lalu terapkan ke data uji. Untuk normalisasi, hitung rata-rata dan simpangan baku dari data latih saja. Kalau kamu memakai Pipeline dan ColumnTransformer dari scikit-learn, urutan ini otomatis terjaga karena fit hanya dipanggil pada data latih. Pembahasan lebih rinci soal pembagian data ada di cara split data latih dan data uji yang benar.
2. Membiarkan data bocor dari masa depan
Data leakage adalah kondisi ketika informasi yang seharusnya belum tersedia saat prediksi ikut masuk sebagai fitur. Contoh klasik: memprediksi pelanggan berhenti berlangganan, tapi kolom tanggal berhenti tetap ada di tabel fitur. Akurasi di notebook terlihat bagus, tapi model tidak berguna saat dipakai.
Urutkan kolom berdasarkan waktu kejadian, lalu tanyakan untuk setiap kolom: apakah nilai ini sudah diketahui pada saat prediksi dibuat? Kalau jawabannya tidak, keluarkan dari fitur. Untuk data time series, potong data berdasarkan tanggal, bukan acak, supaya baris masa depan tidak tercampur ke data latih.
3. Mengabaikan baris duplikat
Data hasil scraping, ekspor formulir, atau penggabungan dua tabel sering menyisakan baris kembar. Kalau duplikat dibiarkan, model bisa dilatih pada baris yang sama berkali-kali, dan bobotnya jadi bias ke pola tersebut. Masalahnya bertambah kalau duplikat hanya ada di data latih karena proses split dilakukan setelah penggabungan.
Cek dengan df.duplicated().sum() sebelum split. Kalau ada, putuskan apakah duplikat memang kejadian nyata (misalnya dua transaksi identik di hari berbeda) atau kesalahan input. Untuk kasus kedua, hapus sebelum data dibagi.
4. Mengisi nilai kosong dengan angka yang mengubah makna
Mengisi kolom usia yang kosong dengan nol, atau kolom harga dengan nol, menciptakan data yang tidak pernah ada. Model akan menganggap nilai nol itu fakta, padahal artinya hanya ketiadaan informasi. Pola serupa muncul saat mengisi kolom kategorikal dengan string "unknown" lalu memperlakukannya sebagai kategori biasa tanpa penanda khusus.
Untuk kolom numerik, median atau rata-rata dari data latih biasanya lebih aman. Untuk kolom kategorikal, tambahkan kategori baru yang eksplisit dan beri penanda is_missing agar model bisa membedakan nilai kosong dari nilai asli. Langkah pengisian yang lebih lengkap dibahas di cara menangani data hilang sebelum melatih model.
5. Membuang outlier tanpa memeriksa dulu
Fungsi pembersihan otomatis yang memotong semua nilai di luar dua simpangan baku terdengar rapi, tapi bisa membuang justru kejadian yang ingin diprediksi. Pada data penipuan kartu kredit atau kegagalan mesin, outlier adalah sinyal utama. Menghapusnya membuat model kehilangan contoh paling penting.
Periksa dulu apakah nilai ekstrem itu salah input atau kejadian nyata. Kalau nyata, pertahankan dan pilih model yang tahan terhadap skala nilai. Kalau salah input, perbaiki satu per satu atau ganti dengan nilai yang masuk akal. Cara memeriksa dan menanganinya dibahas lebih rinci di panduan tentang menangani outlier sebelum melatih model.
6. Melabeli kategori dengan angka yang tidak bermakna
Mengubah merah, hijau, biru menjadi 0, 1, 2 membuat model menganggap biru lebih besar dari merah. Untuk algoritma berbasis jarak, urutan palsu ini merusak perhitungan. Kesalahan serupa muncul saat membiarkan ID pelanggan masuk sebagai fitur numerik, padahal ID hanya penanda unik.
Gunakan one-hot encoding untuk kategori tanpa urutan, dan simpan ID di kolom terpisah yang tidak ikut dilatih. Kalau kategori punya urutan alami seperti rendah, sedang, tinggi, ordinal encoding lebih tepat. Penjelasan lengkapnya ada di cara menangani data kategorikal dengan one-hot encoding.
7. Tidak mencatat versi dan asal data
Setelah beberapa minggu, notebook yang dulu menghasilkan skor 0,85 sulit direproduksi karena tidak ada catatan file mana yang dipakai. Data mentah sudah ditimpa, kolom sudah diubah, dan filter yang dulu dijalankan tidak terdokumentasi. Tim lain lalu menghabiskan waktu menebak urutan langkah yang seharusnya.
Simpan data mentah di folder terpisah dan jangan pernah menimpanya. Beri nama file dengan tanggal unduh dan sumbernya. Catat setiap transformasi di skrip, bukan hanya di sel notebook yang bisa terhapus. Kalau data berasal dari perangkat lapangan, pilihan media penyimpanan menentukan seberapa aman data mentah bertahan, dan ulasan tentang memilih penyimpanan data untuk perangkat IoT bisa jadi pertimbangan saat merancang alur pengumpulannya.
Satu kebiasaan kecil yang membantu: biasakan mencetak df.info(), df.describe(), dan jumlah nilai kosong setiap kali memuat file baru. Ketiga keluaran itu menangkap sebagian besar masalah di atas dalam hitungan detik. Kalau kamu juga memakai JavaScript di sisi antarmuka untuk memeriksa data sebelum dikirim, tips jQuery untuk pemula dalam mendebug kode lewat console berguna untuk melacak nilai yang tidak sesuai.
Ringkasan
Kebanyakan masalah dataset muncul dari langkah yang dikerjakan terburu-buru: pembersihan terpisah antara data latih dan uji, kebocoran informasi masa depan, duplikat, pengisian nilai kosong yang mengubah makna, penghapusan outlier secara membabi buta, encoding kategori yang salah, dan tidak adanya catatan versi data. Perbaiki satu per satu, mulai dari yang paling mudah diperiksa, dan jalankan ulang evaluasi model setelah setiap perubahan.
Pertanyaan yang Sering Diajukan
Apakah duplikat selalu harus dihapus?
Tidak. Kalau duplikat merepresentasikan kejadian nyata yang memang berulang, pertahankan. Yang perlu dihapus adalah duplikat akibat kesalahan ekspor atau penggabungan tabel, karena baris itu memberi bobot berlebih pada pola yang sama.
Bagaimana cara tahu dataset saya mengalami kebocoran data?
Gejalanya biasanya skor evaluasi sangat tinggi di data uji silang tapi jauh lebih rendah saat dipakai di data baru. Periksa kolom yang hanya tersedia setelah kejadian terjadi, dan pastikan pembagian data time series mengikuti urutan waktu.
Apakah normalisasi harus dihitung ulang untuk data uji?
Tidak. Hitung parameter normalisasi dari data latih, lalu pakai nilai yang sama untuk data uji. Menghitung ulang dari data uji membuat distribusi kedua set berbeda dan hasil evaluasi jadi menyesatkan.


