En aprendizaje automático uno de los mayores desafíos es entrenar modelos que funcionen bien sobre datos nuevos. Evitando que el sobreajuste que un modelo es bueno cuando en realidad solo está memorizado las predicciones. En este punto es cuando entra en juego la técnica de la validación cruzada. En esta entrada, se explicará por qué la validación cruzada es importante, y cómo usarla para seleccionar la profundidad óptima de un árbol de decisión con un ejemplo práctico en Python.
Tabla de contenidos
La validación cruzada es una técnica para evaluar la capacidad predictiva de un modelo y garantizar que su rendimiento sea robusto y generalizable. Evitando problemas de sobreajuste. En lugar de entrenar el modelo con un único conjunto de datos y validarlo con otro, la validación cruzada divide los datos en múltiples partes (o ”folds”) y realiza múltiples rondas de entrenamiento y validación. Permitiendo de esta manera comprobar si los resultados son estables con los datos.
Asumamos que se cuenta con un conjunto de datos para el entrenamiento de un modelo. Al usar validación cruzada, este conjunto de datos se divide en varias partes iguales, conocidas como ”folds”. Usando cada fold para validar el modelo entrenado con el resto de los folds. Repitiendo el proceso tantas veces como folds se hayan creado. El rendimiento esperado del modelo es el promedio a lo largo de todas estas iteraciones.
Por ejemplo, en una validación cruzada con 5 folds:
La validación cruzada es una herramienta esencial para el entrenamiento de modelos de aprendizaje automático porque:
El uso de la validación cruzada ofrece múltiples ventajas para los modelos que se entrenan con esta técnica. Aunque también tiene algunos problemas.
Antes de profundizar en la implementación del modelo mediante validación cruzada, es necesario contar con un conjunto de datos. Para ello, se puede crear un conjunto de datos sintético con make_classification de scikit-learn como se muestra a continuación:
from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # Generar un conjunto de datos sintético X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=5, random_state=42) # Dividir el conjunto de datos en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
En donde:
# Generar un conjunto de datos sintético X, y = make_classification(n_samples=1000, n_features=20, n_informative=10, n_redundant=5, random_state=42)
# Dividir el conjunto de datos en entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
Ahora, se puede analizar cómo usar la validación cruzada para seleccionar la profundidad óptima de un árbol de decisión. Lo que se puede conseguir con el siguiente código
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score
# Definimos las profundidades posibles del árbol de decisión
profundidades = [1, 2, 3, 5, 7, 9, 11, 13, 15]
# Para almacenar las precisiones medias de validación cruzada
mean_scores = []
# Iteramos sobre las profundidades y realizamos validación cruzada para cada una
for profundidad in profundidades:
# Creamos el clasificador de árbol de decisión con la profundidad actual
clf = DecisionTreeClassifier(max_depth=profundidad, random_state=42)
# Realizamos validación cruzada con 5 folds
scores = cross_val_score(clf, X_train, y_train, cv=5)
# Calculamos la precisión media y la almacenamos
mean_scores.append(scores.mean())
# Encontramos la profundidad óptima que maximiza la precisión media
optimal_depth = profundidades[np.argmax(mean_scores)]
print(f"La profundidad óptima es: {optimal_depth}")
# Entrenamos el modelo con la profundidad óptima usando todos los datos de entrenamiento
clf_optimal = DecisionTreeClassifier(max_depth=optimal_depth, random_state=42)
clf_optimal.fit(X_train, y_train)
# Evaluamos la precisión en el conjunto de entrenamiento
train_accuracy = accuracy_score(y_train, clf_optimal.predict(X_train))
print(f"Precisión en el conjunto de entrenamiento: {train_accuracy:.4f}")
# Evaluamos la precisión en el conjunto de prueba
val_accuracy = accuracy_score(y_test, clf_optimal.predict(X_test))
print(f"Precisión en el conjunto de prueba: {val_accuracy:.4f}") Si se ejecuta este código, se obtiene como resultado
La profundidad óptima es: 9
Precisión en el conjunto de entrenamiento: 0.9900
Precisión en el conjunto de prueba: 0.8133
Lo que indica que el mejor modelo, para el conjunto de datos, es aquel que se entrena con una profundidad de 9. Los detalles de este código se explican a continuación:
# Definimos las profundidades posibles del árbol de decisión profundidades = [1, 2, 3, 5, 7, 9, 11, 13, 15]
# Para almacenar las precisiones medias de validación cruzada mean_scores = []
cross_val_score(). La precisión media se calcula y se almacena en mean_scores.# Iteramos sobre las profundidades y realizamos validación cruzada para cada una
for profundidad in profundidades:
# Creamos el clasificador de árbol de decisión con la profundidad actual
clf = DecisionTreeClassifier(max_depth=profundidad, random_state=42)
# Realizamos validación cruzada con 5 folds
scores = cross_val_score(clf, X_train, y_train, cv=5)
# Calculamos la precisión media y la almacenamos
mean_scores.append(scores.mean()) np.argmax(mean_scores).# Encontramos la profundidad óptima que maximiza la precisión media
optimal_depth = profundidades[np.argmax(mean_scores)]
print(f"La profundidad óptima es: {optimal_depth}") # Entrenamos el modelo con la profundidad óptima usando todos los datos de entrenamiento clf_optimal = DecisionTreeClassifier(max_depth=optimal_depth, random_state=42) clf_optimal.fit(X_train, y_train)
# Evaluamos la precisión en el conjunto de entrenamiento
train_accuracy = accuracy_score(y_train, clf_optimal.predict(X_train))
print(f"Precisión en el conjunto de entrenamiento: {train_accuracy:.4f}")
# Evaluamos la precisión en el conjunto de prueba
val_accuracy = accuracy_score(y_test, clf_optimal.predict(X_test))
print(f"Precisión en el conjunto de prueba: {val_accuracy:.4f}") La validación cruzada es una herramienta clave para entrenar los modelos de aprendizaje automático. Ofreciendo una mejor estimación del rendimiento de estos en condiciones reales. En esta entrada, se ha visto cómo funciona la validación cruzada, por qué es importante y cómo implementarla en Python para seleccionar la profundidad óptima de un árbol de decisión. Al utilizar esta técnica, se garantiza que los modelos obtenidos sean robustos y capaces de generalizar bien a datos nuevos.
En esta entrada, la función empleada para realizar validación cruzada es cross_val_score, aunque en Scikit-learn también se pueden usar las clases clases GridSearchCV y RandomizedSearchCV.
Imagen de jacqueline macou en Pixabay
En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…
En la serie Creación de una API REST con Express y TypeScript construimos una API…
Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…
En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…
Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…
En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…
This website uses cookies.