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.