近傍点のキャッシング

Beginner

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

はじめに

この実験では、KNeighborsClassifier で使用する前に k 近傍点を事前計算する方法を示します。KNeighborsClassifier は内部的に近傍点を計算できますが、事前計算することにはいくつかの利点があります。たとえば、より細かいパラメータ制御、複数回の使用に対するキャッシング、またはカスタム実装などです。ここでは、パイプラインのキャッシング機能を使用して、KNeighborsClassifier の複数回のフィット間で近傍点グラフをキャッシュします。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、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 を使って近傍点グラフを計算します。

## この変換器は、グリッドサーチで必要な最大数の近傍点を使って近傍点グラフを計算します。
## 分類器モデルは、独自の n_neighbors パラメータに応じて近傍点グラフをフィルタリングします。
graph_model = KNeighborsTransformer(n_neighbors=max(n_neighbors_list), mode="distance")

分類器モデルの定義

このステップでは、KNeighborsClassifier モデルを定義します。

classifier_model = KNeighborsClassifier(metric="precomputed")

近傍点グラフのキャッシュ

このステップでは、パイプラインのキャッシング機能を使って、KNeighborsClassifier の複数回のフィット間で近傍点グラフをキャッシュします。

## 分類器のハイパーパラメータを調整する際に何度も使用されるグラフ計算をキャッシュするために、
## `memory` にグラフ計算をキャッシュするディレクトリを指定しています。
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)

結果の可視化

このステップでは、グリッドサーチの結果を可視化します。

## グリッドサーチの結果をプロットします。
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()

まとめ

この実験では、パイプラインのキャッシング機能を使って、KNeighborsClassifier で k 近傍点を使用する前に事前計算する方法を学びました。また、GridSearchCV を使って分類器のハイパーパラメータをチューニングし、結果を可視化する方法も学びました。