Кеширование ближайших соседей

Beginner

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

Введение

В этом практическом занятии показано, как предварительно вычислить k ближайших соседей перед использованием их в KNeighborsClassifier. KNeighborsClassifier может вычислять ближайших соседей внутри себя, но предварительное их вычисление может принести несколько преимуществ, таких как более точный контроль параметров, кеширование для повторного использования или пользовательские реализации. Здесь мы используем свойство кеширования пайплайнов для кеширования графа ближайших соседей между несколькими обучениями KNeighborsClassifier.

Советы по использованию ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем библиотеки

В этом шаге мы импортируем все необходимые библиотеки.

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

Загружаем данные

В этом шаге мы загрузим набор данных цифр из scikit - learn.

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

Вычисляем граф ближайших соседей

В этом шаге мы вычислим граф ближайших соседей с использованием KNeighborsTransformer.

## The transformer computes the nearest neighbors graph using the maximum number
## of neighbors necessary in the grid search. The classifier model filters the
## nearest neighbors graph as required by its own n_neighbors parameter.
graph_model = KNeighborsTransformer(n_neighbors=max(n_neighbors_list), mode="distance")

Определяем модель классификатора

В этом шаге мы определим модель KNeighborsClassifier.

classifier_model = KNeighborsClassifier(metric="precomputed")

Кешируем граф ближайших соседей

В этом шаге мы будем кешировать граф ближайших соседей между несколькими обучениями KNeighborsClassifier с использованием свойства кеширования в пайплайнах.

## Note that we give `memory` a directory to cache the graph computation
## that will be used several times when tuning the hyperparameters of the
## classifier.
with TemporaryDirectory(prefix="sklearn_graph_cache_") as tmpdir:
    full_model = Pipeline(
        steps=[("graph", graph_model), ("classifier", classifier_model)], memory=tmpdir
    )

Настраиваем гиперпараметры

В этом шаге мы настроим гиперпараметры классификатора с использованием GridSearchCV.

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

Визуализируем результаты

В этом шаге мы визуализируем результаты подбора гиперпараметров.

## Plot the results of the grid search.
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="Classification accuracy")
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="Fit time (with caching)")
fig.tight_layout()
plt.show()

Резюме

В этом практическом занятии мы научились предварительно вычислять k ближайших соседей перед их использованием в KNeighborsClassifier с использованием свойства кеширования в пайплайнах. Мы также узнали, как настраивать гиперпараметры классификатора с использованием GridSearchCV и визуализировать результаты.