(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo optimizar hiperparámetros con GridSearchCV en Python

João Barros 07 de July de 2026 4 min de lectura

Un hiperparámetro es un ajuste que elegimos antes de entrenar el modelo — por ejemplo, cuántos árboles tiene un Random Forest. Elegir los mejores valores a mano es lento y poco fiable: pruebas uno, cambias otro y enseguida pierdes la cuenta de lo que ya has probado. El GridSearchCV de scikit-learn automatiza este trabajo: prueba varias combinaciones con validación cruzada e indica cuál da el mejor resultado, haciendo el modelo más preciso con poco esfuerzo. A continuación tienes un ejemplo práctico de tuning de hiperparámetros en Python.

Requisitos previos

  • Python 3 con scikit-learn y pandas instalados (pip install scikit-learn pandas).
  • Saber entrenar un modelo sencillo y dividir los datos en entrenamiento y prueba.
  • Un notebook o editor de código (Jupyter, VS Code o equivalente).

Paso 1: Preparar los datos

Para no depender de archivos externos, usamos el dataset Wine que ya viene incluido en scikit-learn — 178 muestras de vinos con 13 características y tres clases. Cargamos los datos y reservamos el 20% para prueba; ese conjunto solo se usará al final, para una evaluación honesta del modelo.

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

X, y = load_wine(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

Paso 2: Definir el modelo y la cuadrícula

La cuadrícula (grid) es un diccionario: cada clave es el nombre de un hiperparámetro y cada valor es la lista de opciones a probar. GridSearchCV probará todas las combinaciones posibles. Aquí usamos un Random Forest y variamos tres ajustes importantes: el número de árboles (n_estimators), la profundidad máxima de cada árbol (max_depth) y el número mínimo de muestras necesario para dividir un nodo (min_samples_split).

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier(random_state=42)

param_grid = {
    "n_estimators": [100, 200, 300],
    "max_depth": [None, 5, 10],
    "min_samples_split": [2, 5],
}
Consejo: empieza con una cuadrícula pequeña. Estas tres listas generan 18 combinaciones (3 × 3 × 2) y, con validación cruzada de 5 particiones, suman 90 entrenamientos. Cuanto mayor sea la cuadrícula, más tardará.

Paso 3: Ejecutar la búsqueda con validación cruzada

Pasamos el modelo y la cuadrícula a GridSearchCV. El parámetro cv=5 divide los datos de entrenamiento en cinco partes y prueba cada combinación en todas ellas, lo que da una estimación mucho más fiable que una única división. Con scoring="accuracy" indicamos que la métrica a maximizar es la precisión (accuracy), y n_jobs=-1 aprovecha todos los núcleos del procesador para acelerar la búsqueda.

from sklearn.model_selection import GridSearchCV

grid = GridSearchCV(
    estimator=model,
    param_grid=param_grid,
    cv=5,
    scoring="accuracy",
    n_jobs=-1,
)

grid.fit(X_train, y_train)

Paso 4: Ver la mejor combinación

Terminado el entrenamiento, GridSearchCV guarda la mejor combinación en best_params_ y la puntuación media de validación cruzada en best_score_. El mejor modelo, ya reajustado con todos los datos de entrenamiento, está disponible en best_estimator_ y puede usarse directamente para predecir.

print("Best hyperparameters:", grid.best_params_)
print("Best CV score:", round(grid.best_score_, 3))

Paso 5: Evaluar en el conjunto de prueba

Por último, medimos el rendimiento del mejor modelo en los datos de prueba que reservamos. Es este valor — y no el de la validación cruzada — el que indica cómo se comporta el modelo ante datos que nunca ha visto.

accuracy = grid.score(X_test, y_test)
print("Test accuracy:", round(accuracy, 3))

Verificar el resultado

Si todo salió bien, verás impresa la mejor combinación de hiperparámetros junto con dos puntuaciones — la de validación cruzada y la de prueba — ambas cercanas entre sí y altas, normalmente por encima de 0,9 en este dataset. Si la precisión en la prueba es mucho menor que la de validación cruzada, puede ser señal de overfitting: prueba a reducir max_depth o a usar más datos. Si ambas son bajas, amplía la cuadrícula con otros valores.

Conclusión

Con unas pocas líneas, has dejado de adivinar hiperparámetros y has empezado a elegirlos con base en datos. A partir de aquí, usa RandomizedSearchCV cuando la cuadrícula sea demasiado grande para probarla por completo, o combina GridSearchCV con un Pipeline para ajustar también el preprocesamiento sin arriesgar fugas de datos. ¿Cuál de los hiperparámetros crees que marcará la mayor diferencia en tu próximo modelo?