Validación cruzada anidada para la selección de modelos

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

La validación cruzada anidada es una técnica utilizada para estimar el error de generalización de un modelo y sus hiperparámetros. Es especialmente útil cuando se debe elegir entre diferentes modelos o cuando se necesitan optimizar los hiperparámetros. En este tutorial, compararemos la validación cruzada no anidada y la anidada en un modelo de clasificador de vectores de soporte utilizando el conjunto de datos iris. También visualizaremos la diferencia en el rendimiento entre los dos métodos.

Consejos para la MV

Después de que la máquina virtual (MV) haya terminado de iniciar, haz clic en la esquina superior izquierda para cambiar a la pestaña Notebook y acceder a Jupyter Notebook para practicar.

A veces, es posible que debas esperar unos segundos para que Jupyter Notebook termine de cargar. Debido a las limitaciones de Jupyter Notebook, la validación de las operaciones no puede automatizarse.

Si encuentras problemas durante el aprendizaje, no dudes en preguntar a Labby. Proporciona comentarios después de la sesión y resolveremos rápidamente el problema para ti.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49227{{"Validación cruzada anidada para la selección de modelos"}} sklearn/model_selection -.-> lab-49227{{"Validación cruzada anidada para la selección de modelos"}} sklearn/datasets -.-> lab-49227{{"Validación cruzada anidada para la selección de modelos"}} ml/sklearn -.-> lab-49227{{"Validación cruzada anidada para la selección de modelos"}} end

Cargar el conjunto de datos

El primer paso es cargar el conjunto de datos iris de scikit-learn.

from sklearn.datasets import load_iris

## Cargar el conjunto de datos
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

Definir los hiperparámetros

A continuación, definimos los hiperparámetros que se optimizarán para el clasificador de vectores de soporte. En este caso, optimizamos el parámetro de costo C y el coeficiente del kernel gamma.

## Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

Definir el modelo

Utilizamos un clasificador de vectores de soporte con un kernel de función de base radial (radial basis function kernel).

from sklearn.svm import SVC

## We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")

Validación cruzada no anidada

Utilizamos la validación cruzada no anidada para ajustar los hiperparámetros y evaluar el rendimiento del modelo. La función GridSearchCV realiza una búsqueda exhaustiva sobre los valores de parámetros especificados para un estimador. Utilizamos una validación cruzada de 4 pliegues (4-fold cross-validation).

from sklearn.model_selection import GridSearchCV

## Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

Validación cruzada anidada

Utilizamos la validación cruzada anidada para estimar el error de generalización del modelo y sus hiperparámetros. En el bucle interno, realizamos una búsqueda en cuadrícula (grid search) para encontrar los mejores hiperparámetros para cada conjunto de entrenamiento. En el bucle externo, evaluamos el rendimiento del modelo en el conjunto de prueba.

from sklearn.model_selection import KFold, cross_val_score

## Number of random trials
NUM_TRIALS = 30

## Arrays to store scores
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## Loop for each trial
for i in range(NUM_TRIALS):
    ## Choose cross-validation techniques for the inner and outer loops,
    ## independently of the dataset.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## Nested CV with parameter optimization
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

Visualizar los resultados

Visualizamos los resultados de la validación cruzada no anidada y anidada utilizando un gráfico de barras.

from matplotlib import pyplot as plt

## Plot bar chart of the difference.
plt.bar(["Non-Nested", "Nested"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Score")
plt.title("Non-Nested and Nested Cross-Validation Scores")
plt.show()

Resumen

La validación cruzada anidada es una técnica poderosa para estimar el error de generalización de un modelo y sus hiperparámetros. Puede ayudar a prevenir el sobreajuste (overfitting) y garantizar que el modelo funcione bien con nuevos datos. En este tutorial, comparamos la validación cruzada no anidada y anidada en un modelo de clasificador de vectores de soporte utilizando el conjunto de datos de iris. Visualizamos la diferencia en el rendimiento entre los dos métodos utilizando un gráfico de barras.