Birçok kategorik değişkenle sınıflandırmayı iyileştirin


37

200.000'den fazla örnek ve bir örnek başına yaklaşık 50 özellik içeren bir veri kümesi üzerinde çalışıyorum: 10 sürekli değişken ve diğerleri ~ 40 kategorik değişkenlerdir (ülkeler, diller, bilimsel alanlar vb.). Bu kategorik değişkenler için, örneğin 150 farklı ülke, 50 dil, 50 bilimsel alan vb. Var.

Şimdiye kadar benim yaklaşımım:

  1. Mümkün olan birçok değeri olan her kategorik değişken için, yalnızca bu değeri alan 10000'den fazla örneğe sahip olanı alın. Bu 150 yerine 5-10 kategoriye düşer.

  2. Her kategorik kategori için kukla değişken oluşturun (her örnek için 10 ülke varsa, 10 büyüklüğünde bir ikili vektör ekleyin).

  3. Bu verilerle rasgele bir orman sınıflandırıcı besleyin (parametreleri vb. Çapraz onaylayın).

Şu anda bu yaklaşımla sadece% 65 doğruluk elde edebiliyorum ve daha fazlasını yapabileceğimi hissediyorum. Özellikle 1) 'den memnun değilim, çünkü sahip olduğum örnek sayısına göre "en az ilgili değerleri" keyfi olarak çıkarmamam gerektiğini hissediyorum çünkü bu daha az temsil edilen değerler daha ayırt edici olabilir. Öte yandan, RAM'im, tüm olası değerleri koruyarak verilere 500 sütun * 200000 satır ekleyemez.

Bu kadar kategorik değişkenlerle baş etmek için herhangi bir öneriniz var mı?


2
Hala ilgi ediyorsanız, kontrol etmek isteyebilirsiniz cevabım üzerine boyut indirgeme ve benim cevap üzerine hiyerarşik sınıflandırma .
Aleksandr Blekh,

1
"Her bir kategorik için kukla değişken oluştur" derken , Python'u R değil mi kullanıyorsunuz? R randomforest yerel olarak kategorileri yönetebilir, ayrıca sonuçta bellek azalması da olabilir. R. deneyin
SMCI

Yanıtlar:


20

1) Rastgele ormanlar, kategorik değerleri yerel olarak idare edebilmelidir, bu nedenle farklı bir uygulama arayın, böylece tüm bu özellikleri kodlamanız ve hafızanızı kullanmanız gerekmez.

2) Kardinalitesi yüksek kategorik özelliklere sahip olan sorun, bunlara uymanın kolay olmasıdır. Bunun bir sorun olmadığı konusunda yeterince bilginiz olabilir, ancak buna dikkat edin.

3) Brieman'ın önerdiği yöntemi veya yapay kontrastları kullanarak rastgele orman temelli özellik seçimine bakmayı öneriyorum . Yapay kontrast yöntemi (ACE) ilginçtir, çünkü özelliğin önemini, bazı yüksek kardinalite sorunlarıyla mücadele eden karıştırılmış versiyonunun önemiyle karşılaştırır. Çok ilişkili özelliklere sahip grupların farkında olan bir özellik seçme yöntemi kullandığından çok daha fazla özelliğiniz varsa ilginç olabilecek yeni bir “Modül Kılavuzlu Rastgele Orman” makalesi vardır.

4) Bazen kullanılan başka bir seçenek de algoritmayı çimdiklemektir; bu nedenle, bazen fazla uyumla mücadeleye yardım eden çanta içi bölmelerdeki bölmeleri taktıktan sonra, son özellik seçimini yapmak için çanta dışı durumlarını kullanır.

Orada neredeyse tam bir ace uygulamasıdır burada ve ben doğal olarak kolları kategorik değişkenler olduğunu daha bellek effichent / hızlı rf uygulaması var burada ... -evaloob seçenek destekleri opsiyonu 4 Ben ACE destek ekleme çalışıyorum ve diğer rf bir çift özellik seçimi yöntemlerini temel alan ancak henüz yapılmadı.


4
Tüm bu öneriler ilginç, rastgele ormanın doğal kategorik değişkenlerle başa çıkması gerektiğine katılıyorum, ancak scikit-learn yapmıyor ... Bence bu, scikit'in temel kusurlarından biri. Ne olacağını görmek için verilerim üzerindeki kodunuzu deneyeceğim ve diğer önerilerinizi de göreceğim!
Bertrand R

1
R uygulamasını deneyin. Çalıştırmak bir astardır. Verileri okumak son derece kolaydır ve hızlı ve hafızayı verimli kılan yeni bir paralell paralell uygulaması vardır: Öte yandan r-bloggers.com/… . Sınıfların dengesiz mi? Uygulamada, her ağacı dengeli bir önyükleme örneğinden sampsize = c (x, x) olarak büyütebilirsiniz. Bu benim için daha iyi ikili sınıflandırmalar üretti. OOB konfüzyon matrisi R çıkışlarını kullanarak boyutları kolayca oynayabilir ve sınıflandırmayı çok kolay ayarlayabilirsiniz.
JEquihua

2
R'nin randomForest uygulaması, maksimum 32 seviyeli faktörlere izin verir. scikit-learn daha az kısıtlayıcıdır, önce kukla değişkenler oluşturmanızı sağlar ( pandas.get_dummiesfonksiyona bakın ). H2O'nun rastgele orman uygulamaları benim için gerçekten iyi bir performans gösterdi (bkz. 0xdata.com/docs/master/model/rf ).
Alex Woolford

1
rasgele ormanın daha yeni ve daha hızlı bir uygulaması var, pakete ranger deniyor. Gerçekten harika şeyler. Büyüklük emirleri daha hızlı ve 32 seviye limitine sahip değil.
marbel

6

Kategorilerinizi değiştirmek yerine neden her biri için tek bir sayısal değişken kullanmıyorsunuz? Rastgele ormanlar bağlamında, bunu yapmanın sonucunu sık sık merak ediyorum (çünkü çoğu zaman mantıklı gelmeyen kategorik veriye sıradanlık getirmenin şüpheli olduğu konusunda hemfikir olduğumu kabul ediyorum) (en azından) kullandığım RF'lerin scikit-learn uygulaması ile, genellikle sonuçlarda bir fark yaratmadığını gözlemledim (neden olsa da emin değilim).


1
Bu, özelliği, yerel olarak kategorik olarak düşünerek yaptığınız gibi aynı bölmeleri oluşturabileceğiniz için n <= 3 olan kategorik özellikler için iyidir. Daha büyük n için, kategorik bölünmeye eşdeğer olan bölme kümeleri elde etmek mümkündür, ancak algoritma onları verimli olarak bulabilir veya bulamayabilir ... ancak özelliği n sayısal özelliklere bölerseniz, verimi de düşürürsünüz. algoritma bölmeleri bulabilir. Birisinin, scikit-learn uygulamasına, aksi takdirde harika olduğu için kategorik değişken desteği eklemesi gerekir.
Ryan Bressler

Kategorik verilerde sıradanlık yaratmanın şüpheli olduğunu söylerken seninle aynı fikirdeyim ... Bunu yapmak zorunda kalmamayı tercih ederim, ama en azından bir deneyip ne olacağını görebiliyorum!
Bertrand R

4
Sklearn posta listesinde bu soru hakkında uzun bir tartışma yaptım (burada bölümlerini okuyabilirsiniz: mail-archive.com/scikit-learn-general@lists.sourceforge.net/… ). Uygulayıcılardan birinin düşüncesi, yeterince derin ağaçları olan sıralı kodlanmış kategorik özelliklerin makul derecede iyi çalışabileceği (hesaplamalı olarak daha verimli olmanın yanı sıra) olduğu yönündedir. Her neyse, eğer denersen, sonuçlarına / sonucuna duymak isterim, çünkü bu uğraştığım bir konu.
cjauvin

1
Bu yüzden kategorik olanlar için tek bir sayısal değişken tutmaya çalıştım ve aslında şaşırtıcı derecede iyi çalışıyor ve çok sayıda ikili giriş eklemekten çok daha iyi ... Değerleri hedeflerine göre ortalamalarına göre sıralamaya çalıştım. . Ve çok iyi çalışıyor
Bertrand R

Aslında şaşırmıyorum ... birkaç farklı ortamda gözlemlediklerime uygun, her ne kadar aşırı oy sayısına bakılırsa, bu oldukça zekice bir fikir.
cjauvin

5

Bence daha değişken değişken bir azaltma tekniği (ler) düşünmelisiniz . Bu kadar etkili olmayan tahmincilerden kurtulur.

Veri ön işleme hakkında çok şey okudum ve değişkenlerinizin değerini azaltmak için harika bir çözüm.

Önerilerim aşağıdaki gibidir:

  • için nitel değişkenler , kategori "eksik" ile eksik değerleri değiştirin. Veriler rastgele bir şekilde eksik değilse, önyargıya yol açabilir, ancak en azından tüm gözlemlerinizi eksiksiz yapacaksınız ve eksiklik farklı bir davranış gösterebilir.
  • sıfır varyans tahminlerini veya sıfıra yakın varyans tahminlerini ortadan kaldırın (Y'nizi verimli bir şekilde ayırabilecek dengesiz kategorileri olan kukla değişkenleri ortadan kaldırmamaya dikkat edin. Önemli olabileceğini düşündüğünüz değişkenler için bazı grafikler hazırlayın). R'de, 'nzv'işlevi 'caret'paketten kullanabilirsiniz. Bu, veri boyutunuzu oldukça azaltacaktır.
  • korelasyonlu tahmin edicileri ortadan kaldırmak . Kendall'ın korelasyon matrisini kullanın , çünkü kategorik değişkenlerin varlığında yapılanmaya daha uygundur. Dezavantajı ise, tüm nominal değerlerinizi kategorik değerlere dönüştürmeniz gerektiğidir.
  • orada özellik seçimi yöntemleri daha (- sen ... vs her kümenin tek temsilcisi LASSO regresyon, seçim kümeleme) onların sayısını azaltacaktır. Onları test etme şansım olmadı, çünkü diğer adımlar değişkenlerimi 100'ün altına düşürdü.

Ayrıca, RF yerine AdaBoost algoritmasını kullanmanızı öneririm . Şahsen, yaptığım araştırmalar bana bu iki yöntem için de benzer Gini katsayıları verdi. AdaBoost'un iyi yanı, R'de eksik gözlemleri yapmasıdır. Böylece bu listenin 1. adımını atlayabilirsiniz.

Umarım biraz yardımcı olmuştur. İyi şanslar


4

Karışık efekt modellerini düşünebilirsiniz. Yüksek kardinalite kategorik verilerindeki performansları nedeniyle sosyal bilimlerde popülerdirler ve bunları gradyanlı ağaçlar, rastgele ormanlar ve elastik-net düzenli lojistik regresyon gibi popüler makine öğrenme yaklaşımlarından daha iyi performans gösteren daha iyi tahmin modelleri yapmak için kullandım. En iyi bilinen uygulama, R'nin l4 paketidir; Sınıflandırma için kullanacağınız fonksiyon, karışık etkiler lojistik regresyonu uygulayan glmer'dir. Veri kümenize ölçeklendirme ile ilgili sorunlarınız olabilir, ancak çok fazla zorluk çekmeden 15 özelliği olan 80k satır yaptım.


2
  1. "Her bir kategorik için kukla değişken oluştur" derken , Python'u R değil mi kullanıyorsunuz? R randomforest yerel olarak kategorileri yönetebilir, ayrıca sonuçta bellek azalması da olabilir. R'yi dene.

  2. Daha sonra, büyük bir acı gibi görünen kategorik seviyeleri manuel olarak budamak / birleştirmek zorunda değilsiniz. Yapsanız bile, en kalabalık kategorilerin en öngörücü olduğu garanti edilmez. Parametre nodesize ile randomforest karmaşıklığını kontrol edin : büyük bir nodesize ile başlayın ve kademeli olarak azaltın (bu, hiperparametre aramasıdır ).

  3. Değişken seçim faydalı olacaktır. @lorelai iyi tavsiyeler veriyor. İşe yaramaz (düşük önemde veya yüksek oranda ilişkilendirilmiş) özellikleri ortadan kaldırmaya çalışın. Ağaç yapımı, özelliklerin sayısına göre ikinci derecedendir, bu yüzden üçte birini bile ortadan kaldırırsanız, temettü ödeyecektir.


0

Sen bakmak gerekir H2O.ai paketinin. Herhangi bir kodlama yapmak zorunda kalmadan kategorik değişkenleri kutudan işler (değişkenlerin faktör olduğundan emin olun).

Gradient Boostted Machine (GBM) uygulamalarını özellikle seviyorum, çünkü modeli oluşturduktan sonra değişken önemine bakabilirsiniz. GBM'ler ayrıca aşırı donmaya karşı dirençli olma özelliğine sahiptir.

Diğer modelleri keşfetmek istiyorsanız, GLM, Random Forest, Naive Bayes, Deep Learning, vb.

Bakınız: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html

Ayrıca kurulumu kolay (Windows, Linux, Mac) ve R, Python, Java ve Scala kullanarak API'lerle çalıştırılması kolaydır.

İşleri hızlandırmak için birden fazla çekirdek kullanabilir.

Yakın gelecekte GPU'ları destekleyecekler.

Aynı zamanda açık kaynak kodlu ve ücretsizdir (Enterprise desteği var).

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.