Praktik terbaik untuk pengkodean fitur kategorikal untuk Pohon Keputusan?

13

Ketika mengkode fitur kategorikal untuk regresi linier, ada aturan: jumlah boneka harus kurang dari jumlah total level (untuk menghindari kolinearitas).

Apakah ada aturan yang sama untuk Pohon Keputusan (dikantongi, dikuatkan)? Saya menanyakan hal ini karena praktik standar dalam Python tampaknya adalah memperluas nlevel menjadi nboneka (sklearns ' OneHotEncoderatau Pandas' pd.get_dummies) yang tampaknya tidak optimal bagi saya.

Apa yang akan Anda sarankan sebagai praktik terbaik untuk pengkodean fitur Kategorikal untuk Pohon Keputusan?

Sergey Bushmanov
sumber

Jawaban:

12

Sepertinya Anda mengerti bahwa Anda dapat memiliki nlevel, sebagai lawan dari n-1, karena tidak seperti dalam regresi linier Anda tidak perlu khawatir tentang kolinearitas sempurna.

(Saya datang pada ini dari perspektif R, tapi saya menganggap itu sama dengan Python.) Itu tergantung pada beberapa hal, seperti 1) paket mana yang Anda gunakan dan 2) berapa banyak tingkat faktor yang Anda miliki.

1) Jika Anda menggunakan randomForestpaket R , maka jika Anda memiliki <33 faktor, Anda dapat melanjutkan dan membiarkannya dalam satu fitur jika Anda mau. Itu karena dalam implementasi R hutan acak, itu akan memeriksa untuk melihat tingkat faktor mana yang harus di satu sisi split dan yang di sisi lain (misalnya, 5 level Anda mungkin dikelompokkan bersama di sisi kiri, dan 7 mungkin dikelompokkan bersama di sebelah kanan). Jika Anda membagi fitur kategorikal menjadi nboneka, maka algoritme tidak akan memiliki opsi ini.

Tentunya jika paket yang Anda gunakan tidak dapat menangani fitur kategorikal maka Anda hanya perlu membuat nvariabel dummy.

2) Seperti yang saya singgung di atas, implementasi hutan acak R hanya dapat menangani 32 level faktor - jika Anda memiliki lebih dari itu maka Anda juga perlu membagi faktor Anda menjadi himpunan bagian yang lebih kecil, atau membuat variabel dummy untuk setiap level.

Tchotchke
sumber
1
Terima kasih! Apakah saya mendapatkan Anda dengan benar: kecuali saya memodelkan dalam R, di mana fitur kategorikal dalam randomForestdikodekan secara otomatis, saya harus menggunakan ndummies karena collinearity bukan masalah untuk RF?
Sergey Bushmanov
3
Memiliki lebih dari 32 tingkat kategori binary-encoded akan memiliki perilaku yang sedikit berbeda di pohon, karena RF hanya akan memilih dari antara kolom-kolom biner, daripada memilih kolom tunggal dari faktor dengan banyak tingkatan. Perbedaan halus ini berarti bahwa pemisahan pada kolom biner akan kurang informatif dibandingkan dengan pemisahan pada kolom faktor, karena hanya ada satu pilihan (0/1) dibandingkan (1 / {2,3}, {2,1} / 3 ) dll.
Sycorax berkata Reinstate Monica
@ user777 Ini bukan masalah memiliki lebih dari 32 variabel. Masalahnya adalah tidak memiliki variabel kategori "dikelompokkan" dalam Python sklearn... Secara praktis, apakah ada bukti (pengalaman praktis, penelitian, dll) bahwa variabel "dummified" akan berkinerja lebih buruk daripada variabel kategori "dikelompokkan" [dalam R]
Sergey Bushmanov
1
Secara teoritis, kami dapat mengharapkan non-grup untuk melakukan sedikit lebih buruk, karena Anda memberikan fleksibilitas model yang lebih sedikit. Dalam kasus yang dikelompokkan, jika itu benar-benar lebih baik untuk memperlakukan fitur yang tidak dikelompokkan, maka model akan dapat melakukan itu (dengan menempatkan satu kelompok di satu sisi, dan kemudian semua yang lain di sisi lain). Namun dalam praktiknya, saya akan terkejut jika ada banyak perbedaan (terutama dalam kasus RF, di mana Anda membuat begitu banyak pohon)
Tchotchke
2
Saya menemukan implementasi randomForest menggunakan fitur dengan banyak level faktor (> 15) lambat seperti yang disebutkan, tetapi juga untuk menghasilkan kinerja model yang biasa-biasa saja. Saya kira jumlah yang sangat tinggi dari perpecahan yang mungkin akan mengurangi dekorasi pohon yang dimaksudkan dalam ansambel. extraTrees dan Rborist hanya mencoba subsampel dari pemisahan katagoris di setiap node. Itu dapat membantu hubungan dekorasi dan tentu saja kecepatan. Dengan demikian serangkaian solusi antara "randomForest coba perpecahan apa pun" dan "sklern dummy-variable only try 1-vs-rest splits" dimungkinkan. Juga pengelompokan yang berbeda dari banyak tingkatan ke tingkatan yang lebih sedikit mungkin bermanfaat.
Soren Havelund Welling
4

Ada pendekatan lain untuk menangani variabel kategori yang disebut target / dampak encoding.

Dalam skema ini idenya adalah untuk menyandikan fitur menggunakan kolom float tunggal di mana nilainya adalah rata-rata variabel target atas semua baris yang berbagi kategori. Ini sangat berguna untuk model berbasis pohon karena memaksakan hubungan urutan dalam fitur (yaitu nilai di sebelah kanan kategori memiliki respons rata-rata yang lebih tinggi daripada nilai di sebelah kiri) dan membuatnya lebih mudah untuk membagi ruang prediktor.

Berikut ini penjelasan yang bagus tentang subjek:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Dan inilah tautan ke makalah yang awalnya mengusulkan penyandian: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Ada beberapa rincian lebih lanjut untuk menghindari estimasi rata-rata dalam kategori dengan jumlah rendah dan juga ada model lain, CatBoost, mengusulkan solusi untuk biasing yang diperkenalkan oleh pengkodean ini, tetapi dalam pengalaman saya ini adalah cara sederhana dan sangat berguna untuk menyandikan variabel kategori kardinalitas tinggi kardinalitas .

Ludecan
sumber