Ağırlıklı Rastgele Orman için R paketi? classwt seçeneği?


16

Son derece dengesiz bir veri kümesinin sonucunu tahmin etmek için Random Forest kullanmaya çalışıyorum (azınlık sınıf oranı sadece% 1 veya daha az). Geleneksel Rastgele Orman algoritması, azınlık sınıflarına özel önem vermek yerine genel hata oranını en aza indirdiğinden, dengesiz verilere doğrudan uygulanamaz. Bu yüzden azınlık sınıfının yanlış sınıflandırılmasına yüksek bir maliyet atamak istiyorum (maliyete duyarlı öğrenme).

Bence seçeneğini kullanabileceği çeşitli kaynaklardan okumak classwtait randomForestR, ancak bu nasıl kullanılacağını bilmiyorum. Ve randomForestişlev için başka alternatiflerimiz var mı?

Yanıtlar:


29

Bu iş parçacığı diğer iki iş parçacığına ve bu konuyla ilgili güzel bir makaleye değinmektedir. Sınıflandırma ve altörnekleme de aynı derecede iyi görünüyor. Aşağıda açıklandığı gibi altörnekleme kullanıyorum.

Sadece% 1'inin nadir sınıfı karakterize edeceği için eğitim setinin büyük olması gerektiğini unutmayın. Bu sınıfın 25 ~ 50'den az örneği muhtemelen sorunlu olacaktır. Sınıfı karakterize eden az sayıda örnek kaçınılmaz olarak öğrenilen örüntüyü kaba ve daha az tekrarlanabilir hale getirecektir.

RF, çoğunluk oylamasını varsayılan olarak kullanır. Eğitim setinin sınıf prevalansları, bir tür etkili olarak çalışacaktır. Bu nedenle, nadir sınıf tamamen ayrılamazsa, bu nadir sınıfın tahmin yaparken çoğunluk oyu kazanması pek olası değildir. Çoğunluk oyuyla toplanmak yerine oy kesirlerini toplayabilirsiniz.

Tabakalı örnekleme nadir sınıfın etkisini arttırmak için kullanılabilir. Bu, diğer sınıfların altörneklenmesinin maliyeti üzerine yapılır. Yetiştirilen ağaçlar daha az derinleşecek ve daha az numunenin bölünmesi gerektiği için öğrenilen potansiyel modelin karmaşıklığını sınırlandırmaktadır. Yetiştirilen ağaç sayısı, örneğin gözlemlerin çoğunun birkaç ağaca katılacağı şekilde, örneğin 4000 kadar büyük olmalıdır.

Aşağıdaki örnekte, sırasıyla% 1,% 49 ve% 50 yaygınlığa sahip 3 sınıflı 5000 numuneden oluşan bir eğitim veri seti simüle ettim. Böylece, 0. sınıftan 50 numune olacaktır. İlk şekilde, x1 ve x2 değişkenlerinin fonksiyonu olarak ayarlanmış gerçek eğitim sınıfı gösterilmektedir. Bu resim öğrenilecek simüle edilmiş deseni gösterir

Dört model eğitildi: Varsayılan bir model ve 1:10:10 1: 2: 2 ve 1: 1: 1 sınıf tabakalaması olan üç katmanlı model. Esas olarak, her ağaçtaki torba içi örnek sayısı (yeniden çizim dahil) 5000, 1050, 250 ve 150 olacaktır. Çoğunluk oyu kullanmadığından, mükemmel dengeli bir tabakalaşma yapmam gerekmiyor. Bunun yerine, nadir sınıflardaki oylar 10 kez veya başka bir karar kuralıyla ağırlıklandırılabilir. Yanlış negatif ve yanlış pozitif maliyetleriniz bu kuralı etkilemelidir.

Bir sonraki şekil, tabakalaşmanın oy oranlarını nasıl etkilediğini göstermektedir. Tabakalı sınıf oranlarının daima tahminlerin merkezidir olduğuna dikkat edin. tabakalaşma ve oylama

Son olarak, özgüllük ve hassasiyet arasında iyi bir denge sağlayan bir oylama kuralı bulmak için ROC eğrisini kullanabilirsiniz. Siyah çizgi tabakalaşma değil, kırmızı 1: 5: 5, yeşil 1: 2: 2 ve mavi 1: 1: 1. Bu veri seti için 1: 2: 2 veya 1: 1: 1 en iyi seçim gibi görünüyor. roc eğrisi

Bu arada, oy kesirleri burada çantadan çıkmış durumda.

Ve kod:

library(plotrix)
library(randomForest)
library(AUC)

make.data = function(obs=5000,vars=6,noise.factor = .2,smallGroupFraction=.01) {
X = data.frame(replicate(vars,rnorm(obs)))
yValue = with(X,sin(X1*pi)+sin(X2*pi*2)+rnorm(obs)*noise.factor)
yQuantile = quantile(yValue,c(smallGroupFraction,.5))
yClass = apply(sapply(yQuantile,function(x) x<yValue),1,sum)
yClass = factor(yClass)
print(table(yClass)) #five classes, first class has 1% prevalence only
Data=data.frame(X=X,y=yClass)
}

plot.separation = function(rf,...) {
triax.plot(rf$votes,...,col.symbols = c("#FF0000FF",
                                       "#00FF0010",
                                       "#0000FF10")[as.numeric(rf$y)])
}

#make data set where class "0"(red circles) are rare observations
#Class 0 is somewhat separateble from class "1" and fully separateble from class "2"
Data = make.data()
par(mfrow=c(1,1))
plot(Data[,1:2],main="separation problem: identify rare red circles",
     col = c("#FF0000FF","#00FF0020","#0000FF20")[as.numeric(Data$y)])

#train default RF and with 10x 30x and 100x upsumpling by stratification
rf1 = randomForest(y~.,Data,ntree=500, sampsize=5000)
rf2 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,500,500),strata=Data$y)
rf3 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,100,100),strata=Data$y)
rf4 = randomForest(y~.,Data,ntree=4000,sampsize=c(50,50,50)  ,strata=Data$y)

#plot out-of-bag pluralistic predictions(vote fractions).
par(mfrow=c(2,2),mar=c(4,4,3,3))
plot.separation(rf1,main="no stratification")
plot.separation(rf2,main="1:10:10")
plot.separation(rf3,main="1:5:5")
plot.separation(rf4,main="1:1:1")

par(mfrow=c(1,1))
plot(roc(rf1$votes[,1],factor(1 * (rf1$y==0))),main="ROC curves for four models predicting class 0")
plot(roc(rf2$votes[,1],factor(1 * (rf1$y==0))),col=2,add=T)
plot(roc(rf3$votes[,1],factor(1 * (rf1$y==0))),col=3,add=T)
plot(roc(rf4$votes[,1],factor(1 * (rf1$y==0))),col=4,add=T)

oups bir şekil başlığı 1: 2: 2 yerine 1: 5: 5 diyor
Soren Havelund Welling 21:15

günlük işimde kesinlikle çok yardımcı olacak detaylı cevabınız için çok teşekkür ederim. Anlamadığım bir cümle var: "Her ağaçtaki inbag örneklerinin sayısı (yeniden çizim dahil) 5000.1050, 250 ve 150 olacak". Lütfen bana sayıların nereden geldiğini açıklar mısınız?
Metariat

1
benim zevkim;) bu örnekte nadir sınıfın 50 üyesi vardı. 1:10:10 tabakalandırılıyorsa örneklem = c (50.500.500) belirtmemiz gerekir. 50 + 500 + 500 = 1050. 1050 numuneden oluşan tam bir ağaçta toplam 1050x2 düğüm bulunur.
Soren Havelund Welling

Sorum şu salaksa özür dilerim, ama 1:10:10, 1: 2: 2 ve 1: 1: 1 tabakalaşmanın anlamı nedir? "Nadir derslerde oyların ağırlığı 10 kat olabilir" dediğinde. Kodun hangi kısmı bunu temsil ediyor? 1:10:10 mu? Çok teşekkür ederim!
Metariat

1
1:10:10 sınıflar arasýndaki oranlar. Simüle edilen veri seti 1:49:50 oranlarına sahip olacak şekilde tasarlanmıştır. Bu oranlar, iki büyük sınıfı aşağı örnekleyerek değiştirildi. Örneğin sampsize = c (50,500,500) ile c (1,10,10) * 50 ile aynı seçerek ağaçlardaki sınıf oranlarını değiştirmiş olursunuz. 50, nadir sınıfın örnek sayısıdır. Ayrıca keep.inbag = TRUE değerini ayarladıysanız ve rf $ inbag'i incelerseniz, nadir sınıf örneklerinin ~ 2/3 ağaçta torbada olduğunu göreceksiniz, oysa nadir olmayan her sınıf örneği aşağı örnekleme nedeniyle çok az ağaçta yer almaktadır.
Soren Havelund Welling
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.