Bosques Aleatorios Para Principiantes

Oleksii Kharkovyna
May 14, 2020

Contents Outline

Bosques Aleatorios Para Principiantes

May 14, 2020 13 minutes read



Random Forests (Bosques aleatorios) es uno de mis algoritmos favoritos de minería de datos. Inventado por Leo Breiman y Adele Cutler en el siglo pasado, ha conservado su autenticidad hasta hoy, no se le han añadido cambios desde su invención.

Sin exagerar, es uno de los pocos algoritmos universales. Los bosques aleatorios permiten resolver tanto los problemas de regresión como de clasificación. Es bueno para la búsqueda de anomalías y la selección de predictores. Además, es técnicamente difícil aplicar incorrectamente este algoritmo. Es sorprendentemente simple en su esencia. A diferencia de otros algoritmos, tiene pocos parámetros configurables. Y al mismo tiempo, es sorprendentemente preciso.

Vaya, ¡tantas ventajas de usar los bosques al azar! Parece un milagro para los ingenieros de aprendizaje automático ;) Así que, si aún no sabes cómo funciona, es el momento adecuado para arreglar esta situación. Esta es una aventura de aprendizaje para principiantes, donde vemos las cosas en términos de ramas, hojas y bosques aleatorios, por supuesto.

Sin más preámbulos, ¡comencemos!

Árboles de decisión en una cáscara de nuez


Empecemos con los árboles de decisión, porque lógicamente, no hay bosque sin árboles.

Los Árboles de Decisión son algoritmos de aprendizaje supervisado no paramétrico que construyen modelos de clasificación o regresión con la forma de una estructura de árbol. Descompone un conjunto de datos en subconjuntos cada vez más pequeños, mientras que al mismo tiempo se desarrolla gradualmente un árbol de decisión asociado.

Un bosque aleatorio es en realidad sólo un montón de árboles de decisión. El objetivo es crear un modelo que prediga el valor de una variable objetivo mediante el aprendizaje de reglas de decisión simples inferidas a partir de las características de los datos.

Un árbol de decisión es una estructura similar a un diagrama de flujo en la que cada nodo interno representa una "prueba" a un atributo (por ejemplo, si al tirar una moneda sale cara o cruz), cada rama representa el resultado de la prueba y cada nodo de hoja representa una etiqueta de clase (decisión tomada después de computar todos los atributos). Los caminos desde la raíz hasta la hoja representan las reglas de clasificación.

Un árbol de decisión consta de tres tipos de nodos:
  • Nodos de decisión - normalmente representados por cuadrados
  • Nodos de azar - típicamente representados por círculos
  • Nodos finales - típicamente representados por triángulos
Así que, en conjunto, el árbol aprendido también puede representarse como una regla anidada if else para mejorar la legibilidad humana. Los árboles tienen un alto riesgo de sobre ajustar los datos de formación, así como de volverse complejos desde el punto de vista computacional si no se limitan y regularizan adecuadamente durante la etapa de crecimiento. Este sobreajuste implica un bajo sesgo y una alta varianza en el modelo. Por lo tanto, para hacer frente a este problema, utilizamos el aprendizaje en conjunto, un enfoque que nos permite corregir este hábito de sobreaprendizaje y esperamos, llegar a mejores y más fuertes resultados.

¿Qué es el método de aprendizaje en conjunto?
El método de aprendizaje por conjuntos se basa en algoritmos de entrenamiento que forman muchos clasificadores y luego segmentan nuevos puntos de datos, a partir de la votación o el promedio. El método original de conjunto no es más que un promedio bayesiano, pero los algoritmos posteriores incluyen la corrección de errores de codificación de salida, la agregación y el boosting. El boosting tiene como objetivo convertir los modelos débiles en fuertes construyendo un conjunto de clasificadores. La agregación también agrega clasificadores avanzados, pero utiliza el entrenamiento paralelo de los clasificadores básicos. En el lenguaje de la lógica matemática, la agregación es una unión mejorada, y el boosting es una intersección mejorada.

En nuestro caso, un Bosque Aleatorio (aprendiz fuerte) se construye como un conjunto de Árboles de Decisión (aprendices débiles) para realizar diferentes tareas como la regresión y la clasificación.


¿Cuál es la idea del Bosque aleatorio?
La idea es simple: digamos que tenemos un algoritmo muy débil, digamos, un árbol de decisión. Si hacemos muchos modelos diferentes usando este algoritmo débil  y promediamos el resultado de sus predicciones, entonces el resultado final será mucho mejor. Este es el llamado aprendizaje en conjunto en acción.

Bueno, aquí hay una razón por la que el bosque aleatorio se llama así, porque crea muchos árboles de decisión para los datos y luego promedia el resultado de sus predicciones. Un gran número de árboles de decisión son los parámetros del método, cada uno de los cuales se construye de acuerdo con una muestra obtenida de la formación original seleccionada usando bootstrap (muestra con retorno).
Un punto importante aquí es el elemento de aleatoriedad en la creación de cada árbol. Después de todo, está claro que si creamos muchos árboles idénticos, el resultado de su promediación tendrá la precisión de un árbol.

Una explicación simple

Un bosque aleatorio es una colección de árboles de decisión aleatoria (el número de n_estimadores en sklearn). Tienes que entender cómo crear un árbol de decisión aleatoria.

En términos generales, para construir un árbol de decisión aleatoria se empieza con un subconjunto de tus muestras de entrenamiento. En cada nodo, se dibuja arbitrariamente un subconjunto de funciones (el número está determinado por max_funciones en sklearn). Para cada una de estas funciones, probará diferentes valores umbral y verá cómo separan sus muestras según un criterio determinado (normalmente entropía o gini, criterio en sklearn). 

A continuación, guardará la función y su umbral, que son la mejor manera de separar sus datos y escribirlos en un nodo. Cuando termina la construcción del árbol (esto puede ser por varias razones: se alcanza la profundidad máxima (max_depth en sklearn), se alcanza el mínimo número de muestras (min_samples_leaf en sklearn), etc.), se miran las muestras en cada hoja y se guarda la frecuencia de las marcas. Como resultado, parece que el árbol le da una sección de sus muestras de entrenamiento de acuerdo con las funciones significativas.


Dado que cada nodo se construye a partir de funciones aleatorias, entendemos que cada árbol construido de esta manera será diferente. Esto contribuye a un buen compromiso entre el desplazamiento y la dispersión.

Luego, en el modo de prueba, la muestra de prueba pasará a través de cada árbol, dándole etiquetas para cada árbol. La etiqueta más representada suele ser el resultado final de la clasificación.

¿Cómo funciona?
Supongamos que tenemos algunos datos de entrada. Cada columna corresponde a un determinado parámetro, cada fila corresponde a un determinado elemento de datos.
Podemos seleccionar al azar de todo el conjunto de datos un cierto número de columnas y filas y construir un árbol de decisión a partir de ellas.
Luego podemos repetir este proceso muchas veces y obtener un montón de árboles diferentes. El proceso del algoritmo de construcción de árboles es muy rápido. Y por lo tanto, no será difícil para nosotros hacer tantos árboles como necesitemos. Al mismo tiempo, todos estos árboles son, en cierto sentido, aleatorios, porque elegimos un subconjunto aleatorio de datos para crear cada uno de ellos.

El número de árboles creados es a menudo un factor importante. Este número puede influir en el nivel de error de clasificación alcanzado. Además, con clases muy desequilibradas (por ejemplo, un lote de 0 y sólo una pequeña cantidad de 1), es importante realizar un muestreo estratificado para igualar los niveles de error de clasificación en cada una de estas clases.
En la versión original del algoritmo, se selecciona un subconjunto aleatorio en cada paso de la construcción del árbol. Pero esto no cambia la esencia y los resultados son comparables.

Este algoritmo es sorprendentemente simple, el paso más difícil de su implementación es la construcción del árbol de decisión. Y a pesar de su simplicidad, da muy buenos resultados en tareas reales. Desde un punto de vista práctico, tiene una gran ventaja: casi no requiere configuración. Si tomamos cualquier otro algoritmo de aprendizaje automático, ya sea una regresión o una red neuronal, todos tienen un montón de parámetros y hay que saber qué algoritmos son mejores para aplicar a una tarea específica.

El algoritmo de bosques aleatorio tiene esencialmente un solo parámetro: el tamaño del subconjunto aleatorio seleccionado en cada paso de la construcción del árbol. Este parámetro es importante, pero incluso los valores predeterminados proporcionan resultados muy aceptables.

Bosques aleatorios vs. árboles de decisión
Tanto el bosque aleatorio como los árboles de decisión son un tipo de algoritmo de clasificación, que son supervisados en su naturaleza.

Un árbol de decisión es una representación gráfica de todas las posibles soluciones a una decisión basada en ciertas condiciones. Se llama árbol de decisión porque comienza con una única caja (o raíz), que luego se ramifica en varias soluciones, igual que un árbol.

Los bosques aleatorios implican la construcción de varios árboles de decisión basados en muestrear parámetros y luego realizar predicciones basadas en la mayor puntuación entre los árboles para los problemas de clasificación o el promedio para los problemas de regresión. Esto resuelve el problema de la sobrecarga de los árboles de decisión.

Cuando se trabaja con el bosque, al construir cada árbol en las etapas de división de los vértices, sólo se utiliza un número fijo de parámetros seleccionados al azar del conjunto de entrenamiento (el segundo parámetro del método) y se construye un árbol completo (sin truncamiento). En otras palabras, cada hoja del árbol contiene observaciones de una sola clase.
Algoritmo de bosques aleatorios con Python y Scikit-Learn

La biblioteca Scikit Learn, tiene la siguiente implementación de árboles aleatorios (abajo sólo para la tarea de clasificación):

class sklearn.ensemble.RandomForestClassifier(n_estimators=10,
criterion=’gini’, max_depth=None, min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=’auto’, max_leaf_nodes=None, min_impurity_split=1e-07,
bootstrap=True, oob_score=False, n_jobs=1,
random_state=None, verbose=0, warm_start=False,
class_weight=None)

Trabajan con el algoritmo según el esquema estándar adoptado en scikit-learn:

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import roc_auc_score
# then — (X, y) -training, (X2, y2) — verification
# model — here (for contrast) consider the regressor
model = RandomForestRegressor(n_estimators=10 ,
oob_score=True,
random_state=1)
model.fit(X, y) # training
a = model.predict(X2) # prediction
print (“AUC-ROC (oob) = “, roc_auc_score(y, model.oob_prediction_))
print (“AUC-ROC (test) = “, roc_auc_score(y2, a))

Echemos un vistazo a lo que significan los principales parámetros:

N_estimadores - Número de árboles

Cuantos más árboles, mejor calidad, pero la sintonización y el tiempo de árbol aleatorio también aumentan proporcionalmente. Tengan en cuenta que a menudo con un aumento de n_estimadores, la calidad de la muestra de entrenamiento aumenta (puede incluso llegar al 100%), y la calidad de la prueba alcanza la asíntota (puedes estimar cuántos árboles son suficientes para ti).

Max_features - El número de características a seleccionar para la división

A medida que max_features aumenta, el tiempo de construcción del bosque aumenta, y los árboles se vuelven "más uniformes". Por defecto, es sqrt (n) en problemas de clasificación y n / 3 en problemas de regresión. Este es el parámetro más importante! Se establece en primer lugar (con un número suficiente de árboles en el bosque).

Min_samples_split - El número mínimo de objetos en los que se realiza la división

Este parámetro, por regla general, no es muy importante - puedes dejar el valor por defecto. 

El gráfico de calidad en el control puede ser similar a un "peine" (no hay un óptimo claro). A medida que el parámetro aumenta, la calidad del entrenamiento disminuye y el tiempo de construcción del árbol aleatorio disminuye.

Min_samples_leaf - Límite en el número de objetos en las hojas

Todo lo que se ha descrito min_samples_split también es adecuado para describir este parámetro. A menudo se puede dejar el valor por defecto. Por cierto, normalmente se recomienda usar el valor 5 en las tareas de regresión (esto se implementa en la biblioteca randomForest para R, y 1 en sklearn).

Max_depth - Profundidad Máxima del árbol

Está claro que a menor profundidad, más rápido se construye y funciona un bosque aleatorio. Con el aumento de la profundidad, la calidad del entrenamiento aumenta bruscamente, pero también en el control, por regla general, aumenta. Se recomienda utilizar la máxima profundidad (excepto en los casos en que haya demasiados objetos y se obtengan árboles muy profundos, cuya construcción lleva un tiempo considerable).

Cuando se utilizan árboles poco profundos, el cambio de los parámetros asociados a la limitación del número de objetos en la hoja y a la división no produce un efecto significativo (las hojas son "grandes" de todos modos). Se recomienda el uso de árboles de poca profundidad en problemas con un gran número de objetos ruiodosos (emisiones).

Criterio - Criterio de división
En términos de significado, este es un parámetro muy importante, pero de hecho, no hay opciones aquí. En la biblioteca de Sklearn se implementan dos criterios para la regresión: "mse" y "mae", que corresponden a las funciones de error que minimizan. La mayoría de las tareas requieren el uso de mse. Para la clasificación, se implementan los criterios "gini" y "entropía", que corresponden a los criterios de división clásicos. Una simple búsqueda le ayudará a elegir qué utilizar en una determinada tarea.

No existe un parámetro de tamaño de muestra en la aplicación de mse de un bosque aleatorio, que regula cuántos objetos deben seleccionarse para construir cada árbol. Existe tal parámetro en la implementación en R, pero, de hecho, a menudo es óptimo elegir entre toda la muestra. También se recomienda seleccionar una submuestra con un retorno: bootstrap = True (esto es agregar - bootstrap agreggating).

Empaquetando todo
Así que, el bosque aleatorio es un algoritmo muy fácil de usar. Tiene muchas ventajas, y aquí están los puntos más importantes para mí:
  • Los bosques aleatorios garantizan la protección contra el sobreajuste.
  • La construcción de bosques aleatorios es muy simple - sólo necesitas dos parámetros que requieren un ajuste mínimo
  • Los bosques aleatorios pueden ser utilizados no sólo para tareas de clasificación y regresión, sino también para las tareas de identificación de las características más informativas, agrupación y  resaltar observaciones anómalas

…………………………………….
Espero que este post haya sido útil e interesante para ti! Si haces algo interesante con esta información, deja una respuesta en los comentarios de abajo o ponte en contacto en cualquier momento en mi blog de Instagram y Medium.
Gracias por leer!


Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!