Kapan harus menggunakan One Hot Encoding vs LabelEncoder vs DictVectorizor?


97

Saya telah membangun model dengan data kategorikal untuk sementara waktu sekarang dan ketika dalam situasi ini pada dasarnya saya menggunakan fungsi LabelEncoder scikit-learn untuk mengubah data ini sebelum membangun model.

Saya mengerti perbedaan di antara OHE, LabelEncoderdan DictVectorizordalam hal apa yang mereka lakukan terhadap data, tetapi yang tidak jelas bagi saya adalah ketika Anda mungkin memilih untuk menggunakan satu teknik di atas yang lain.

Adakah algoritma atau situasi tertentu di mana seseorang memiliki kelebihan / kekurangan sehubungan dengan yang lain?


2
Dalam referensi untuk jawaban AN6U5 ini , dan pernyataan ini:> Masih ada algoritma seperti pohon keputusan dan hutan acak yang dapat bekerja dengan variabel kategori baik-baik saja dan LabelEncoder dapat digunakan untuk menyimpan nilai-nilai menggunakan ruang disk kurang. Tidakkah menggunakan LabelEncoder mengubah kategorikal menjadi fitur numerik, sehingga menyebabkan pohon keputusan untuk melakukan pemisahan pada beberapa nilai yang tidak benar-benar masuk akal karena pemetaannya sewenang-wenang?
Nico

1
Nico, saya pikir apa yang AN6U5 katakan adalah khusus untuk pohon keputusan itu berfungsi dengan baik, karena pohon akan terpecah pada anjing, kucing, tikus atau 1,2,3 dan arti dari "kucing" vs "2" tidak penting untuk sebatang pohon (pikirkan tentang cara ia terbelah). Dalam kasus sesuatu seperti regresi logistik, nilai-nilai adalah bagian dari persamaan karena Anda mengalikan nilai bobot * sehingga dapat menyebabkan masalah pelatihan dan masalah berat karena anjing: 1 dan kucing: 2 tidak memiliki hubungan numerik 1 * 2 (meskipun masih dapat bekerja dengan contoh dan zaman pelatihan yang cukup).
Doug F

Jawaban:


126

Ada beberapa kasus di mana LabelEncoder atau DictVectorizor berguna, tetapi ini sangat terbatas menurut pendapat saya karena ordinalitas.

LabelEncoder dapat mengubah [anjing, kucing, anjing, tikus, kucing] menjadi [1,2,1,3,2], tetapi kemudian peraturan yang diberlakukan berarti bahwa rata-rata anjing dan tikus adalah kucing. Masih ada algoritma seperti pohon keputusan dan hutan acak yang dapat bekerja dengan variabel kategorikal saja dan LabelEncoder dapat digunakan untuk menyimpan nilai menggunakan ruang disk lebih sedikit.

One-Hot-Encoding memiliki keuntungan bahwa hasilnya adalah biner daripada ordinal dan semuanya berada dalam ruang vektor ortogonal. Kerugiannya adalah untuk kardinalitas tinggi, ruang fitur dapat benar-benar meledak dengan cepat dan Anda mulai berkelahi dengan kutukan dimensi. Dalam kasus ini, saya biasanya menggunakan satu-hot-encoding diikuti oleh PCA untuk pengurangan dimensi. Saya menemukan bahwa kombinasi yang bijaksana dari one-hot plus PCA jarang dapat dikalahkan oleh skema pengkodean lainnya. PCA menemukan tumpang tindih linier, sehingga secara alami akan cenderung mengelompokkan fitur yang serupa ke dalam fitur yang sama.


1
Terima kasih banyak - ini sangat membantu dan masuk akal. Apakah ada skema penyandian lain yang Anda gunakan untuk kasus khusus / tepi? Pernahkah Anda menemukan bahwa Anda berada dalam situasi di mana Anda akan menggunakan skema penyandian yang berbeda untuk fitur yang berbeda?
anth

21

Sementara AN6U5 telah memberikan jawaban yang sangat bagus, saya ingin menambahkan beberapa poin untuk referensi di masa mendatang. Saat mempertimbangkan One Hot Encoding (OHE) dan Label Encoding , kita harus mencoba dan memahami model apa yang Anda coba buat. Yaitu dua kategori model yang akan kami pertimbangkan adalah:

  1. Model Berbasis Pohon : Gradien Meningkatkan Pohon Keputusan dan Hutan Acak.
  2. Model Berbasis Non-Pohon: Berbasis Linear, kNN atau Neural Network.

Mari kita pertimbangkan kapan menerapkan OHE dan kapan menerapkan Label Encoding sambil membangun model berbasis pohon.

Kami menerapkan OHE ketika:

  1. Ketika nilai yang dekat satu sama lain dalam pengkodean label sesuai dengan nilai target yang tidak dekat (data non-linear).
  2. Ketika fitur kategorikal tidak ordinal (anjing, kucing, tikus).

Kami menerapkan penyandian Label ketika:

  1. Fitur kategorikal adalah ordinal (Jr. kg, Sr. kg, sekolah dasar, sekolah tinggi, dll).
  2. Ketika kita dapat menemukan pembuat enkode label yang memberikan label dekat ke kategori yang serupa : Hal ini menyebabkan lebih sedikit spill di tress sehingga mengurangi waktu eksekusi.
  3. Ketika jumlah fitur kategorikal dalam dataset sangat besar: Pengkodean satu-panas fitur kategorikal dengan sejumlah besar nilai dapat menyebabkan (1) konsumsi memori tinggi dan (2) kasus ketika fitur non-kategorikal jarang digunakan oleh model. Anda dapat menangani kasing pertama jika Anda menggunakan matriks jarang. Kasing ke-2 dapat terjadi jika Anda membangun pohon menggunakan hanya sebagian fitur. Misalnya, jika Anda memiliki 9 fitur numerik dan 1 kategori dengan 100 nilai unik dan Anda satu-hot-encoded fitur kategori itu, Anda akan mendapatkan 109 fitur. Jika pohon dibangun dengan hanya sebagian dari fitur, fitur awal 9 numerik jarang akan digunakan. Dalam hal ini, Anda dapat meningkatkan ukuran pengontrolan parameter dari subset ini. Dalam xgboost disebut colsample_bytree, dalam max_features Hutan Acak sklearn.

Jika Anda ingin melanjutkan dengan OHE, seperti yang disarankan @ AN6U5, Anda mungkin ingin menggabungkan PCA dengan OHE.

Mari kita pertimbangkan kapan menerapkan OHE dan Label Encoding sambil membangun model yang tidak berbasis pohon.

Untuk menerapkan pengkodean Label, ketergantungan antara fitur dan target harus linier agar Pengkodean Label dapat digunakan secara efektif.

Demikian pula, jika ketergantungannya non-linear, Anda mungkin ingin menggunakan OHE untuk hal yang sama.

Catatan: Beberapa penjelasan telah dirujuk dari Cara Memenangkan Kompetisi Sains Data dari Coursera.


Penjelasan yang sangat intuitif. Bukankah seharusnya "split", bukan "spilt"?
dzieciou

0

LabelEncoder untuk data ordinal, sedangkan OHE untuk data nominal.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.