Evaluación y ajuste de modelos Sklearn

La evaluación y el ajuste de los modelos de aprendizaje automático son pasos clave para garantizar la capacidad de generalización y la precisión de predicción del modelo.

Mediante métricas de evaluación y métodos de ajuste adecuados, se puede mejorar eficazmente el rendimiento del modelo y evitar el riesgo de sobreajuste o subajuste.

Este capítulo presentará en detalle la validación cruzada, la búsqueda en cuadrícula, la búsqueda aleatoria, los métodos de evaluación de modelos, etc.


1. Validación cruzada

Introducción al concepto de validación cruzada

La validación cruzada (Cross-Validation) es una técnica utilizada para evaluar el rendimiento del modelo. Divide el conjunto de datos en múltiples subconjuntos (pliegues) y entrena y prueba el modelo varias veces para obtener resultados de evaluación más estables y confiables.

La validación cruzada ayuda a detectar si el modelo está sobreajustado y permite evaluar con mayor precisión la capacidad de generalización del modelo.

Los métodos de validación cruzada más comunes incluyen:

  • Validación cruzada K-fold: Divida los datos en K pliegues, seleccione sucesivamente un pliegue como conjunto de prueba y los otros K-1 pliegues como conjunto de entrenamiento, repita K veces y finalmente calcule el promedio de los resultados de K veces.
  • Validación cruzada de dejar uno fuera (Leave-One-Out Cross-Validation, LOOCV): Cada vez se conserva un solo punto de datos como conjunto de prueba y el resto como conjunto de entrenamiento. Este método consume mucho tiempo, pero puede usarse en conjuntos de datos pequeños.
  • Validación cruzada K-fold estratificada: En K-fold, se asegura que la distribución de clases en cada pliegue sea similar a la del conjunto de datos completo; es adecuado para casos de desequilibrio de clases.

scikit-learn proporciona varios métodos de validación cruzada, como cross_val_score y cross_val_predict, que pueden ayudarnos a realizar una validación cruzada de manera eficiente.

Usar cross_val_score para realizar validación cruzada K-fold

La función cross_val_score se utiliza para realizar validación cruzada K-fold y devuelve los resultados de puntuación de cada pliegue, ayudándonos a evaluar la estabilidad y el rendimiento del modelo.

Usar cross_val_score para realizar validación cruzada K-fold:

Ejemplo

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# Cargar datos
data = load_iris()
X, y = data.data, data.target

# Crear modelo
model = RandomForestClassifier()

# Realizar validación cruzada K-fold
scores = cross_val_score(model, X, y, cv=5)  # Validación cruzada de 5 pliegues
print(f"Cross-validation scores: {scores}")
print(f"Mean accuracy: {scores.mean()}")
  • cv=5: Indica que se realiza una validación cruzada de 5 pliegues.
  • scores: Devuelve la puntuación de cada pliegue; el resultado final es el promedio de estas puntuaciones, lo que representa el rendimiento del modelo.

La salida es la siguiente:

Cross-validation scores: [0.96666667 0.96666667 0.93333333 0.96666667 1.        ]
Mean accuracy: 0.9666666666666668

2. Búsqueda en cuadrícula y búsqueda aleatoria

Usar GridSearchCV para el ajuste de hiperparámetros

GridSearchCV es una técnica que encuentra los mejores hiperparámetros mediante una búsqueda exhaustiva de todas las combinaciones de hiperparámetros.

GridSearchCV calcula el rendimiento de cada combinación proporcionando un conjunto de valores candidatos de parámetros y, finalmente, selecciona la mejor combinación de parámetros.

Parámetros comunes de GridSearchCV:

  • param_grid: La cuadrícula de hiperparámetros a ajustar; normalmente es un diccionario, donde las claves son los nombres de los parámetros y los valores son los valores candidatos de los parámetros.
  • cv: El número de pliegues para la validación cruzada, normalmente se establece en 5 o 10.

Ejemplo de uso de GridSearchCV en scikit-learn:

Ejemplo

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris

# Cargar datos
data = load_iris()
X, y = data.data, data.target

# Crear modelo
model = SVC()

# Definir la cuadrícula de hiperparámetros
param_grid = {'kernel': ['linear', 'rbf'], 'C': [1, 10, 100]}

# Realizar búsqueda en cuadrícula
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X, y)

# Mostrar los mejores parámetros y la mejor puntuación
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")
  • grid_search.best_params_: Devuelve la mejor combinación de hiperparámetros en la búsqueda en cuadrícula.
  • grid_search.best_score_: Devuelve la puntuación de validación cruzada con la mejor combinación de parámetros.

La salida es la siguiente:

Best parameters: {'C': 1, 'kernel': 'linear'}
Best score: 0.9800000000000001

Usar RandomizedSearchCV para acelerar el proceso de ajuste

RandomizedSearchCV es un método más eficiente de ajuste de hiperparámetros. Evalúa una cantidad determinada de combinaciones seleccionadas aleatoriamente del espacio de hiperparámetros, acelerando así el proceso de ajuste.

RandomizedSearchCV es adecuado cuando el espacio de hiperparámetros es grande, y puede ahorrar tiempo de cálculo.

Parámetros comunes de RandomizedSearchCV:

  • param_distributions: La distribución de hiperparámetros a ajustar; normalmente es un diccionario, y los valores pueden ser objetos de distribución (comoscipy.statslas distribuciones de scipy.stats) o listas de valores discretos.
  • n_iter: El número de iteraciones de la búsqueda aleatoria, es decir, la cantidad de combinaciones de hiperparámetros seleccionadas aleatoriamente.

Ejemplo de uso de RandomizedSearchCV en scikit-learn:

Ejemplo

from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from scipy.stats import uniform

# Cargar datos
data = load_iris()
X, y = data.data, data.target

# Crear modelo
model = SVC()

# Definir la distribución de hiperparámetros
param_distributions = {'C': uniform(0, 10), 'kernel': ['linear', 'rbf']}

# Realizar búsqueda aleatoria
random_search = RandomizedSearchCV(model, param_distributions, n_iter=10, cv=5)
random_search.fit(X, y)

# Mostrar los mejores parámetros y la mejor puntuación
print(f"Best parameters: {random_search.best_params_}")
print(f"Best score: {random_search.best_score_}")
  • random_search.best_params_: Devuelve la mejor combinación de hiperparámetros en la búsqueda aleatoria.
  • random_search.best_score_: Devuelve la puntuación de validación cruzada con la mejor combinación de parámetros.

La salida es la siguiente:

Best parameters: {'C': 8.355688344706016, 'kernel': 'rbf'}
Best score: 0.9866666666666667

3. Evaluación del modelo

Usar classification_report, confusion_matrix, roc_auc_score

Para los modelos de clasificación, normalmente usamos métricas como precisión, exhaustividad (recall) y puntuación F1 para evaluar el rendimiento del modelo.

scikit-learn proporciona muchas herramientas de evaluación que nos ayudan a comprender en profundidad el rendimiento del modelo.

classification_report- Proporciona información como precisión, exhaustividad, puntuación F1 y soporte (número de muestras de cada clase).

Ejemplo

from sklearn.metrics import classification_report

# Supongamos que y_test son las etiquetas reales y y_pred son los resultados de predicción del modelo
print(classification_report(y_test, y_pred))

confusion_matrix- La matriz de confusión se utiliza para mostrar el rendimiento del modelo de clasificación en cada clase, especialmente cómo se predice la clase positiva como negativa y viceversa.

Ejemplo

from sklearn.metrics import confusion_matrix

# Supongamos que y_test son las etiquetas reales y y_pred son los resultados de predicción del modelo
print(confusion_matrix(y_test, y_pred))

roc_auc_score- ROC AUC (área bajo la curva característica operativa del receptor) es una métrica para evaluar el rendimiento de los modelos de clasificación, especialmente adecuada para conjuntos de datos desequilibrados. Cuanto mayor sea el valor de AUC, mejor será el rendimiento del modelo.

Ejemplo

from sklearn.metrics import roc_auc_score

# Supongamos que y_test son las etiquetas reales y y_pred_proba son los valores de probabilidad predichos por el modelo
print(f"ROC AUC Score: {roc_auc_score(y_test, y_pred_proba)}")

Evaluación del modelo de regresión: mean_squared_error, r2_score

Para problemas de regresión, las métricas de evaluación comunes incluyen el error cuadrático medio (MSE) y el coeficiente de determinación (R²).

mean_squared_error- El error cuadrático medio es un criterio de evaluación común para modelos de regresión; calcula la media de los errores al cuadrado entre los valores predichos y los valores reales.

Ejemplo

from sklearn.metrics import mean_squared_error

# Supongamos que y_test son los valores reales y y_pred son los valores predichos
print(f"Mean Squared Error: {mean_squared_error(y_test, y_pred)}")

r2_score- El coeficiente de determinación R² se utiliza para medir el grado de ajuste del modelo a los datos; cuanto más cercano a 1, mejor es el ajuste del modelo.

Ejemplo

from sklearn.metrics import r2_score

# Supongamos que y_test son los valores reales y y_pred son los valores predichos
print(f"R² Score: {r2_score(y_test, y_pred)}")
Otras extensiones