k-近傍法は、分類したいデータに似ている既存のデータをk個見て、そのk個のなかで最も多いラベルを多数決的に採用する方法です。似ている似ていないの判断基準が必要ですが、単純なものとしてはデータ間のユークリッド距離を使います。既存のデータが多い場合、最も近いk個を選ぶのに探索が必要で、データ分類に時間がかかります。
以下の図では、?
のデータを分類するために、k=3
個のデータを見ています。△のラベルが2個、□のラベルが1個なので、?
のデータを△と推定します。
scikit-learn を利用してk-近傍法を実装しましょう。k-近傍法の使い方は scikit-learn のページの Examples に書かれています。ノートブックで使えるように転記したものが以下になります。
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))
主に以下の4ステップで構成されています。
上の例を少し書き換えて、前の章で準備した MNIST のデータに k-近傍法を適用してみましょう。 データが変わっているだけなので、学習に使う X, y や推論したい 0.9 や 1.1 を MNISTのものに変えます。 具体的には以下の通りに置き換えます。
※ 0.9 や 1.1 の代わりに、テストデータ X_testの最初の画像 X_test[0] を使います。
書き換えたコードは以下の通りです。
X = X_train
y = y_train
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)
print(neigh.predict([X_test[0]]))
print(neigh.predict_proba([X_test[0]]))
上のコードでは、X_test[0]、つまりテストデータの最初の画像に対する数字を予測しました。これが実際に正しいかを確認するために、最初の画像に対するラベルを表示して比較しましょう。
ヒント: テストデータの最初の画像のラベルは y_test[0] でアクセス可能です。
冒頭の説明で述べたようにk-近傍法は膨大なデータを探索するので予測に時間がかかります。ここでは100枚の画像に対する予測の時間を計測してみましょう。 セルの最初に %%time といれるとそのセルの実行時間を計測することができます。以下では1枚目の画像のみを予測して、その時間を測ります。 Wall time が実行時間に相当します。CPU times は CPU が利用された時間です。
%%time
neigh.predict(X_test[0:100])