Este hilo remite a otros dos hilos y a un buen artículo sobre este asunto. Parece que la ponderación de clases y el muestreo descendente son igualmente buenos. Yo utilizo downsampling como se describe a continuación.
Recuerde que el conjunto de entrenamiento debe ser grande, ya que sólo el 1% caracterizará la clase rara. Menos de 25~50 muestras de esta clase serán probablemente problemáticas. Unas pocas muestras que caractericen la clase harán que el patrón aprendido sea inevitablemente tosco y menos reproducible.
RF utiliza el voto por mayoría por defecto. Las prevalencias de clase del conjunto de entrenamiento funcionarán como una especie de prior efectivo. Así, a menos que la clase rara sea perfectamente separable, es poco probable que esta clase rara obtenga una mayoría de votos al predecir. En lugar de agregar por mayoría de votos, puede agregar fracciones de votos.
El muestreo estratificado puede utilizarse para aumentar la influencia de la clase rara. Esto se hace a costa de reducir el muestreo de las demás clases. Los árboles cultivados serán menos profundos, ya que habrá que dividir muchas menos muestras, lo que limitará la complejidad del patrón potencial aprendido. El número de árboles cultivados debe ser grande, por ejemplo 4000, de forma que la mayoría de las observaciones participen en varios árboles.
En el ejemplo siguiente, he simulado un conjunto de datos de entrenamiento de 5000 muestras con 3 clases con prevalencias del 1%, 49% y 50% respectivamente. Por tanto, habrá 50 muestras de clase 0. La primera figura muestra la clase real del conjunto de entrenamiento en función de dos variables x1 y x2.
Se entrenaron cuatro modelos: Un modelo por defecto y tres modelos estratificados con estratificación de clases 1:10:10 1:2:2 y 1:1:1. Principal mientras que el número de muestras inbag(incl. redibujos) en cada árbol será 5000, 1050, 250 y 150. Como no utilizo la votación por mayoría no necesito hacer una estratificación perfectamente equilibrada. En su lugar, los votos de las clases raras podrían ponderarse 10 veces o alguna otra regla de decisión. Usted
T
L
B
A
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)