Karar Ağaçları için kategorik özellikleri kodlamak için en iyi uygulamalar?


13

Doğrusal regresyon için kategorik özellikleri kodlarken, bir kural vardır: aptal sayısı toplam düzey sayısından daha az olmalıdır (eşzamanlılığı önlemek için).

Karar Ağaçları için benzer bir kural var mı (torbalanmış, güçlendirilmiş)? Bunu soruyorum çünkü Python'daki standart bir uygulama, nseviyeleri benim için yetersiz görünen nmankenlere (sklearns ' OneHotEncoderveya Pandas' pd.get_dummies) genişletmek gibi görünüyor .

Karar Ağaçları için kategorik özellikleri kodlamak için en iyi uygulamalar olarak ne önerirsiniz?

Yanıtlar:


12

Görünüşe göre nseviyelere sahip olabileceğinizi anlıyorsunuz n-1, çünkü lineer regresyondan farklı olarak mükemmel lineerlik hakkında endişelenmenize gerek yok.

(Bunu R perspektifinden geliyorum, ancak Python'da aynı olduğunu varsayıyorum.) Bu, 1) hangi paketi kullandığınıza ve 2) kaç faktör seviyesine sahip olduğunuz gibi birkaç şeye bağlıdır.

1) R randomForestpaketini kullanıyorsanız , <33 faktör seviyeniz varsa, devam edip isterseniz bir özellikte bırakabilirsiniz. Çünkü R'nin rastgele orman uygulamasında, bölünmenin bir tarafında hangi faktör seviyelerinin olması gerektiğini ve diğer tarafında (örneğin, 5 seviyeniz sol tarafta gruplandırılabilir ve 7 gruplandırılabilir) kontrol edilir. birlikte sağda). Kategorik özelliği naptallara ayırırsanız, algoritmanın elinde bu seçenek olmaz.

Açıkçası, kullandığınız özellikle paket kategorik özellikleri işleyemiyorsa, sadece nkukla değişkenler oluşturmanız gerekir .

2) Yukarıda bahsettiğim gibi, R'nin rastgele orman uygulaması sadece 32 faktör seviyesini işleyebilir - bundan daha fazlasına sahipseniz, faktörlerinizi daha küçük alt kümelere bölmeniz veya her seviye için bir kukla değişken oluşturmanız gerekir.


1
Teşekkürler! Sizi doğru şekilde mi alıyorum: kategorik özelliklerin randomForestotomatik olarak kodlandığı R'de modellemezsem, neşzamanlılık RF için bir sorun olmadığı için aptallarla gitmeliyim ?
Sergey Bushmanov

3
32 seviyeden fazla ikili kodlanmış kategorilere sahip olmak, ağaçta biraz farklı davranışlara sahip olacaktır, çünkü RF, birçok seviyeye sahip faktörün tek sütununu seçmek yerine sadece bu ikili sütunlar arasından seçim yapacaktır. Bu ince fark, ikili sütunlardaki bölünmenin faktör sütunundaki bölünmeye kıyasla daha az bilgilendirici olacağı anlamına gelir, çünkü (1 / {2,3}, {2,1} / 3'e karşı tek bir seçenek (0/1) vardır ) vs.
Sycorax, Reinstate Monica'yı

@ user777 32'den fazla değişkene sahip olmak sorunu değil. Bu, Python'da "gruplandırılmış" kategori değişkenlerine sahip olmama sorunu sklearn... Pratik olarak, "dummified" değişkenlerin "gruplandırılmış" kategorik değişkenlerden [R] daha kötü performans göstereceğine dair bir kanıt (pratik deneyim, araştırma vb.) Var mı
Sergey Bushmanov

1
Teorik olarak, gruplandırılmamışların biraz daha kötü performans göstermesini bekleyebiliriz, çünkü modele daha az esneklik veriyorsunuz. Gruplandırılmış durumda, bu özelliğe gruplanmamış olarak davranmak gerçekten daha iyi olsaydı, model bunu yapabilirdi (bir grubu bir tarafa, sonra diğerlerini diğer tarafa koyarak). Bununla birlikte, pratikte, çok fazla fark olsaydı
şaşırırdım

2
Belirtildiği gibi birçok faktör seviyesine (> 15) sahip özellikleri kullanarak randomForest uygulamasını yavaş buluyorum ama aynı zamanda vasat model performansı da elde ediyorum. Sanırım çok yüksek sayıda olası yarılma, topluluktaki ağaçların dekorla ilişkisini azaltacaktır. extraTrees ve Rborist, her düğümde yalnızca bir alt kategorik bölünme denemesi yapar. Bu, ilintisizleştirmeye ve kesinlikle hıza yardımcı olabilir. Böylece "randomForest herhangi bir bölünmeyi deneyin" ve "sklern kukla-değişkeni sadece 1'e karşı dinlenme böler" arasında bir dizi çözüm mümkündür. Ayrıca, birçok seviyenin daha az seviyedeki farklı kümelenmeleri yararlı olabilir.
Soren Havelund Welling

4

Hedef / etki kodlaması adı verilen kategorik değişkenlerle uğraşmak için başka bir yaklaşım daha vardır.

Bu şemada fikir, özelliği kategoriyi paylaşan tüm satırlarda değerin hedef değişkenin ortalaması olduğu tek bir kayan sütun kullanarak kodlamaktır. Bu özellik özellikle ağaç tabanlı modeller için kullanışlıdır, çünkü özellik içinde bir sipariş ilişkisi oluşturur (yani, kategorinin sağındaki değerler, soldaki değerlerden daha yüksek ortalama yanıta sahiptir) ve öngörücü alanı bölmeyi kolaylaştırır.

İşte konuyla ilgili güzel bir açıklama:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

Ve işte aslen kodlamayı öneren makaleye bir link: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Düşük sayıdaki kategorilerde ortalamanın tahmin edilmesinden kaçınmak için daha fazla ayrıntı var ve ayrıca bu kodlamanın getirdiği önyargıya bir çözüm öneren başka bir model olan CatBoost var, ancak benim deneyimime göre, yüksek kardinalite kategorik değişkenlerini kodlamanın basit ve çok yararlı bir yolu .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.