19 votos

Paquete R para bosques aleatorios ponderados? ¿opción classwt?

Estoy intentando utilizar Random Forest para predecir el resultado de un conjunto de datos extremadamente desequilibrado (la tasa de clases minoritarias es de sólo un 1% o incluso menos). Dado que el algoritmo tradicional Random Forest minimiza la tasa de error global, en lugar de prestar especial atención a las clases minoritarias, no es directamente aplicable a datos desequilibrados. Así que quiero asignar un coste elevado a la clasificación errónea de la clase minoritaria (aprendizaje sensible al coste).

He leído en varias fuentes que podemos utilizar la opción classwt de randomForest en R, pero no sé cómo usarlo. ¿Y tenemos alguna otra alternativa a la randomForest ¿función?

34voto

Mirko Friedenhagen Puntos 304

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. This picture shows the simulated pattern to learn

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 stratification and voting

L roc curve

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)

0 votos

O

0 votos

T

1 votos

M

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X