Una explicación básica y un caso de uso en 7 minutos
· Seguir
Publicado en · 7 minutos de lectura · 2 de marzo de 2022
--
Hace unas semanas, escribí un artículo demostrandomodelos de clasificación de bosques aleatorios. En este artículo, demostraremos el caso de regresión de un bosque aleatorio usando el modelo RandomForrestRegressor() de sklearn.
De manera similar a mi último artículo, comenzaré este artículo destacando algunas definiciones y términos relacionados y que comprenden la columna vertebral del aprendizaje automático de bosques aleatorios. El objetivo de este artículo es describir el modelo de bosque aleatorio y demostrar cómo se puede aplicar utilizando el paquete sklearn. Nuestro objetivo no será buscar la solución más óptima, ya que esta es solo una guía básica.
Definiciones:
Árboles de decisiónse utilizan tanto para problemas de regresión como de clasificación. Fluyen visualmente como árboles, de ahí el nombre, y en el caso de regresión, comienzan con la raíz del árbol y siguen divisiones basadas en resultados variables hasta que se alcanza un nodo hoja y se da el resultado. A continuación se muestra un ejemplo de un árbol de decisión:
Aquí vemos un diagrama de árbol de decisión básico que comienza con Var_1 y se divide en función de criterios específicos. Cuando 'sí', el árbol de decisión sigue el camino representado, cuando 'no', el árbol de decisión sigue el otro camino. Este proceso se repite hasta que el árbol de decisión llega al nodo hoja y se decide el resultado resultante. Para el ejemplo anterior, los valores de a, b, c o d podrían ser representativos de cualquier valor numérico o categórico.
aprendizaje conjuntoes el proceso de usar múltiples modelos, entrenados sobre los mismos datos, promediando los resultados de cada modelo y finalmente encontrando un resultado predictivo/clasificación más poderoso. Nuestra esperanza, y el requisito, para el aprendizaje conjunto es que los errores de cada modelo (en este caso, el árbol de decisión) sean independientes y diferentes de un árbol a otro.
arranquees el proceso de muestreo aleatorio de subconjuntos de un conjunto de datos en un número determinado de iteraciones y un número determinado de variables. Estos resultados luego se promedian juntos para obtener un resultado más poderoso. Bootstrapping es un ejemplo de un modelo de conjunto aplicado.
el arranqueBosque aleatorioEl algoritmo combina métodos de aprendizaje de conjunto con el marco del árbol de decisión para crear múltiples árboles de decisión extraídos al azar a partir de los datos, promediando los resultados para generar un nuevo resultado que a menudo conduce a predicciones/clasificaciones sólidas.
Para este artículo, demostraré un modelo Random Forest creado con datos de vivienda de EE. UU. publicados en Kaggle por Austin Reese ubicadoaquí, estos datos tienen licencia CC0 — Dominio público. Este conjunto de datos proporciona información y detalles sobre las casas listadas para alquilar. El conjunto de datos se compone de aproximadamente 380k observaciones y más de 20 variables. Realicé una buena cantidad de EDA, pero no incluiré todos los pasos con el fin de mantener este artículo más sobre el modelo de bosque aleatorio real.
Modelo de regresión de bosque aleatorio:
Usaremos el módulo sklearn para entrenar nuestro modelo de regresión de bosque aleatorio, específicamente la función RandomForestRegressor. La documentación de RandomForestRegressor muestra muchos parámetros diferentes que podemos seleccionar para nuestro modelo. Algunos de los parámetros importantes se destacan a continuación:
- n_estimadores— el número de árboles de decisión que ejecutará en el modelo
- criterio— esta variable le permite seleccionar el criterio (función de pérdida) utilizado para determinar los resultados del modelo. Podemos seleccionar funciones de pérdida como el error cuadrático medio (MSE) y el error absoluto medio (MAE). El valor predeterminado es MSE.
- máxima profundidad— esto establece la profundidad máxima posible de cada árbol
- max_features— el número máximo de características que el modelo considerará al determinar una división
- oreja— el valor predeterminado para esto es Verdadero, lo que significa que el modelo sigue los principios de arranque (definidos anteriormente)
- max_muestras— Este parámetro asume que el bootstrapping está establecido en True; de lo contrario, este parámetro no se aplica. En el caso de True, este valor establece el tamaño más grande de cada muestra para cada árbol.
- Otros parámetros importantes sonmin_samples_split, min_samples_leaf, n_trabajos, y otros que se pueden leer en la documentación de RandomForestRegressor de sklearnaquí.
Para los propósitos de este artículo, primero mostraremos algunos valores básicos ingresados en el modelo de regresión de bosque aleatorio, luego usaremos la búsqueda en cuadrícula y la validación cruzada para encontrar un conjunto de parámetros más óptimo.
rf = RandomForestRegressor(n_estimators = 300, max_features = 'sqrt', max_ depth = 5, random_state = 18).fit(x_train, y_train)
Mirando nuestro modelo base anterior, estamos usando 300 árboles; max_features por árbol es igual a la raíz cuadrada de la cantidad de parámetros en nuestro conjunto de datos de entrenamiento. La profundidad máxima de cada árbol se establece en 5. Y, por último, el estado aleatorio se estableció en 18 solo para mantener todo estándar.
Como discutí en mi artículo anterior de clasificación de bosques aleatorios, cuando resolvemos problemas de clasificación, podemos ver nuestro desempeño usando métricas como exactitud, precisión, recuperación, etc. Al ver las métricas de desempeño de un modelo de regresión, podemos usar factores como la media error cuadrático, error cuadrático medio, R², R² ajustado y otros. Para este artículo me centraré en el error cuadrático medio y el error cuadrático medio.
Como breve explicación, el error cuadrático medio (MSE) es el promedio de la suma de la diferencia cuadrática entre el valor de salida real y el valor de salida previsto. Nuestro objetivo es reducir el MSE tanto como sea posible. Por ejemplo, si tenemos una matriz de salida real de (3,5,7,9) y una salida prevista de (4,5,7,7), entonces podríamos calcular el error cuadrático medio como:
((3-4)² + (5–5)² + (7–7)² +(9–7)²)/4 = (1+0+0+4)/4 = 5/4 = 1,25
El error cuadrático medio (RMSE) es simplemente la raíz cuadrada del MSE, por lo que en este caso el RMSE = 1.25^.5 = 1.12.
Usando estas métricas de rendimiento, podemos ejecutar el siguiente código para calcular el MSE y RMSE de nuestro modelo:
predicción = rf.predict(x_test)mse = mean_squared_error(y_test, predicción)
rmse = mse**.5imprimir (mse)
imprimir (rmse)
Nuestros resultados de este modelo básico de bosque aleatorio no fueron tan buenos en general. El valor RMSE de 515 es bastante alto dado que la mayoría de los valores de nuestro conjunto de datos están entre 1000 y 2000. De cara al futuro, veremos si el ajuste ayuda a crear un modelo con mejor rendimiento.
Una cosa a considerar cuando se ejecutan modelos de bosques aleatorios en un gran conjunto de datos es el tiempo de entrenamiento potencialmente largo. Por ejemplo, el tiempo necesario para ejecutar este primer modelo básico fue de unos 30 segundos, lo que no está nada mal, pero como demostraré en breve, este requisito de tiempo puede aumentar rápidamente.
Ahora que hicimos nuestra regresión básica de bosque aleatorio, buscaremos una opción de parámetros con mejor rendimiento y lo haremos utilizando el método GridSearchCV sklearn.
## Definir cuadrícula
cuadrícula = {
'n_estimadores': [200,300,400,500],
'max_features': ['sqrt','log2'],
'profundidad_máxima': [3,4,5,6,7],
'estado_aleatorio': [18]
}## mostrar la hora de inicio
imprimir(fechahora.ahora())## Función de búsqueda en cuadrícula
CV_rfr = GridSearchCV(estimador=RandomForestRegressor(), param_grid=grid1, cv= 5)
CV_frf.fit(x_tren, y_tren)## mostrar la hora de finalización
imprimir(fechahora.ahora())
Como habrás notado en el código anterior, incluí dos declaraciones de impresión que mostrarán la fecha y hora actual, de esta manera podemos rastrear las horas de inicio y finalización de la función para medir el tiempo de ejecución. Como podemos ver en la imagen de arriba, esta función tardó más de 2 horas en entrenarse/ajustarse, lo que no es una cantidad de tiempo insignificante, y una versión significativamente más escalada de 30 segundos que vimos antes para nuestro modelo básico.
Para ampliar aún más, nuestro conjunto de datos tenía alrededor de 380 000 observaciones, lo que aún es relativamente pequeño, especialmente en comparación con las que se utilizan para aplicaciones profesionales o investigación académica, donde el recuento de observaciones podría ser de millones o miles de millones. Estas limitaciones de tiempo deben tenerse en cuenta al considerar qué modelo usar y sopesar el rendimiento frente al tiempo.
El parámetro óptimo encontrado a través de nuestra búsqueda de cuadrícula se encuentra en la sección de código a continuación. Usando estos parámetros y probándolos con los mismos datos, encontramos los siguientes resultados.
{'profundidad_máxima': 7,
'max_features': 'raíz cuadrada',
'n_estimadores': 300,
'estado_aleatorio': 18}# Crear y entrenar modelo
rf = RandomForestRegressor(n_estimators = 300, max_features = 'sqrt', max_ depth = 7, random_state = 18)
rf.fit(x_tren, y_tren)# Predecir en datos de prueba
predicción = rf.predict(x_test)# Calcular el error cuadrático medio
mse = mean_squared_error(y_test, predicción)# Imprimir resultados
imprimir (mse)
imprimir (mse ^ .5)
Este resultado de error cuadrático medio es más bajo que nuestro modelo base, lo cual es genial de ver, pero en general, aún consideraría este rendimiento inadecuado. Un error cuadrático medio de 504 significa que el error promedio por estimación es $504 de descuento en el precio de alquiler real. Podría haber algunas razones para este bajo rendimiento:
- No usar ciertas variables y/o usar variables innecesarias
- Pobre EDA y disputa de datos
- No tener en cuenta adecuadamente las variables categóricas o textuales
En mi opinión, la razón principal de los malos resultados se puede atribuir al primer punto mencionado anteriormente. Dicho esto, el objetivo de este artículo no era producir el resultado óptimo, sino demostrar cómo aplicar el modelo de regresión de bosque aleatorio, usando sklearn, y alguna información básica sobre cómo funciona el modelo de bosque aleatorio. A los efectos de este artículo, diría que pudimos lograr nuestros objetivos.
Conclusión:
En este artículo, hemos demostrado algunos de los fundamentos detrás de los modelos de bosque aleatorio y, más específicamente, cómo aplicar el algoritmo regresor de bosque aleatorio de sklearn. Señalamos algunos de los beneficios de los modelos de bosques aleatorios, así como algunos inconvenientes potenciales.
¡Gracias por tomarse el tiempo de leer este artículo! Espero que hayas disfrutado leyendo y hayas aprendido más sobre la regresión aleatoria de bosques. Continuaré escribiendo artículos actualizando los métodos implementados aquí, así como otros métodos y temas relacionados con la ciencia de datos.