×

Cara Menangani Data Kategorikal dengan One-Hot Encoding

Meja kerja analis data dengan laptop berisi tabel kolom kategorikal dan catatan sketsa kolom biner

Cara Menangani Data Kategorikal dengan One-Hot Encoding

Membuka dataset yang penuh kolom seperti kota, jenis kelamin, atau kategori produk sering membuat bingung harus diapakan sebelum masuk ke model. One-hot encoding data kategorikal adalah salah satu cara paling umum untuk mengubah nilai teks menjadi angka yang bisa diproses algoritma. Teknik ini sering dipakai asal-asalan dan membuat model belajar pola yang keliru.

Pembahasan berikut mencakup kapan one-hot encoding tepat digunakan, apa risikonya, dan bagaimana menerapkannya dengan scikit-learn tanpa mengotori pipeline. Fokusnya pada data tabular yang akan kamu latih dengan model klasifikasi atau regresi.

Apa yang terjadi pada data kategorikal tanpa encoding

Algoritma seperti regresi logistik atau random forest hanya bisa menghitung dengan angka. Kalau kolom berisi ‘Jakarta’, ‘Bandung’, dan ‘Surabaya’, model tidak punya cara alami untuk mengurutkan atau membandingkannya.

Mengubah label menjadi angka 0, 1, 2 memang terlihat sederhana. Masalahnya, model akan menganggap 2 lebih besar dari 1 dan 1 lebih besar dari 0, padahal jarak antara kota tidak punya arti apa pun. Model bisa menyimpulkan sesuatu yang tidak ada di data, misalnya ‘Surabaya dua kali lebih besar dari Bandung’.

Encoding memutus asumsi urutan itu. Setiap kategori mendapat kolom sendiri berisi 0 atau 1, sehingga model memperlakukan semua kategori setara secara struktural.

Kapan one-hot encoding tepat dipakai

One-hot encoding bekerja paling baik saat kolom memiliki sedikit kategori dan tidak ada hubungan urutan di antaranya, misalnya jenis kelamin, status pernikahan, atau metode pembayaran.

Kalau kolommu punya ratusan atau ribuan kategori unik seperti ID pengguna atau kode pos, one-hot encoding akan meledakkan jumlah fitur. Dataset bisa melebar dari puluhan kolom menjadi ribuan, dan sebagian besar isinya nol. Untuk kasus seperti itu, pertimbangkan target encoding, hashing, atau pengelompokan kategori yang jarang muncul.

Kolom berurutan seperti tingkat pendidikan (‘SD’, ‘SMP’, ‘SMA’, ‘S1’) sebaiknya tidak di-one-hot. Gunakan ordinal encoding agar urutannya tetap terbaca model. One-hot justru menghapus informasi urutan yang sebenarnya berguna.

Ada juga varian yang membuang satu kolom dari setiap kategori untuk menghindari kolinearitas sempurna pada model linear. Parameter drop='first' di scikit-learn melakukan ini. Untuk model berbasis pohon, membuang satu kolom biasanya tidak berpengaruh besar, tetapi tidak ada salahnya mencoba keduanya saat validasi.

Menerapkan one-hot encoding dengan scikit-learn

Cara paling aman adalah memakai OneHotEncoder di dalam pipeline. Dengan begitu, proses encoding hanya dipelajari dari data latih dan diterapkan konsisten ke data uji.

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

kolom_kategori = ['kota', 'metode_bayar']
kolom_numerik = ['umur', 'jumlah_transaksi']

preprocess = ColumnTransformer(
    transformers=[
        ('kategori', OneHotEncoder(handle_unknown='ignore'), kolom_kategori),
        ('numerik', 'passthrough', kolom_numerik),
    ]
)

model = Pipeline(steps=[
    ('preprocess', preprocess),
    ('klasifier', RandomForestClassifier(random_state=42)),
])

model.fit(X_train, y_train)

Perhatikan handle_unknown='ignore'. Tanpa parameter ini, encoder akan error saat data uji atau data produksi memuat kategori yang tidak pernah dilihat saat pelatihan. Dengan pengaturan ini, kategori baru diubah menjadi vektor nol, dan model tetap bisa memberi prediksi.

Kalau kamu belum terbiasa menyusun pipeline, mulai dari contoh sederhana di tips melatih model machine learning pertama lalu kembangkan ke dataset yang lebih kompleks. Struktur pipeline yang rapi akan memudahkan langkah berikutnya, termasuk hyperparameter tuning tanpa risiko kebocoran data.

Jebakan yang sering muncul

  • Encoding sebelum split data. Kalau kamu memanggil fit pada seluruh dataset lalu membaginya, informasi dari data uji ikut memengaruhi encoder. Selalu fit hanya pada data latih.
  • Mengabaikan kategori jarang. Kategori yang hanya muncul sekali atau dua kali akan menghasilkan kolom yang hampir seluruhnya nol. Gabungkan dulu ke label ‘lainnya’ sebelum encoding.
  • Lupa menangani nilai hilang. OneHotEncoder modern bisa memperlakukan nilai kosong sebagai kategori tersendiri, tetapi perilakunya berbeda antarversi. Periksa dokumentasi dan uji pada data contoh.
  • Membiarkan nama kolom berantakan. Setelah encoding, nama fitur berubah menjadi gabungan nama kolom dan kategori. Simpan encoder atau aktifkan get_feature_names_out() agar analisis fitur tetap bisa dilakukan.

Jebakan lain muncul saat kamu memakai model linear. Kolom one-hot yang saling melengkapi membuat matriks fitur memiliki kolinearitas sempurna. Sebagian model linear mengatasinya dengan regularisasi, sebagian lagi perlu drop='first'. Uji lewat cross-validation untuk melihat mana yang lebih stabil.

Alternatif saat one-hot encoding tidak lagi cocok

Ketika jumlah kategori mulai membengkak, ada beberapa pilihan yang lebih hemat fitur. Target encoding mengganti kategori dengan rata-rata target, tetapi rawan kebocoran data kalau tidak memakai validasi silang. Frequency encoding mengganti kategori dengan seberapa sering muncul, cocok untuk kategori yang punya pola kemunculan penting. Hashing memetakan kategori ke sejumlah kolom tetap, berguna saat kategori terus bertambah.

Pilihan metode sebaiknya diuji, bukan ditebak. Bandingkan performa model dengan metrik yang sama dan proses validasi yang konsisten. Teknik apa pun yang kamu pilih, pastikan proses encoding selalu berada di dalam pipeline agar hasilnya bisa direproduksi.

Merapikan encoding untuk proyek yang lebih besar

Di proyek nyata, data kategorikal jarang berdiri sendiri. Ia bercampur dengan data numerik yang perlu dinormalisasi, data hilang yang harus diimputasi, dan outlier yang memengaruhi distribusi. Menyatukan semuanya dalam satu ColumnTransformer membuat alur preprocessing lebih mudah dibaca dan diuji.

Saat kamu memindahkan model ke produksi, encoder yang sudah dilatih perlu disimpan bersama model. Kalau pipeline disimpan utuh dengan joblib, encoder ikut terbawa dan tidak perlu dilatih ulang. Ini penting karena kategori baru bisa muncul kapan saja di data live.

Untuk proyek yang lebih besar, pertimbangkan menyimpan konfigurasi kolom kategori di satu tempat. Dengan begitu, perubahan pada dataset tidak memaksa kamu menulis ulang kode preprocessing dari awal. Pendekatan ini juga memudahkan kolaborasi ketika beberapa orang mengerjakan pipeline yang sama.

Ringkasan

One-hot encoding data kategorikal mengubah label teks menjadi kolom biner yang bisa dibaca model tanpa menambahkan urutan palsu. Gunakan saat kategori sedikit dan tidak berurutan, selalu fit di dalam pipeline pada data latih, dan tangani kategori tak dikenal dengan handle_unknown='ignore'. Saat jumlah kategori membengkak, beralihlah ke metode encoding lain dan uji pilihanmu lewat validasi yang konsisten.

Pertanyaan yang Sering Diajukan

Apakah one-hot encoding selalu lebih baik dari label encoding?

Tidak. Label encoding lebih hemat fitur dan cocok untuk data berurutan atau model berbasis pohon yang tidak terlalu terganggu skala. One-hot unggul saat kategori tidak punya urutan dan jumlahnya masih wajar.

Bagaimana menangani kategori baru yang muncul saat prediksi?

Gunakan handle_unknown='ignore' pada OneHotEncoder agar kategori asing diubah menjadi vektor nol. Alternatifnya, kelompokkan kategori jarang ke label ‘lainnya’ sejak tahap pelatihan.

Berapa jumlah kategori maksimal sebelum one-hot encoding jadi masalah?

Tidak ada angka pasti karena bergantung pada jumlah baris dan jenis model. Sebagai patokan awal, waspadai kolom dengan lebih dari 50 kategori unik pada dataset berukuran sedang, lalu bandingkan performa dengan metode encoding lain lewat cross-validation.

You May Have Missed