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.
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.
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.
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)