
Validación cruzada anidada
La validación cruzada anidada es una técnica avanzada y sólida utilizada en el aprendizaje automático para evaluar modelos de manera más precisa. Se lleva a cabo mediante dos bucles, uno dentro del otro, lo que permite una evaluación minuciosa del rendimiento del modelo.
Combina dos niveles de validación para evaluar y optimizar modelos de Machine Learning de forma precisa y robusta.
- Bucle externo:
Divide el conjunto de datos en entrenamiento y prueba, de manera similar a la validación cruzada tradicional. En cada iteración, se reserva un subconjunto diferente para prueba, mientras el resto se utiliza para entrenar el modelo. - Bucle interno:
Aplica técnicas como la validación cruzada k-fold dentro del conjunto de entrenamiento definido por el bucle externo. Aquí, se prueban múltiples configuraciones de hiperparámetros, dividiendo el conjunto de entrenamiento en k partes, entrenando con k-1 y validando con la restante.
El objetivo de este bucle es seleccionar la mejor configuración del modelo basándose en su rendimiento promedio. - Estimación del rendimiento final:
Tras completar ambos bucles, se obtiene una evaluación más fiable del modelo, considerando la variabilidad de los conjuntos de datos y las configuraciones probadas.
¿Por qué usar validación cruzada anidada?
- Evita que la selección de hiperparámetros dependa de una única partición de datos.
- Ofrece resultados más generalizables y ayuda a prevenir el sobreajuste.
- Proporciona una evaluación sólida y confiable del rendimiento del modelo.
Resumen visual del proceso:
- Dividir los datos en k partes.
- En cada iteración del bucle externo:
- Utilizar una parte como prueba, el resto como entrenamiento.
- Dentro del conjunto de entrenamiento, aplicar validación cruzada interna para ajustar hiperparámetros.
- Obtener la media de los rendimientos de los k modelos para estimar el rendimiento final.
Funcionamiento de la validación cruzada anidada
La validación cruzada anidada combina dos niveles de validación para evaluar y optimizar modelos de Machine Learning de forma precisa y robusta.
- Bucle externo:
Divide el conjunto de datos en entrenamiento y prueba, de manera similar a la validación cruzada tradicional. En cada iteración, se reserva un subconjunto diferente para prueba, mientras el resto se utiliza para entrenar el modelo. - Bucle interno:
Aplica técnicas como la validación cruzada k-fold dentro del conjunto de entrenamiento definido por el bucle externo. Aquí, se prueban múltiples configuraciones de hiperparámetros, dividiendo el conjunto de entrenamiento en k partes, entrenando con k-1 y validando con la restante.
El objetivo de este bucle es seleccionar la mejor configuración del modelo basándose en su rendimiento promedio. - Estimación del rendimiento final:
Tras completar ambos bucles, se obtiene una evaluación más fiable del modelo, considerando la variabilidad de los conjuntos de datos y las configuraciones probadas.
¿Por qué usar validación cruzada anidada?
- Evita que la selección de hiperparámetros dependa de una única partición de datos.
- Ofrece resultados más generalizables y ayuda a prevenir el sobreajuste.
- Proporciona una evaluación sólida y confiable del rendimiento del modelo.
Resumen visual del proceso:
- Dividir los datos en k partes.
- En cada iteración del bucle externo:
- Utilizar una parte como prueba, el resto como entrenamiento.
- Dentro del conjunto de entrenamiento, aplicar validación cruzada interna para ajustar hiperparámetros.
- Obtener la media de los rendimientos de los k modelos para estimar el rendimiento final.
Ejemplo de validación cruzada anidada
La validación cruzada anidada se utiliza cuando se necesita ajustar hiperparámetros y, al mismo tiempo, evaluar el rendimiento del modelo de manera imparcial. Consiste en tener dos niveles de validación cruzada:
- Capa interna: Para la selección y ajuste de hiperparámetros.
- Capa externa: Para evaluar el rendimiento general del modelo.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold
import numpy as np
def getDatos():
# Cargamos el dataset de las flores
X, y = load_iris(return_X_y=True)
return X,y
def getModelo():
# Definimos el modelo
modelo = DecisionTreeClassifier(random_state=1)
return modelo
def getValidaciónCruzadaInterna(modelo):
# Definimos la cuadrícula de hiperparámetros
param_grid =
# Configuramos la validación cruzada interna
cv_interno = StratifiedKFold(n_splits=3, shuffle=True, random_state=1)
grid_search = GridSearchCV(estimator=modelo,
param_grid=param_grid,
scoring='accuracy',
cv=cv_interno)
return grid_search
def getValidaciónCruzadaExterna(grid_search,X, y):
# Configuramos la validación cruzada externa
cv_externo = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)
nested_scores = cross_val_score(grid_search, X, y,
scoring='accuracy',
cv=cv_externo)
return nested_scores
def imprimirResultados(nested_scores):
# Mostrar los resultados
print(f'Precisión media de la validación cruzada anidada: ')
print(f'Precisión en cada fold externo: ')
print(f'Dispersión (desviación estándar): ')
X,y= getDatos()
modelo = getModelo()
grid_search = getValidaciónCruzadaInterna(modelo)
nested_scores = getValidaciónCruzadaExterna(grid_search,X, y)
imprimirResultados(nested_scores)
Precisión media de la validación cruzada anidada: 0.947
Precisión en cada fold externo: [0.93333333 1. 0.93333333 0.96666667 0.9 ]
Dispersión (desviación estándar): 0.034
Descripción del código
Preparación de los datos
Comenzamos cargando el dataset Iris, que contiene características de diferentes tipos de flores. Este conjunto de datos es ideal para entender cómo funciona la validación cruzada anidada, ya que permite visualizar fácilmente las particiones de los datos
from sklearn.datasets import load_iris
def getDatos():
X, y = load_iris(return_X_y=True)
return X, y
Definición del modelo
Utilizamos un árbol de decisión como modelo base. Este clasificador es sencillo y efectivo para este tipo de problemas.
from sklearn.tree import DecisionTreeClassifier
def getModelo():
modelo = DecisionTreeClassifier(random_state=1)
return modelo
Configuración de la validación cruzada interna
La validación cruzada interna se encarga de buscar la mejor combinación de hiperparámetros mediante una búsqueda por cuadrícula (GridSearchCV). En este caso, se exploran diferentes profundidades del árbol.
from sklearn.model_selection import GridSearchCV, StratifiedKFold
def getValidaciónCruzadaInterna(modelo):
param_grid =
cv_interno = StratifiedKFold(n_splits=3, shuffle=True, random_state=1)
grid_search = GridSearchCV(estimator=modelo,
param_grid=param_grid,
scoring='accuracy',
cv=cv_interno)
return grid_search
Configuración de la validación cruzada externa
La validación cruzada externa evalúa el rendimiento real del modelo con los hiperparámetros optimizados, asegurando una estimación fiable y evitando que los resultados estén influidos por el proceso de selección interna
from sklearn.model_selection import cross_val_score
def getValidaciónCruzadaExterna(grid_search, X, y):
cv_externo = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)
nested_scores = cross_val_score(grid_search, X, y,
scoring='accuracy',
cv=cv_externo)
return nested_scores
Visualización de los resultados
Finalmente, imprimimos la precisión media, los resultados por fold externo y la dispersión de las puntuaciones, lo que nos da una visión clara del rendimiento del modelo.
import numpy as np
def imprimirResultados(nested_scores):
print(f'Precisión media de la validación cruzada anidada: ')
print(f'Precisión en cada fold externo: ')
print(f'Dispersión (desviación estándar): ')
Ejecución del flujo completo
Ejecutamos todas las funciones para obtener la evaluación completa de nuestro modelo con validación cruzada anidada.
X, y = getDatos() modelo = getModelo() grid_search = getValidaciónCruzadaInterna(modelo) nested_scores = getValidaciónCruzadaExterna(grid_search, X, y) imprimirResultados(nested_scores)
Conclusión
La validación cruzada anidada es una herramienta fundamental para evaluar modelos de machine learning de manera robusta y evitar el sobreajuste durante la optimización de hiperparámetros. Este enfoque asegura que la evaluación del modelo sea realista y aplicable a datos que el modelo no ha visto previamente.
Al aplicar este método, obtienemos una estimación de la precisión de nuestro modelo y mejoras en la fiabilidad de las predicciones futuras.


