Validação Cruzada Aninhada para Seleção de Modelo

Beginner

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

Introdução

A validação cruzada aninhada é uma técnica usada para estimar o erro de generalização de um modelo e seus hiperparâmetros. É especialmente útil na escolha entre diferentes modelos ou quando os hiperparâmetros precisam ser otimizados. Neste tutorial, compararemos a validação cruzada não aninhada e aninhada em um modelo de classificador de vetores de suporte usando o conjunto de dados iris. Também visualizaremos a diferença de desempenho entre os dois métodos.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.

Carregar o Conjunto de Dados

O primeiro passo é carregar o conjunto de dados iris do scikit-learn.

from sklearn.datasets import load_iris

## Carregar o conjunto de dados
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

Definir os Hiperparâmetros

Em seguida, definimos os hiperparâmetros a serem otimizados para o classificador de vetores de suporte. Neste caso, otimizamos o parâmetro de custo C e o coeficiente do kernel gamma.

## Configurar possíveis valores dos parâmetros para otimização
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

Definir o Modelo

Utilizamos um classificador de vetores de suporte com um kernel de função de base radial.

from sklearn.svm import SVC

## Usaremos um Classificador de Vetores de Suporte com kernel "rbf"
svm = SVC(kernel="rbf")

Validação Cruzada Não Aninhada

Utilizamos validação cruzada não aninhada para ajustar os hiperparâmetros e avaliar o desempenho do modelo. A função GridSearchCV realiza uma busca exaustiva sobre valores de parâmetros especificados para um estimador. Usamos uma validação cruzada de 4 dobras.

from sklearn.model_selection import GridSearchCV

## Busca de parâmetros não aninhada e pontuação
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

Validação Cruzada Aninhada

Utilizamos validação cruzada aninhada para estimar o erro de generalização do modelo e seus hiperparâmetros. No loop interno, realizamos uma busca em grade para encontrar os melhores hiperparâmetros para cada conjunto de treinamento. No loop externo, avaliamos o desempenho do modelo no conjunto de teste.

from sklearn.model_selection import KFold, cross_val_score

## Número de ensaios aleatórios
NUM_TRIALS = 30

## Arrays para armazenar as pontuações
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## Loop para cada ensaio
for i in range(NUM_TRIALS):
    ## Escolha de técnicas de validação cruzada para os loops interno e externo,
    ## independentemente do conjunto de dados.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## Validação cruzada aninhada com otimização de parâmetros
    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 os Resultados

Visualizamos os resultados da validação cruzada não aninhada e aninhada usando um gráfico de barras.

from matplotlib import pyplot as plt

## Plotar gráfico de barras da diferença.
plt.bar(["Não Aninhada", "Aninhada"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Pontuação")
plt.title("Pontuações de Validação Cruzada Não Aninhada e Aninhada")
plt.show()

Resumo

A validação cruzada aninhada é uma técnica poderosa para estimar o erro de generalização de um modelo e seus hiperparâmetros. Ela pode ajudar a prevenir o overfitting e garantir que o modelo apresente bom desempenho em novos dados. Neste tutorial, comparamos a validação cruzada não aninhada e aninhada em um modelo de classificador de vetores de suporte usando o conjunto de dados iris. Visualizamos a diferença de desempenho entre os dois métodos usando um gráfico de barras.