Cache de Vizinhos Mais Próximos

Beginner

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

Introdução

Este laboratório demonstra como pré-calcular os k vizinhos mais próximos antes de utilizá-los em KNeighborsClassifier. O KNeighborsClassifier pode calcular os vizinhos mais próximos internamente, mas pré-calculá-los pode apresentar várias vantagens, como um controlo mais preciso dos parâmetros, armazenamento em cache para múltiplos usos ou implementações personalizadas. Aqui, utilizamos a propriedade de armazenamento em cache de pipelines para armazenar em cache o grafo dos vizinhos mais próximos entre múltiplas adaptações de KNeighborsClassifier.

Dicas de Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente.

Importar Bibliotecas

Neste passo, iremos importar todas as bibliotecas necessárias.

from tempfile import TemporaryDirectory
import matplotlib.pyplot as plt

from sklearn.neighbors import KNeighborsTransformer, KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_digits
from sklearn.pipeline import Pipeline

Carregar Dados

Neste passo, carregaremos o conjunto de dados de dígitos do scikit-learn.

X, y = load_digits(return_X_y=True)
n_neighbors_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]

Calcular o Grafo dos Vizinhos Mais Próximos

Neste passo, calcularemos o grafo dos vizinhos mais próximos utilizando o KNeighborsTransformer.

## O transformador calcula o grafo dos vizinhos mais próximos utilizando o número máximo de vizinhos necessário na busca em grade. O modelo classificador filtra o grafo dos vizinhos mais próximos conforme necessário pelo seu próprio parâmetro n_neighbors.
graph_model = KNeighborsTransformer(n_neighbors=max(n_neighbors_list), mode="distance")

Definir o Modelo Classificador

Neste passo, definiremos o modelo KNeighborsClassifier.

classifier_model = KNeighborsClassifier(metric="precomputed")

Armazenar em Cache o Grafo dos Vizinhos Mais Próximos

Neste passo, armazenaremos em cache o grafo dos vizinhos mais próximos entre múltiplas execuções do KNeighborsClassifier utilizando a propriedade de armazenamento em cache de pipelines.

## Observe que fornecemos um diretório para `memory` para armazenar em cache o cálculo do grafo, que será usado várias vezes ao ajustar os hiperparâmetros do classificador.
with TemporaryDirectory(prefix="sklearn_graph_cache_") as tmpdir:
    full_model = Pipeline(
        steps=[("graph", graph_model), ("classifier", classifier_model)], memory=tmpdir
    )

Ajustar Hiperparâmetros

Neste passo, ajustaremos os hiperparâmetros do classificador usando GridSearchCV.

    param_grid = {"classifier__n_neighbors": n_neighbors_list}
    grid_model = GridSearchCV(full_model, param_grid)
    grid_model.fit(X, y)

Visualizar Resultados

Neste passo, visualizaremos os resultados da busca em grade.

## Plotar os resultados da busca em grade.
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
axes[0].errorbar(
    x=n_neighbors_list,
    y=grid_model.cv_results_["mean_test_score"],
    yerr=grid_model.cv_results_["std_test_score"],
)
axes[0].set(xlabel="n_neighbors", title="Precisão de Classificação")
axes[1].errorbar(
    x=n_neighbors_list,
    y=grid_model.cv_results_["mean_fit_time"],
    yerr=grid_model.cv_results_["std_fit_time"],
    color="r",
)
axes[1].set(xlabel="n_neighbors", title="Tempo de Ajustamento (com cache)")
fig.tight_layout()
plt.show()

Resumo

Neste laboratório, aprendemos como pré-calcular os k vizinhos mais próximos antes de utilizá-los em KNeighborsClassifier usando a propriedade de cache de pipelines. Também aprendemos a ajustar os hiperparâmetros do classificador usando GridSearchCV e a visualizar os resultados.