Sé confiado en tus modelos de Machine Learning con la ayuda de la Validación Cruzada
Confía en tus modelos de Machine Learning con Validación Cruzada
La validación cruzada es una herramienta fundamental para comprobar si tu modelo de aprendizaje automático es lo suficientemente confiable como para funcionar con nuevos datos. Este artículo discutirá la validación cruzada, desde por qué es necesaria hasta cómo realizarla en tus datos.
Sobreajuste
Evaluando el modelo de aprendizaje automático entrenado en los propios datos de entrenamiento es fundamentalmente incorrecto. Si se hace, el modelo solo devolverá los valores que ha aprendido durante el entrenamiento. Esta evaluación siempre dará una precisión del 100% y no proporcionará ninguna idea de qué tan bueno será el modelo entrenado en los nuevos datos. Existe una alta probabilidad de que dicho modelo funcione mal en nuevos datos. Esta condición en la que el modelo funciona con alta precisión en los datos entrenados pero muy mal en nuevos datos se conoce como sobreajuste.
División de datos en datos de entrenamiento y datos de prueba
A menudo, los datos se dividen en dos partes para contrarrestar el problema del sobreajuste y conocer la precisión real del modelo entrenado. Estas dos partes divididas se llaman datos de entrenamiento y datos de prueba. Los datos de prueba son más pequeños en tamaño, aproximadamente del 10% al 20% de los datos originales.
La idea aquí es entrenar los datos en los datos de entrenamiento y luego evaluar el modelo entrenado en los datos de prueba.
- Conoce diferentes medidas de rendimiento para problemas de clasific...
- Explora métricas R2 y R2 ajustado de manera intuitiva
- Prediciendo cambios precancerosos en mujeres de alto riesgo un enfo...
Pero en este enfoque también existe una ligera posibilidad de sobreajuste. Tomemos como ejemplo un algoritmo de máquina de vectores de soporte lineal. El algoritmo de máquina de vectores de soporte tiene un parámetro ‘C’ que se utiliza para la regularización (es decir, aumentar o disminuir las restricciones en el modelo). Uno puede ajustar el valor de ‘C’ para obtener una alta precisión del modelo entrenado en los datos de prueba. Esto, nuevamente, podría conducir al problema del sobreajuste. Un modelo así podría funcionar mal en tiempo real después de implementarse en producción, ya que se ha adaptado para lograr un alto rendimiento en los datos de prueba en la fase de experimentación en lugar de mejorar realmente la precisión.
Para lidiar mejor con el problema del sobreajuste, podemos dividir los datos en tres partes, a saber, datos de entrenamiento, validación y prueba.
División de los datos en datos de entrenamiento, validación y prueba
Dividir los datos en tres partes nos evitaría ajustar el modelo para obtener una alta precisión en la fase de experimentación.
Los datos de entrenamiento serán la parte más grande de la división (aproximadamente el 80% de los datos originales). Los datos de validación y prueba serán aproximadamente el 10% cada uno de los datos originales. Tenga en cuenta que estos porcentajes se dan solo como referencia y se pueden cambiar si se desea.
El modelo de aprendizaje automático se entrenará en los datos de entrenamiento. La evaluación del modelo entrenado se realizará utilizando los datos de validación. Y por último, la predicción en los datos de prueba será nuestra forma de verificar qué tan bien se desempeñará el modelo entrenado en tiempo real.
Incluso si uno intenta ajustar el modelo para obtener una alta precisión en los datos de validación, sabríamos si el modelo entrenado es confiable o no con la ayuda de su rendimiento en los datos de prueba.
Este enfoque tampoco está exento de desventajas.
Estamos dividiendo los datos en tres partes, lo que reduce los datos que podrían haberse utilizado para fines de entrenamiento. Al dividir los datos, estamos perdiendo potencialmente el 20% de los datos.
Otra desventaja de este enfoque es que la precisión del modelo diferirá según las divisiones que se realicen. Es posible que una de las divisiones proporcione una precisión muy buena mientras que otra proporcione una precisión baja.
El método de validación cruzada se utiliza para hacer frente a estos dos inconvenientes en cierta medida.
Validación cruzada
En la validación cruzada, aún necesitamos tener datos de prueba, pero no se necesita datos de validación.
Primero, dividimos los datos originales en datos de entrenamiento y datos de prueba. Y luego, el modelo se entrena en los datos de entrenamiento de la siguiente manera:
- Los datos de entrenamiento se dividen en ‘n’ partes iguales. Nombremos a cada una de las divisiones desde la división 1 hasta la división n.
- El modelo se entrena en cada grupo de ‘n-1’ divisiones posibles. Obtendremos n grupos.
- El modelo entrenado se evalúa utilizando la división restante para cada grupo de (n-1) divisiones.
Tomemos un ejemplo para entender esto más claramente.

Supongamos que dividimos los datos de entrenamiento en 5 partes. Ahora, encontraremos todos los grupos posibles de 4 divisiones. Estos grupos se muestran en el diagrama anterior en color verde. Y la última división restante para cada grupo de cuatro divisiones está en color azul en el diagrama anterior.
Para la división 1, el modelo se entrena en el grupo (Fold2, Fold3, Fold4, Fold5). Después del entrenamiento, el modelo se evalúa en Fold1.
Para la división 2, el modelo se entrena en el grupo (Fold1, Fold3, Fold4, Fold5). Después del entrenamiento, el modelo se evalúa en Fold2.
Para la división 3, el modelo se entrena en el grupo (Fold1, Fold2, Fold4, Fold5). Después del entrenamiento, el modelo se evalúa en Fold3.
Para la división 4, el modelo se entrena en el grupo (Fold1, Fold2, Fold3, Fold5). Después del entrenamiento, el modelo se evalúa en Fold4.
Para la división 5, el modelo se entrena en el grupo (Fold1, Fold2, Fold3, Fold4). Después del entrenamiento, el modelo se evalúa en Fold5.
Finalmente, promediamos la precisión de todas las divisiones para obtener la precisión final. Esta precisión promedio será nuestro rendimiento de validación. Dado que obtenemos precisión para cada una de las divisiones, también podemos obtener la desviación estándar de estas precisiones.
Luego podemos verificar el rendimiento del modelo entrenado en los parámetros utilizados en la validación cruzada utilizando los datos de prueba para la evaluación final. Llamamos a este rendimiento de precisión de prueba.
Si el rendimiento de validación y el rendimiento de prueba del modelo son buenos y comparables, entonces podemos considerar nuestro modelo confiable para usar en tiempo real.
Realizando validación cruzada en los datos utilizando el método cross_val_score de scikit-learn
Utilicemos el conjunto de datos de flores iris para la demostración.
## Importando las bibliotecas requeridasimport warningswarnings.filterwarnings('ignore')import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_split, cross_val_score, cross_val_predictfrom sklearn.ensemble import RandomForestClassifier## Realizando la carga de datosdata = load_iris()df = pd.DataFrame()df[data.feature_names] = data.datadf['target'] = data.target## Dividiendo los datos en características independientes y dependientesX, y = df.drop('target', axis=1), df['target']## dividiendo los datos en datos de entrenamiento y datos de pruebaX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)## evaluando el modelo del clasificador de bosque aleatorio utilizando validación cruzadarfc = RandomForestClassifier(max_depth=3)cross_validation_score = cross_val_score(rfc, X_train.values, y_train.values, cv=5, scoring = 'accuracy')print(f"La puntuación de validación cruzada del clasificador de bosque aleatorio es {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
Aquí, para el valor ‘cv’ es un número entero. Podemos proporcionar el valor al parámetro ‘cv’ utilizando iteradores de validación cruzada como KFold y StratifiedKFold.
## utilizando el iterador de validación cruzada KFoldfrom sklearn.model_selection import KFoldrfc = RandomForestClassifier(max_depth=3)kf = KFold(n_splits=5)cross_validation_score = cross_val_score(rfc, X_train, y_train, cv=kf, scoring = 'accuracy')print(f"La puntuación de validación cruzada del clasificador de bosque aleatorio es {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
## utilizando el iterador de validación cruzada StratifiedKFoldfrom sklearn.model_selection import StratifiedKFoldrfc = RandomForestClassifier(max_depth=3)skf = StratifiedKFold(n_splits=5)cross_validation_score = cross_val_score(rfc, X_train, y_train, cv=skf, scoring = 'accuracy')print(f"La puntuación de validación cruzada del clasificador de bosque aleatorio es {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
Los datos se dividen en proporciones iguales en datos de entrenamiento y prueba de acuerdo con las clases objetivo cuando usamos el iterador StratifiedKFold.
Incluso podemos descubrir las predicciones utilizando el modelo entrenado mientras realizamos la validación cruzada.
## haciendo predicciones usando cross_val_predictfrom sklearn.model_selection import cross_val_predictrfc = RandomForestClassifier(max_depth=3)cv_predictions = cross_val_predict(rfc, X, y, cv=5)print(f"Las predicciones en los datos de prueba son: {cv_predictions} (forma: {cv_predictions.shape})")
Usando la validación cruzada con las tuberías de scikit-learn
Realizaremos un paso de preprocesamiento en los datos antes de entrenar el modelo en los datos. Creemos una tubería y luego encontremos la puntuación de validación cruzada.
from sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerpipe = Pipeline([ ('standardization', StandardScaler()), ('model', RandomForestClassifier(max_depth=3))])cross_validation_score = cross_val_score(pipe, X_train, y_train, cv=5, scoring = 'accuracy')print(f"La puntuación de validación cruzada del clasificador de bosques aleatorios es {round(cross_validation_score.mean(), 2)} +/- {round(cross_validation_score.std(),2)}.")
Espero que te guste el artículo. Si tienes alguna idea sobre el artículo, por favor avísame. Cualquier comentario constructivo es muy apreciado.Conéctate conmigo en LinkedIn.¡Que tengas un gran día!