R's randomForest 32'den fazla seviyeyi kaldıramaz. Geçici çözüm nedir?


22

R'nin randomForest paketi, 32'den fazla seviye ile faktörü kaldıramaz. 32'den fazla seviye verildiğinde bir hata mesajı verir:

32'den fazla kategoriye sahip kategorik öngörücüleri işleyemez.

Ancak sahip olduğum verilerin birkaç faktörü var. Bazılarında 1000+, bazılarında 100+ var. Hatta 52 olan birleşik devletlerin “devletine” sahiptir.

İşte benim sorum.

  1. Neden böyle bir sınırlama var? randomForest basit durum için bile çalışmayı reddeder.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    Eğer sadece hafıza sınırlaması nedeniyle, scikit, öğrenenin randomForeestRegressor'unu 32'den fazla seviye ile nasıl çalıştırabilir?

  2. Bu sorunu çözmenin en iyi yolu nedir? X1, X2, ..., X50 bağımsız değişkenlerine sahip olduğumu ve Y'nin bağımlı değişken olduğunu varsayalım. Ve X1, X2 ve X3'ün 32'den fazla seviyeye sahip olduğunu varsayalım. Ne yapmalıyım?

    Düşündüğüm şey, X1, X2 ve X3'ün her biri için, Y'de fark olarak tanımlandığı her biri için kümeleme algoritması çalıştırıyor. Üç sorunlu değişken olduğu için üç kümeleme yapacağım. Ve her kümelemede, benzer seviyeler bulabilsem diyorum. Ve onları birleştireceğim.

    Bu nasıl ses geliyor?


Paket adı ve hata mesajı ile internette arama yapmak bazı cevaplar sağlar.
Roland,

5
@Roland Aslında beni buraya yönlendirir…
isomorphismes

1
Veri bilimini deneyebilirsiniz, çünkü birkaç istatistiksel zihin, birçok boyutta veri için deneyim programlaması yapar.
aeroNotAuto

2
GÜNCELLEME: 4.6-9 sürümünden bu yana, randomForest53 seviyeye kadar kategorik öngörücüleri kullanabilir. Haberler
Ben

R'nin rastgele ormanları seviye sayısını nasıl belirler? Sanırım seviye kategorileri ifade ediyor.
ajp

Yanıtlar:


25

Bu aslında oldukça makul bir kısıtlama çünkü seviyeli bir faktöre göre ayrılma aslında 2 N - 2 olası kombinasyondan birinin seçimi . N gibi 25 bile olsa , kombinasyon alanı öyle büyüktür ki böyle bir çıkarım çok küçük anlam ifade eder.N-2N--2N-

N-

Diğer seçenek ise temsili değiştirmektir - belki de sonucunuz doğrudan devlet kuruluşuna bağlı değildir, örneğin, alan, nüfus, kişi başına düşen çam ağacı sayısı veya bunun yerine bilgi sisteminize bağlayabilirsiniz.

Ayrıca, her bir durumun kendisi için ayrı bir model gerektirecek şekilde izole edilmiş ve ilişkisiz bir varlık olduğu da olabilir.

Bir karara dayalı kümeleme, muhtemelen kötü bir fikirdir, çünkü bu yolla karardan bilgileri fazla sıkıntıya sokan özniteliklere gizlice sokuyorsunuz.


4
Biraz sıkıcı bir şekilde olsa da, kolayca hareket ettirilebilir. Örneğin, 33 ila 1024 seviyeniz varsa, her biri <= 32 seviyeli iki faktör oluşturun.
KalEl

15

Ana neden randomForest'in nasıl uygulandığıdır. R'nin uygulanması, orijinal Breiman'ın özelliklerinden çok şey izler. Burada dikkat edilmesi gereken önemli olan faktör / kategorik değişkenler için, bölme kriterlerinin solda bazı etiket değerleri ve sağda kalan etiket değerleri ile ikili olmasıdır.

01[0;2M-1]

Weka ve Python'un uygulamaları neden işe yarıyor?

Weka uygulaması varsayılan olarak CART ağaçlarını kullanmaz. Bu hesaplama problemine sahip olmayan C45 ağaçlarını kullanır, çünkü kategorik girdiler için her bir seviye değeri için bir tane olmak üzere birden fazla düğümde böler.

Python rasgele orman uygulaması, kategorik / faktör değişkenlerini kullanamaz. Bu değişkenleri yapay veya sayısal değişkenlere kodlamanız gerekir.

M


2
Çok teşekkürler! Yanıtınızı, R'nin kategorik değerleri tedavi etme konusundaki uygulamasının Python'unkinden daha üstün olduğunu (RF için kategorik değişkenlerin gruplandırılmasından bahseden Max Kuhn'un, bunları düşürmekten biraz daha iyi sonuçlar verdiğini hatırlıyorum) veya R’de en az çalışan Rastgele Ormanı’nın Python Farklı sonuçlar elde etmek için çok iyi bir şansım var (doğruluk vb.)? Deneyiminize göre, modelleme yaparken, her iki gruplama varyasyonunu (R cinsinden) denemek ve bunları düzene sokmak ve sonra iki yaklaşımı karşılaştırmak mantıklı mıdır?
Sergey Bushmanov

2
Sahte kodlama çalışır, ancak hepsine göre yalnızca bir kategori oluşturabilir. Kodlamadan sonra değişkenler bir defada bir kez test edilir. Yani, ikilemeyi uygulamak imkansızdır. Bu özellik yardımcı olabilir, pratikte büyük bir fark olmadığını düşünüyorum. Ancak değişken öneme sahip çalışırken dikkat gerektirebilecek başka şeyler vardır: bazı uygulamalar kategorilere yönelik olarak çok seviyeli önyargılıdır. Detaylar için Carolin Strobl makalelerine bakın: statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf . R'de bu önyargıya sahip olmayan bazı uygulamalar vardır.
rapaio

2

Bir sütunu farklı bir şekilde temsil etmeyi deneyebilirsiniz. Seyrek veri çerçevesiyle aynı verileri temsil edebilirsiniz.

Minimum geçerli kod;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

Orijinal sütundaki her bir değerin artık ayrı bir yapay sütun haline geldiğine dikkat edin.

Daha kapsamlı örnek kod;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

Bu kod parçası artık gerçekten bir hata almayacağınızı gösterse de, randomForest algoritmasının artık bitmeden çok uzun bir zamana ihtiyacı olduğunu fark edeceksiniz. Bunun nedeni bir CPU kısıtlamasıdır, şimdi de örnekleme yaparak bu görevi azaltma haritasını çıkarabilirsiniz.

Daha fazla bilgi için lütfen bu blog yayınına göz atın:

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/


İkinci kod bloğu kafa karıştırıcı görünüyor, Gövde boyunca df_hard kullanıyor olsanız da, son satırlarda "first" ve "second" değerini NULL değerine ve aynı zamanda randomForest için veri olarak "example" ifadesini kullanıyorsunuz. Bana, çünkü örnek ve df_hard arasında bağlantı olmadığından.
Özgür

Vincent, 100+ seviyesine sahipsem bu kadar büyük bir sorun yaşayacağımı düşünmüyorsun, her sütunu rastgele girdi olarak eklemeyi önerir misin?
Hardik Gupta,

Başka bir alternatif, h2o'daki rastgeleforest uygulamasını kullanmaktır; bunun büyük veri kümeleri için daha iyi desteği vardır. "Her sütunu rastgele girdi olarak ekle" biti anlamıyorum.
Vincent Warmerdam

0

Bunun yerine extraTrees paketini kullanabilirsiniz. Son derece randomize orman algoritması herhangi bir kesme / ayrılmayı denemez, ancak yalnızca sınırlı bir rasgele bölme alt kümesini dener.


1
extraTrees, girişinizin sayısal bir veri matrisi olması gerektiği anlamında bir sınırlamaya sahip mi?
Hardik Gupta,

0

Başka bir seçenek: Verilerinizdeki seviye sayısına ve gözlem sayısına bağlı olarak, bazı seviyeleri birleştirebilirsiniz. Sınırın altına inmenin ötesinde, sadece birkaç gözlemle birçok seviyeniz varsa varyansı azaltabilir. Hadley 's Forcats: fct_lump yapar.

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.