Panorama Sociodemográfico de México 2020: GUANAJUATO
Ramdom forest
1. RANDOM FOREST
ESP. GUSTAVO DEJEAN
Universidad Nacional del Oeste - Universidad de Buenos Aires
versión actual: Febrero 2019
versión anterior: En la presentación de : ‘Red para la Investigación e
Innovación Tecnológica en Reconocimiento de Patrones’ (UNLAM) -
noviembre 2017
2. objetivos
● entender los principios básicos del Random Forest (RF)
● ejecutar un RF e interpretar los resultados (MC y OOB)
● comprender las dos formas de ejecución: secuencial y concurrente
● mejorar un modelo básico mediante nuevos experimentos
3. CONTENIDO
● Visión general
● Descripción de los datos
● Algoritmo RF
● Programación Concurrente aplicado al Algoritmo Random Forest
● interpretación de los resultados (mc y OOB)
● Ventajas y desventajas del RF
● Bibliografia - URL
4. Fuente: Minería de datos: técnicas y herramientas
Escrito por César Pérez López
Una visión general
5. Descripción del conjunto de datos
50 personas (o clases)
10 muestras por persona para cada trazo manuscrito
6 archivos, uno por cada trazo (S2, S3, S4 , S5, S6, S8)
6. Random Forest
• El algoritmo fue desarrollado por Leo Breiman y Adele Cutler (2001)
• Random forest es una combinación de árboles predictores
• Es una técnica de agregación que mejora la precisión en la clasificación
mediante la incorporación de aleatoriedad en la construcción de cada
clasificador individual.
7. Implementaciones libres
R, Weka y Python tienen packages robustos para implementar Random
Forest
FastRandomForest es una implementación eficiente del clasificador
Random Forests para el ambiente Weka
8. Package ‘randomForest’
October 7, 2015
Title Breiman and Cutler's Random Forests for Classification and Regression
Version 4.6-12
Date 2015-10-06
Depends R (>= 2.5.0), stats
Suggests RColorBrewer, MASS
Author Fortran original by Leo Breiman and Adele Cutler, R port by
Andy Liaw and Matthew Wiener.
Description Classification and regression based on a forest of trees using random inputs.
Maintainer Andy Liaw License GPL (>= 2)
URL https://www.stat.berkeley.edu/~breiman/RandomForests/
NeedsCompilation yes
Repository CRAN
Date/Publication 2015-10-07 08:38:34
10. Algoritmo Random Forest
input:
int mtree
int cvar
data_frame entrenamiento
donde:
● mtree: este número indica la cantidad de árboles a calcular.
● cvar: este número indica la cantidad de variables a tomar en forma
aleatoria en cada Nodo interno del árbol
● entrenamiento: es el conjunto de datos a entrenar
output: un modelo predictor
11. Algoritmo Random Forest
Lo vamos a definir con un ciclo y en cada ciclo un algoritmo recursivo:
• hacer mtree veces:
tomar en forma aleatoria cvar variables
dividir el nodo raíz en dos, según la variable que mejor divida los datos
paso recursivo: para cada nodo no hoja, volver a tomar cvar variables
aleatorias y repetir la división hasta que no se pueda extender más (el árbol
es sin poda)
• una vez terminado lo anterior, se realiza el ensamble de todos los árboles. Por
voto mayoritario, se asigna cada caso a una clase
Antes de iniciar: puede separar el conjunto de datos original en dos subconjuntos
aleatorios, uno de entrenamiento y otro de prueba.
12. #dos formas de ejecutar RF: secuencial y paralelo
# forma secuencial básica:
modelo.forest <- randomForest(tipo_isib ~ .
, data=entrenamiento[,-1] # datos para entrenar le saco el cuit
, ntree=200 # cantidad de árboles
, mtry=4 # cantidad de variables
, replace=T # muestras con reemplazo
, importance=F
, class = NULL
)
# Ver el error en el entrenamiento OOB:.
print(modelo.forest) # 25,23 err
# Importance of each predictor.
print(importance(modelo.forest,type = 2))
13. # randomForest en paralelo
#http://sehablanalytics.cl/2014/12/random-forests-consejos/
cores <- 4 #nro de núcleos a usar en modo paralelo
ntrees <- 500 #nro de arboles
nVars <- 9 # nro de variables; ver valores tipicos
registerDoParallel(cores = cores)
14. #forma paralela usando n nucleos del procesador
par <- function(unModelo, cantArboles, cantVars){
foreach(ntree.iter = rep(ceiling(cantArboles / cores), cores),
# divido la cantidad total de arboles que quiero generar por la cantidad de nucleos
.combine = combine, .packages = "randomForest") %dopar% {
#uno los bosques creados por cada nucleo
randomForest( clase ~ .
, data= unModelo # datos para entrenar le saco el cuit
, ntree= ntree.iter # cantidad de arboles
, mtry=cantVars # cantidad de variables
, replace=T # muestras con reemplazo
, importance=T
, class = NULL
)
}
}
15. # para determinar la cantidad de variables óptima a usar en nuestro caso real:
vAciertos <-c(0)
for(j in 1: 17){
modelo.forest <- par(entrenamiento, 500,j)
# Crea prediccion y Matriz de confusion:
prediccion <- predict(modelo.forest, test[,-1], type='class'); # Matriz de Confusion
mc <- with(test,table(prediccion, clase))
# calcular los aciertos totales:
d <- diag(mc)
sumDiag <- sum(d) # sumo la diagonal
acierto <- sumDiag/sum(mc) # calculo el % de aciertos
vAciertos[j] <- aciertos
print(j)
print(aciertos)
}
16. Out-of-Bag Error
Dada la naturaleza del proceso de bagging, resulta posible estimar de forma directa el test error sin necesidad de
recurrir a cross-validation o a un test set independiente. Sin entrar en demostraciones matemáticas, el hecho de
que los árboles se ajusten de forma repetida empleando muestras generadas por bootstrapping conlleva que, en
promedio, cada ajuste usa solo aproximadamente dos tercios de las observaciones originales. Al tercio restante se
le llama out-of-bag (OOB). Si para cada árbol ajustado en el proceso de bagging se registran las observaciones
empleadas, se puede predecir la respuesta de la observación ii haciendo uso de aquellos árboles en los que esa
observación ha sido excluida (OOB) y promediándolos (la moda en el caso de los árboles de clasificación).
Siguiendo este proceso, se pueden obtener las predicciones para las nn observaciones y con ellas calcular el
OOB-mean square error (para regresión) o el OOB-classification error (para árboles de clasificación). Como la
variable respuesta de cada observación se predice empleando únicamente los árboles en cuyo ajuste no participó
dicha observación, el OOB-error sirve como estimación del test-error. De hecho, si el número de árboles es
suficientemente alto, el OOB-error es prácticamente equivalente al leave-one-out cross-validation error. Esta es
una ventaja añadida de los métodos de bagging, ya que evita tener que recurrir al proceso de cross-
validation(computacionalmente costoso) para la optimización de los hiperparámetros.
Fuente: Joaquín Amat Rodrigo j.amatrodrigo@gmail.com; Febrero, 2017
17. Beneficios del RandomForest
• Precisión
• Funciona de manera eficiente con bases de datos de gran tamaño
• Maneja miles de variables de entrada sin necesidad de técnicas de borrado
• Da una estimación de qué variables son importantes en la clasificación
• Genera una estimación objetiva interna de la generalización de errores
• Fácil de implementar
• Muy apto para correrlo en paralelos
• Los “bosques” generados se pueden guardar para uso futuro en otros datos
Desventajas: El resultado no es interpretable
Tiene varios parámetros para un afinamiento final