El procedimiento de validación cruzada de pliegue k se utiliza para estimar el rendimiento de los modelos de aprendizaje por máquina al hacer predicciones sobre datos no utilizados durante el entrenamiento.
Este procedimiento puede utilizarse tanto para optimizar los hiperparámetros de un modelo en un conjunto de datos, como para comparar y seleccionar un modelo para el conjunto de datos. Cuando el mismo procedimiento de validación cruzada y el mismo conjunto de datos se utilizan tanto para ajustar como para seleccionar un modelo, es probable que se produzca una evaluación sesgada y optimista del rendimiento del modelo.
Un enfoque para superar este sesgo es anidar el procedimiento de optimización de hiperparámetros en el procedimiento de selección de modelos. Esto se llama doble validación cruzada o validación cruzada anidada y es la forma preferida de evaluar y comparar modelos de aprendizaje de máquinas afinadas.
En este tutorial, descubrirá la validación cruzada anidada para evaluar modelos de aprendizaje de máquinas afinadas.
Después de completar este tutorial, lo sabrás:
- La optimización de los hiperparámetros puede sobredimensionar un conjunto de datos y proporcionar una evaluación optimista de un modelo que no debería utilizarse para la selección del mismo.
- La validación cruzada anidada proporciona una forma de reducir el sesgo en la sintonización combinada de hiperparámetros y la selección de modelos.
- Cómo implementar la validación cruzada anidada para evaluar los algoritmos de aprendizaje de máquinas afinadas en scikit-learn.
Empecemos.
Resumen del Tutorial
Este tutorial está dividido en tres partes; son:
- Sintonización combinada de hiperparámetros y selección de modelos
- ¿Qué es la validación cruzada anidada
- Validación cruzada anidada con Scikit-Learn
Sintonización combinada de hiperparámetros y selección de modelos
Es común evaluar los modelos de aprendizaje de las máquinas en un conjunto de datos utilizando la validación cruzada del pliegue k.
El procedimiento de validación cruzada de pliegues k divide un conjunto limitado de datos en pliegues k no superpuestos. Cada uno de los pliegues k tiene la oportunidad de ser utilizado como un conjunto de pruebas retenidas mientras que todos los demás pliegues colectivamente se utilizan como un conjunto de datos de entrenamiento. Un total de k modelos son ajustados y evaluados en los conjuntos de pruebas de retención k y se informa del rendimiento medio.
Para más información sobre el procedimiento de validación cruzada de k-fold, vea el tutorial:
El procedimiento proporciona una estimación del rendimiento del modelo en el conjunto de datos al hacer una predicción sobre los datos no utilizados durante el entrenamiento. Está menos sesgado que algunas otras técnicas, como la división de una sola prueba de entrenamiento para un conjunto de datos de tamaño pequeño a modesto. Los valores comunes para k son k=3, k=5, y k=10.
Cada algoritmo de aprendizaje de la máquina incluye uno o más hiperparámetros que permiten que el comportamiento del algoritmo se adapte a un conjunto de datos específico. El problema es que rara vez hay una buena heurística sobre cómo configurar los hiperparámetros del modelo para un conjunto de datos. En su lugar, se utiliza un procedimiento de optimización para descubrir un conjunto de hiperparámetros que funcionen bien o mejor en el conjunto de datos. Los ejemplos comunes de algoritmos de optimización incluyen la búsqueda en cuadrículas y la búsqueda aleatoria, y cada conjunto distinto de hiperparámetros modelo se evalúa típicamente utilizando una validación cruzada de pliegues k.
Esto pone de relieve que el procedimiento de validación cruzada de la sección k se utiliza tanto en la selección de los hiperparámetros de los modelos para configurar cada modelo como en la selección de los modelos configurados.
El procedimiento de validación cruzada de pliegue k es un enfoque eficaz para estimar el rendimiento de un modelo. Sin embargo, una limitación del procedimiento es que si se utiliza varias veces con el mismo algoritmo, puede llevar a un sobreajuste.
Cada vez que se evalúa un modelo con diferentes hiperparámetros de modelo en un conjunto de datos, proporciona información sobre el conjunto de datos. Específicamente, una puntuación de rendimiento de modelo a menudo ruidosa. Este conocimiento sobre el modelo en el conjunto de datos puede ser explotado en el procedimiento de configuración del modelo para encontrar la configuración de mejor rendimiento para el conjunto de datos. El procedimiento de validación cruzada de pliegue k intenta reducir este efecto, pero no puede eliminarse completamente, y se realizará algún tipo de escalada o de sobreajuste de los hiperparámetros del modelo al conjunto de datos. Este es el caso normal de la optimización de hiperparámetros.
El problema es que si esta puntuación por sí sola se utiliza para seleccionar un modelo, o el mismo conjunto de datos se utiliza para evaluar los modelos afinados, entonces el proceso de selección estará sesgado por esta inadvertida sobrecarga. El resultado es una estimación demasiado optimista del rendimiento del modelo que no se generaliza a los nuevos datos.
Se requiere un procedimiento que permita a ambos modelos seleccionar hiperparámetros de buen rendimiento para el conjunto de datos y elegir entre una colección de modelos bien configurados en un conjunto de datos.
Un enfoque de este problema se llama validación cruzada anidada.
¿Qué es la validación cruzada anidada
La validación cruzada anidada es un enfoque de la optimización de los hiperparámetros de los modelos y de la selección de modelos que intenta superar el problema de la sobrecarga del conjunto de datos de entrenamiento.
A fin de superar el sesgo en la evaluación del rendimiento, la selección del modelo debe considerarse parte integrante del procedimiento de ajuste del modelo, y debe llevarse a cabo de manera independiente en cada ensayo a fin de evitar el sesgo de selección y porque refleja las mejores prácticas en el uso operacional.
– Sobre el sobreajuste en la selección de modelos y el posterior sesgo de selección en la evaluación del rendimiento, 2010.
El procedimiento consiste en tratar la optimización de los hiperparámetros del modelo como parte del propio modelo y evaluarla en el marco del procedimiento más amplio de validación cruzada del pliegue k para evaluar los modelos para su comparación y selección.
Como tal, el procedimiento de validación cruzada del pliegue k para la optimización de los hiperparámetros del modelo está anidado dentro de la k-procedimiento de validación cruzada para la selección del modelo. El uso de dos bucles de validación cruzada también lleva a que el procedimiento se llame «doble validación cruzada.”
Típicamente, el procedimiento de validación cruzada del pliegue k implica ajustar un modelo en todos los pliegues menos uno y evaluar el modelo de ajuste en el pliegue de retención. Referámonos al conjunto de pliegues utilizados para entrenar el modelo como el «conjunto de datos del tren«y el pliegue que se mantiene como el»conjunto de datos de prueba.”
Cada conjunto de datos de capacitación se proporciona a un procedimiento optimizado de hiperparámetros, como la búsqueda en cuadrículas o la búsqueda aleatoria, que encuentra un conjunto óptimo de hiperparámetros para el modelo. La evaluación de cada conjunto de hiperparámetros se realiza mediante una validación cruzada de pliegues k que divide el conjunto de datos de entrenamiento proporcionado en k pliegues, no el conjunto de datos original.
Esto se denomina protocolo «interno», ya que el proceso de selección del modelo se realiza de forma independiente dentro de cada pliegue del procedimiento de remuestreo.
– Sobre el sobreajuste en la selección de modelos y el posterior sesgo de selección en la evaluación del rendimiento, 2010.
Con este procedimiento, la búsqueda de hiperparámetros no tiene la oportunidad de sobreajustar el conjunto de datos, ya que sólo se expone a un subconjunto del conjunto de datos proporcionado por el procedimiento de validación cruzada exterior. Esto reduce, si no elimina, el riesgo de que el procedimiento de búsqueda sobrepase el conjunto de datos original y debería proporcionar una estimación menos sesgada del rendimiento de un modelo ajustado en el conjunto de datos.
De esta manera, la estimación del rendimiento incluye un componente que tiene en cuenta adecuadamente el error introducido por la superación del criterio de selección del modelo.
– Sobre el sobreajuste en la selección de modelos y el posterior sesgo de selección en la evaluación del rendimiento, 2010.
¿Cuál es el costo de la validación cruzada anidada?
Una desventaja de la validación cruzada anidada es el drástico aumento del número de evaluaciones de modelos realizadas.
Si n * k los modelos se ajustan y evalúan como parte de una búsqueda de hiperparámetros de validación cruzada tradicional para un modelo dado, luego esto se incrementa a k * n * k ya que el procedimiento se lleva a cabo k más veces por cada pliegue en el bucle exterior de la validación cruzada anidada.
Para concretar esto, podrías usar k=5 para la búsqueda de hiperparámetros y probar 100 combinaciones de modelos de hiperparámetros. Por lo tanto, una búsqueda de hiperparámetros tradicional se ajustaría y evaluaría 5 * 100 o 500 modelos. La validación cruzada anidada con k=10 los pliegues del lazo exterior encajarían y evaluarían 5.000 modelos. Un aumento de 10 veces en este caso.
¿Cómo se establece k?
El valor k para el bucle interior y el bucle exterior debe ser ajustado como se ajustaría el k-Valor para un solo k-un procedimiento de validación cruzada.
Debes elegir un k-Valor para su conjunto de datos que equilibra el costo computacional del procedimiento de evaluación (no demasiadas evaluaciones de modelos) y la estimación imparcial del rendimiento del modelo.
Es común utilizar k=10 para el bucle exterior y un valor menor de k para el bucle interior, como k=3 o k=5.
¿Cómo se configura el modelo final?
El modelo final se configura y se ajusta mediante el procedimiento aplicado internamente al bucle exterior.
Como sigue:
- Se selecciona un algoritmo en base a su rendimiento en el bucle exterior de validación cruzada anidada.
- Entonces el procedimiento interno se aplica a todo el conjunto de datos.
- Los hiperparámetros encontrados durante esta búsqueda final se utilizan para configurar un modelo final.
- El modelo final se ajusta a todo el conjunto de datos.
Este modelo puede ser utilizado para hacer predicciones sobre nuevos datos. Sabemos lo bien que funcionará en promedio en base a la puntuación proporcionada durante el procedimiento final de ajuste del modelo.
Ahora que estamos familiarizados con la validación de cruces anidados, revisemos cómo podemos implementarla en la práctica.
Validación cruzada anidada con Scikit-Learn
El procedimiento de validación cruzada de k-fold está disponible en la biblioteca de aprendizaje de la máquina Python de scikit-learn a través de la clase de KFold.
La clase está configurada con el número de pliegues (divisiones), luego el split() se llama función, pasando en el conjunto de datos. Los resultados de la split() se enumeran para dar los índices de fila para el tren y conjuntos de prueba para cada pliegue.
Por ejemplo:
... # Configurar el procedimiento de validación cruzada cv = KFold(n_splits=10, estado_aleatorio=1) # realizar el procedimiento de validación cruzada para train_ix, test_ix en cv_outer.split(X): # datos divididos X_tren, X_test = X[[train_ix, :], X[[test_ix, :] y_tren, y_test = y[[train_ix], y[[test_ix] # Encajar y evaluar un modelo ... |
Esta clase puede utilizarse para realizar el bucle exterior del procedimiento de validación de la cruz anidada.
La biblioteca de scikit-learn ofrece búsqueda aleatoria de validación cruzada y optimización de hiperparámetros de búsqueda en cuadrículas a través de las clases RandomizedSearchCV y GridSearchCV respectivamente. El procedimiento se configura creando la clase y especificando el modelo, el conjunto de datos, los hiperparámetros a buscar y el procedimiento de validación cruzada.
Por ejemplo:
... # Configurar el procedimiento de validación cruzada cv = KFold(n_splits=3, shuffle=Verdadero, estado_aleatorio=1) # Definir el espacio de búsqueda espacio = dict() ... # Definir la búsqueda busca en = GridSearchCV(modelo, espacio, puntuación=«exactitud, n_jobs=–1, cv=cv) # Ejecutar la búsqueda resultado = busca en.encajar(X, y) |
Estas clases pueden utilizarse para el bucle interno de validación cruzada anidada, donde el conjunto de datos del tren definido por el bucle externo se utiliza como el conjunto de datos para el bucle interno.
Podemos unir estos elementos e implementar el procedimiento de validación cruzada anidada.
Lo importante es que podemos configurar la búsqueda de hiperparámetros para reajustar un modelo final con todo el conjunto de datos de entrenamiento utilizando los mejores hiperparámetros encontrados durante la búsqueda. Esto se puede lograr configurando el «refit«a True, y luego recuperando el modelo a través de lamejor_estimador_«en el resultado de la búsqueda.
... # Definir la búsqueda busca en = GridSearchCV(modelo, espacio, puntuación=«exactitud, n_jobs=–1, cv=cv_inner, refit=Verdadero) # Ejecutar la búsqueda resultado = busca en.encajar(X_tren, y_tren) # Obtener el mejor ajuste de modelo en todo el conjunto de entrenamiento best_model = resultado.mejor_estimador_ |
Este modelo puede entonces utilizarse para hacer predicciones sobre los datos de retención del bucle exterior y estimar el rendimiento del modelo.
... # Evaluar el modelo en el conjunto de datos de hold out yhat = best_model.predecir(X_test) |
Uniendo todo esto, podemos demostrar la validación cruzada anidada del Clasificador Forestal Aleatorio en un conjunto de datos de clasificación sintética.
Mantendremos las cosas simples y ajustaremos sólo dos hiperparámetros con tres valores cada uno, por ejemplo (3 * 3) 9 combinaciones. Usaremos 10 pliegues en la validación cruzada externa y tres pliegues para la validación cruzada interna, resultando en (10 * 9 * 3) o 270 evaluaciones de modelos.
El ejemplo completo figura a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Validación cruzada manual anidada para el bosque aleatorio en un conjunto de datos de clasificación de numpy importación significa de numpy importación std de sklearn.conjuntos de datos importación make_classification de sklearn.model_selection importación KFold de sklearn.model_selection importación GridSearchCV de sklearn.conjunto importación RandomForestClassifier de sklearn.métrica importación exactitud_puntuación # Crear un conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=20, estado_aleatorio=1, n_informativo=10, n_redundante=10) # Configurar el procedimiento de validación cruzada cv_outer = KFold(n_splits=10, shuffle=Verdadero, estado_aleatorio=1) # enumerar las divisiones resultados_externos = lista() para train_ix, test_ix en cv_outer.split(X): # datos divididos X_tren, X_test = X[[train_ix, :], X[[test_ix, :] y_tren, y_test = y[[train_ix], y[[test_ix] # Configurar el procedimiento de validación cruzada cv_inner = KFold(n_splits=3, shuffle=Verdadero, estado_aleatorio=1) # Definir el modelo modelo = RandomForestClassifier(estado_aleatorio=1) # Definir el espacio de búsqueda espacio = dict() espacio[[n_estimadores] = [[10, 100, 500] espacio[[‘max_features’ (características máximas)] = [[2, 4, 6] # Definir la búsqueda busca en = GridSearchCV(modelo, espacio, puntuación=«exactitud, cv=cv_inner, refit=Verdadero) # Ejecutar la búsqueda resultado = busca en.encajar(X_tren, y_tren) # Obtener el mejor ajuste de modelo en todo el conjunto de entrenamiento best_model = resultado.mejor_estimador_ # Evaluar el modelo en el conjunto de datos de hold out yhat = best_model.predecir(X_test) # Evaluar el modelo acc = accuracy_score(y_test, yhat) # Almacena el resultado resultados_externos.anexar(acc) # Reportar el progreso… imprimir(‘>acc=%.3f, est=%.3f, cfg=%s’ % (acc, resultado.mejor_puntuación_, resultado.best_params_)) # Resumir el rendimiento estimado del modelo imprimir(«Precisión: %.3f (%.3f) % (significa(resultados_externos), std(resultados_externos))) |
En el ejemplo se evalúa un bosque aleatorio mediante la validación de cruces anidados en un conjunto de datos de clasificación sintética.
Puede utilizar el ejemplo como punto de partida y adaptarlo para evaluar diferentes hiperparámetros de algoritmos, diferentes algoritmos o un conjunto de datos diferente.
Cada iteración del procedimiento de validación cruzada externa informa sobre el rendimiento estimado del modelo de mejor rendimiento (utilizando una validación cruzada triple) y los hiperparámetros que se ha comprobado que son los mejores, así como la precisión del conjunto de datos de retención.
Esto es perspicaz ya que podemos ver que las precisiones reales y estimadas son diferentes, pero en este caso, similares. También podemos ver que se encuentran diferentes hiperparámetros en cada iteración, lo que demuestra que los buenos hiperparámetros de este conjunto de datos dependen de las especificidades del conjunto de datos.
A continuación se informa de la exactitud de la clasificación media final.
>acc=0.900, est=0.932, cfg={‘max_features’: 4, ‘n_estimadores’: 100} >acc=0.940, est=0.924, cfg={‘max_features’: 4, ‘n_estimadores’: 500} >acc=0.930, est=0.929, cfg={‘max_features’: 4, ‘n_estimadores’: 500} >acc=0.930, est=0.927, cfg={‘max_features’: 6, ‘n_estimadores’: 100} >acc=0.920, est=0.927, cfg={‘max_features’: 4, ‘n_estimadores’: 100} >acc=0.950, est=0.927, cfg={‘max_features’: 4, ‘n_estimadores’: 500} >acc=0.910, est=0.918, cfg={‘max_features’: 2, ‘n_estimadores’: 100} >acc=0.930, est=0.924, cfg={‘max_features’: 6, ‘n_estimadores’: 500} >acc=0.960, est=0.926, cfg={‘max_features’: 2, ‘n_estimadores’: 500} >acc=0.900, est=0.937, cfg={‘max_features’: 4, ‘n_estimadores’: 500} Precisión: 0,927 (0,019) |
Una forma más simple de que podamos realizar el mismo procedimiento es usando la función cross_val_score() que ejecutará el procedimiento de validación cruzada exterior. Esto puede realizarse en el GridSearchCV directamente que usará automáticamente el modelo de mejor rendimiento en el equipo de prueba del lazo exterior.
Esto reduce en gran medida la cantidad de código necesario para realizar la validación cruzada anidada.
El ejemplo completo figura a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Validación cruzada automática anidada para el bosque aleatorio en un conjunto de datos de clasificación de numpy importación significa de numpy importación std de sklearn.conjuntos de datos importación make_classification de sklearn.model_selection importación puntaje_valor_cruzado de sklearn.model_selection importación KFold de sklearn.model_selection importación GridSearchCV de sklearn.conjunto importación RandomForestClassifier # Crear un conjunto de datos X, y = make_classification(n_muestras=1000, n_funciones=20, estado_aleatorio=1, n_informativo=10, n_redundante=10) # Configurar el procedimiento de validación cruzada cv_inner = KFold(n_splits=3, shuffle=Verdadero, estado_aleatorio=1) # Definir el modelo modelo = RandomForestClassifier(estado_aleatorio=1) # Definir el espacio de búsqueda espacio = dict() espacio[[n_estimadores] = [[10, 100, 500] espacio[[‘max_features’ (características máximas)] = [[2, 4, 6] # Definir la búsqueda busca en = GridSearchCV(modelo, espacio, puntuación=«exactitud, n_jobs=1, cv=cv_inner, refit=Verdadero) # Configurar el procedimiento de validación cruzada cv_outer = KFold(n_splits=10, shuffle=Verdadero, estado_aleatorio=1) # Ejecutar la validación cruzada anidada resultados = puntaje_valor_cruzado(busca en, X, y, puntuación=«exactitud, cv=cv_outer, n_jobs=–1) # Informe de rendimiento imprimir(«Precisión: %.3f (%.3f) % (significa(resultados), std(resultados))) |
Al ejecutar los ejemplos se realiza la validación cruzada anidada en el algoritmo de bosque aleatorio, logrando una precisión media que coincide con nuestro procedimiento manual.