Ahora suponga que ha elegido el mejor modelo posible para un problema en particular y está trabajando para mejorar aún más su precisión. En este caso, deberá aplicar técnicas de aprendizaje automático más avanzadas que se conocen colectivamente como aprendizaje conjunto.
Un conjunto es una colección de elementos que colectivamente contribuyen a un todo. Un ejemplo familiar es un conjunto musical, que mezcla los sonidos de varios instrumentos musicales para crear una hermosa armonía, o conjuntos arquitectónicos, que son una colección de edificios diseñados como una unidad. En los conjuntos, el resultado armonioso (en su totalidad) es más importante que la ejecución de cualquier parte individual.
Contenido
PalancaPrincipios del aprendizaje conjunto
El teorema del jurado de Condorcet (1784) se trata de un conjunto en algún sentido. Establece que, si cada miembro del jurado emite un juicio independiente y la probabilidad de la decisión correcta de cada miembro del jurado es mayor que 0.5, entonces la probabilidad de la decisión correcta de todo el jurado aumenta con el número total de miembros del jurado y tiende a a. Por otro lado, si la probabilidad de acertar es inferior a 0,5 para cada miembro del jurado, entonces la probabilidad de una decisión correcta del jurado en su conjunto disminuye con el número de miembros del jurado y tiende a cero.
Considere otro ejemplo de conjuntos: una observación conocida como Sabiduría de la multitud. En 1906, Francis Galton visitó una feria rural en Plymouth donde vio una competencia para agricultores. 800 participantes intentaron estimar el peso de un toro sacrificado. El peso real del toro fue de 1198 libras. Aunque ninguno de los granjeros pudo adivinar el peso exacto del animal, el promedio de sus predicciones fue de 1197 libras.
Se ha adoptado una idea similar para la reducción de errores en el campo del aprendizaje automático.
Cebado (embolsado y bootstrapping)
El embolsado (también conocido como agregación Bootstrap) es una de las técnicas de conjunto más antiguas y básicas. Fue propuesto por Leo Breiman en 1994. El embolsado se basa en el método estadístico bootstrap, que permite evaluar muchas estadísticas de modelos complejos.
El método bootstrap procede de la siguiente manera. Considere una muestra X de tamaño N. Se puede hacer una nueva muestra a partir de la muestra original extrayendo N elementos de esta última de manera aleatoria y uniforme, con reemplazo. En otras palabras, seleccionamos un elemento aleatorio de la muestra original de tamaño N y lo hacemos N veces. Todos los elementos tienen la misma probabilidad de ser seleccionados, por lo que cada elemento se extrae con la misma probabilidad 1/N.
Digamos que sacamos bolas de una bolsa una a la vez. En cada etapa, la bola seleccionada se devuelve a la bolsa para que la siguiente selección se realice de manera equiprobable, es decir, a partir del mismo número de bolas N. Nótese que, dado que las bolas se devuelven, puede haber duplicados en la nueva muestra. Llamemos a esta nueva muestra X1.
Al repetir este procedimiento M veces, creamos M muestras de arranque X1, …, XM. Al final, tenemos un número suficiente de muestras y podemos calcular varias estadísticas a partir de la distribución original.
Para nuestro ejemplo, usaremos el conocido conjunto de datos telecom_churn. Anteriormente, cuando discutimos la importancia de las funciones, vimos que una de las funciones más importantes en este conjunto de datos es la cantidad de llamadas de servicio al cliente. Visualicemos los datos y observemos la distribución de esta característica.
importar panda as p.d. | |
de matplotlib importar pyplot as por favor | |
por favor.estilo.gastado('ggplot') | |
por favor.rcParams['figura.figsize'] = 10, 6 | |
importar nacido en el mar as redes sociales | |
%matplotlib en línea | |
telecom_data = p.d..leer_csv('../../data/telecom_churn.csv') | |
higo = redes sociales.kdeplot(telecom_data[telecom_data['batir'] == Falso]['Llamadas de atención al cliente'], | |
etiqueta = 'Leal') | |
higo = redes sociales.kdeplot(telecom_data[telecom_data['batir'] == Verdadero]['Llamadas de atención al cliente'], | |
etiqueta = 'batir') | |
higo.establecer(xlabel='Número de llamadas', etiqueta='Densidad') | |
por favor.mostrar() |
importar entumecido as notario público. | |
definitivamente get_bootstrap_samples(datos, n_muestras): | |
“””Generar muestras de arranque utilizando el método de arranque. » » » | |
pistas = notario público..aleatorio.al azar(0, después(datos), (n_muestras, después(datos))) | |
muestras = datos[pistas] | |
regreso muestras | |
definitivamente stat_intervals(estado, alfa): | |
“””Producir una estimación de intervalo. » » » | |
límites = notario público..percentil(estado, [100 * alfa / 2., 100 * (1 – alfa / 2.)]) | |
regreso límites | |
# Guarde los datos sobre los clientes leales y forme para dividir el conjunto de datos | |
llamadas_leales = telecom_data[telecom_data['batir'] | |
== Falso]['Llamadas de atención al cliente'].valores | |
churn_calls= telecom_data[telecom_data['batir'] | |
== Verdadero]['Llamadas de atención al cliente'].valores | |
# Establecer la semilla para la reproducibilidad de los resultados | |
notario público..aleatorio.semilla(0) | |
# Generar las muestras mediante bootstrapping y calcular la media de cada una de ellas | |
puntuaciones_medias_leales = [notario público..significar(muestra) | |
por muestra en get_bootstrap_samples(llamadas_leales, 1000)] | |
churn_mean_scores = [notario público..significar(muestra) | |
por muestra en get_bootstrap_samples(churn_calls, 1000)] | |
# Imprimir las estimaciones de intervalo resultantes | |
impresión(“Llamadas de servicio de leales: intervalo medio”, | |
stat_intervals(puntuaciones_medias_leales, 0.05)) | |
impresión("Llamadas de servicio de churn: intervalo medio", | |
stat_intervals(churn_mean_scores, 0.05)) |
Llamadas de servicio de leales: intervalo medio [1,4077193 1,49473684] # Llamadas de servicio de abandono: intervalo medio [2,0621118 2,39761905]
Al final, encontramos que con una probabilidad de 95 %, el número promedio de llamadas de atención al cliente de clientes fieles está entre 1,4 y 1,49, mientras que los clientes revocados llamaron en promedio de 2,06 a 2,40 veces. También tenga en cuenta que el intervalo para los clientes leales es más estrecho, lo cual es razonable ya que hacen menos llamadas (0, 1 o 2) en comparación con los clientes desilusionados que llamaron hasta que se hartaron y cambiaron de proveedor.
harpillera
Ahora que tiene la idea de arranque, podemos pasar al embolsado. en un problema de regresión, al promediar las respuestas individuales, el embolsado reduce el error cuadrático medio por un factor M, el número de regresores.
De nuestra lección anterior, recordemos los componentes que conforman el error total fuera de muestra:
El embolsado reduce la varianza de un clasificador al disminuir la diferencia de error cuando entrenamos el modelo en diferentes conjuntos de datos. En otras palabras, el ensacado evita el sobreajuste. La efectividad del embolsado proviene del hecho de que los modelos individuales son bastante diferentes debido a los diferentes datos de entrenamiento y sus errores se anulan entre sí al votar. Además, es probable que se omitan los valores atípicos en algunas de las muestras de inicio de entrenamiento.
La biblioteca scikit-learn admite el embolsado con los metaestimadores BaggingRegressor y BaggingClassifier. Puede utilizar la mayoría de los algoritmos como base.
Echemos un vistazo a cómo funciona el embolsado en la práctica y comparémoslo con el árbol de decisión. Para ello utilizaremos un ejemplo de la documentación de sklearn.
El error para el árbol de decisión:
0,0255 = 0,0003 (sesgo²)+ 0,0152 (varianza) + 0,0098 (σ²)
El error al usar embolsado:
0,0196 = 0,0004 (sesgo²) + 0,0092 (varianza) + 0,0098 (σ²)
Como puede ver en el gráfico anterior, la variación del error es mucho menor para el embolsado. Recuerda que esto ya lo hemos probado teóricamente.
El embolsado es eficiente en conjuntos de datos pequeños. Eliminar incluso una pequeña parte de los datos de entrenamiento lleva a la construcción de clasificadores base significativamente diferentes. Si tiene un conjunto de datos grande, generará muestras de arranque de un tamaño mucho más pequeño.
Es poco probable que el ejemplo anterior se aplique al trabajo real. Esto se debe a que asumimos firmemente que nuestros errores individuales no están correlacionados. La mayoría de las veces, esto es demasiado optimista para las aplicaciones del mundo real. Cuando esta suposición es falsa, la reducción del error no será tan grande. En lecciones posteriores, discutiremos algunos métodos de conjuntos más sofisticados, que permiten predicciones más precisas en problemas del mundo real.
Error de fuera de la bolsa
En el futuro, en el caso del bosque aleatorio, no será necesario utilizar muestras de exclusión o validación cruzada para obtener una estimación del error imparcial. ¿Por qué? Porque, en las técnicas de conjunto, la estimación del error se realiza internamente.
Los árboles aleatorios se construyen utilizando diferentes muestras de arranque del conjunto de datos original. Aproximadamente 37 % de las entradas se excluyen de una muestra de arranque particular y no se utilizan en la construcción del K-th árbol.
Veamos cómo funciona la estimación de error Out-of-Bag (u OOBE):
La parte superior de la figura anterior representa nuestro conjunto de datos original. Lo hemos dividido en conjuntos de práctica (izquierda) y de prueba (derecha). En la imagen de la izquierda, dibujamos una cuadrícula que divide claramente nuestro conjunto de datos por clases. Ahora usamos la misma cuadrícula para estimar la proporción de respuestas correctas en nuestro conjunto de prueba. Podemos ver que nuestro clasificador dio respuestas incorrectas en estos 4 casos que no se usaron durante el entrenamiento (izquierda). Por tanto, la precisión de nuestro clasificador es 11/15*100 % = 73,33 %.
En resumen, cada algoritmo la base está entrenada en ~63 % de los ejemplos originales. Se puede validar en los ~37% restantes. La estimación Out-of-Bag no es más que la estimación promedio de los algoritmos base sobre los ~37 % de entradas que no han sido entrenadas.
Bosque aleatorio
Leo Breiman logró aplicar el bootstrap no solo en estadísticas sino también en aprendizaje automático. Junto con Adel Cutler, amplió y mejoró el algoritmo Random Forest propuesto por Tin Kam Ho. Combinaron la construcción de árboles no correlacionados utilizando CART, bagging y el método random subspace.
Los árboles de decisión son una buena opción para el clasificador básico en el embolsado porque son bastante sofisticados y pueden lograr cero errores de clasificación en cualquier muestra. El método del subespacio aleatorio reduce el correlación entre los ejes y así evitar el sobreajuste. Con el embolsado, los algoritmos centrales se entrenan en diferentes subconjuntos aleatorios del conjunto de funciones original.
El siguiente algoritmo construye un conjunto de modelos utilizando el método de subespacio aleatorio:
- Supongamos que el número de instancias es igual a n y el número de dimensiones de la entidad es igual a d.
- Elija M como el número de modelos individuales en el conjunto.
- Para cada modelo m, elija el número de características dm < d. Como regla general, se utiliza el mismo valor de dm para todos los modelos.
- Para cada modelo m, cree un conjunto de entrenamiento seleccionando características dm al azar del conjunto de características d.
- Entrena a cada modelo.
- Aplique el modelo de conjunto resultante a una nueva entrada combinando los resultados de todos los modelos de M. Puede usar la votación por mayoría o la agregación de probabilidad posterior.
El algoritmo es como sigue:
El clasificador final es la media de los árboles.
Para problemas de clasificación, es recomendable establecer m igual a la raíz cuadrada de d. Para problemas de regresión, generalmente tomamos m = d/3, donde d es el número de características. Se recomienda construir cada árbol hasta que todas sus hojas contengan solo 1 instancia para clasificación y 5 instancias para regresión.
Puede pensar en Random Forest como una agrupación de árboles de decisión con la selección cambiante de un subconjunto aleatorio de características con cada división.
Comparación
Estos son los resultados de los tres algoritmos:
Como podemos ver en nuestros gráficos y los valores de MSE anteriores, un Random Forest de 10 árboles logra un mejor resultado que un solo árbol de decisión y es comparable a embolsar con 10 árboles. La principal diferencia entre los bosques aleatorios y el empaquetamiento es que, en un bosque aleatorio, la mejor función para una división se selecciona de un subconjunto aleatorio de las funciones disponibles, mientras que en el empaquetamiento, todas las funciones se consideran para la siguiente mejor división.
También podemos ver los beneficios de los bosques aleatorios y los problemas de clasificación.
Las figuras anteriores muestran que el límite de decisión del árbol de decisión es bastante irregular y tiene muchos ángulos agudos que sugieren sobreajuste y poca capacidad de generalización. Tendríamos dificultades para hacer predicciones confiables sobre nuevos datos de prueba. Por el contrario, el algoritmo de embolsado tiene un límite bastante suave y no muestra signos evidentes de sobreajuste.
Ahora veamos algunos parámetros que pueden ayudarnos a aumentar la precisión del modelo.
Parámetros para aumentar la precisión
La biblioteca scikit-learn implementa bosques aleatorios al proporcionar dos estimadores: RandomForestClassifier y RandomForestRegressor.
A continuación se muestran los parámetros a los que debemos prestar atención al construir un nuevo modelo:
- n_estimators es el número de árboles en el bosque;
- criterio es la función utilizada para medir la calidad de una división;
- max_features es el número de funciones a considerar al encontrar la mejor distribución;
- min_samples_leaf es el número mínimo de muestras requeridas para estar en un nodo de hoja;
- max_ depth es la profundidad máxima del árbol.
El hecho más importante sobre los bosques aleatorios es que su precisión no disminuye cuando agregamos árboles, por lo que el número de árboles no es un hiperparámetro de complejidad a diferencia de max_ depth y min_samples_leaf. Esto significa que puede ajustar los hiperparámetros con, digamos, 10 árboles, luego aumentar la cantidad de árboles hasta 500 y estar seguro de que la precisión solo mejorará.
Los árboles extremadamente aleatorios utilizan un mayor grado de aleatorización en la elección del punto de corte al dividir un nodo de árbol. Al igual que en Random Forests, se utiliza un subconjunto aleatorio de características. Pero, en lugar de buscar umbrales óptimos, sus valores se seleccionan aleatoriamente para cada característica posible, y el mejor entre estos umbrales generados aleatoriamente se usa como la mejor regla para dividir el nodo. Esto generalmente compensa una ligera reducción en la varianza del modelo con un ligero aumento en el sesgo.
En la biblioteca scikit-learn, hay 2 implementaciones de árboles extremadamente aleatorias: ExtraTreesClassifier y ExtraTreesRegressor.
Este método debe usarse si se ha excedido con bosques aleatorios o aumento de gradiente.
Conclusión sobre el bosque aleatorio
Ventajas:
- Alta precisión de predicción; funcionará mejor que los algoritmos lineales en la mayoría de los problemas; la precisión es comparable a la del boosting;
- Robusto frente a valores atípicos, gracias al muestreo aleatorio;
- Insensible a la escala de características, así como a cualquier otra transformación monótona debido a la selección aleatoria de subespacios;
- No requiere un ajuste fino de la configuración, funciona bastante bien desde el primer momento. Con la afinación, se puede lograr una ganancia de precisión de 0,5 a 3 %, según el problema de afinación y los datos;
- Efectivo para conjuntos de datos con una gran cantidad de características y clases;
- Maneja variables continuas y discretas;
- Rara vez sobredimensionado. En la práctica, un aumento en el número de árboles casi siempre mejora la composición. Pero, después de llegar a un cierto número de árboles, la curva de aprendizaje está muy cerca de la asíntota;
- Hay métodos desarrollados para estimar la importancia de las características;
- Funciona bien con datos faltantes y mantiene buenos niveles de precisión incluso cuando falta una gran parte de los datos;
- Proporciona medios para ponderar las clases sobre el conjunto de datos, así como para cada árbol de muestra;
- Bajo el capó, calcula las proximidades entre pares de instancias que luego se pueden usar en agrupaciones, detección de valores atípicos o representaciones de datos interesantes;
- La funcionalidad y las propiedades anteriores se pueden extender a los datos sin etiquetar para permitir la agrupación no supervisada, Visualización de datos y detección de valores atípicos;
- Fácilmente paralelizado y altamente escalable.
Los inconvenientes:
- En comparación con un solo árbol de decisión, la salida de Random Forest es más difícil de interpretar.
- No hay valores p formales para estimar la importancia de las características.
- Funciona peor que los métodos lineales en el caso de datos escasos: entradas de texto, bolsa de palabras, etc. ;
- A diferencia de la regresión lineal, Random Forest no puede extrapolar. Pero esto también puede verse como una ventaja porque los valores atípicos no provocan valores atípicos en bosques aleatorios;
- Propenso al sobreajuste en algunos problemas, especialmente cuando se trata de datos ruidosos;
- En el caso de variables categóricas con diferente número de niveles, los bosques aleatorios favorecen las variables con mayor número de niveles. La estructura de árbol se adaptará más a la funcionalidad multinivel, a medida que se vuelva más precisa;
- Si un conjunto de datos contiene grupos de características correlacionadas con una importancia similar para las clases previstas, se dará preferencia a los grupos más pequeños;
- El modelo resultante es grande y requiere mucha RAM.