TECH I.S.

機械学習 - K 最近傍 (KNN)


KNN

KNNは単純な教師あり機械学習(ML)アルゴリズムで、分類や回帰タスクに使用でき、欠損値の置換でも頻繁に使用される。これは、任意のデータ・ポイントに最も近いオブザベーションが、データ集合の中で最も "類似した "オブザベーションであるという考えに基づいており、したがって、最も近い既存のポイントの値に基づいて、予期しないポイントを分類できる。*K*を選択することで、ユーザーはアルゴリズムで使用する近傍オブザベーションの数を選択できる。

ここでは、分類のためのKNNアルゴリズムの実装方法を示し、*K*の値の違いが結果にどのように影響するかを示します。


それはどのように機能しますか?

*K*は、使用する最近傍の数です。分類では、新しい観測がどのクラスに分類されるかを決定するために多数決が使用されます。*K*の値が大きいほど多くの場合、外れ値に対してより堅牢であり、非常に小さな値よりも安定した決定境界を生成します (*K=3*は、望ましくない結果が生じる可能性がある*K=1*よりも良いだろう。

いくつかのデータポイントを視覚化することから始めます。

import matplotlib.pyplot as plt x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12] y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21] classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1] plt.scatter(x, y, c=classes) plt.show()

結果


実行例 »


広告



ここで、K=1でKNNアルゴリズムを当てはめます。

from sklearn.neighbors import KNeighborsClassifierdata = list(zip(x, y))knn = KNeighborsClassifier(n_neighbors=1)knn.fit(data, classes)

それを使用して、新しいデータ ポイントを分類します。

new_x = 8 new_y = 21 new_point = [(new_x, new_y)] prediction = knn.predict(new_point) plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]]) plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}") plt.show()

結果


実行例 »

次に、同じことを行いますが、予測を変更するより高いK値を使用します。

knn = KNeighborsClassifier(n_neighbors=5) knn.fit(data, classes) prediction = knn.predict(new_point) plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]]) plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}") plt.show()

結果


実行例 »

例の説明

必要なモジュールをインポートします。

Matplotlibモジュールについては、Matplotlibチュートリアルを参照して下さい。

scikit-learnは、Pythonでの機械学習用の一般的なライブラリです。

import matplotlib.pyplot as pltfrom sklearn.neighbors import KNeighborsClassifier

データセット内の変数に似た配列を作成します。 2つの入力機能があります (xy) とターゲット クラス (class)。ターゲットクラスで事前にラベル付けされた入力フィーチャは、新しいデータのクラスを予測するために使用されます。ここでは2つの入力機能のみを使用していますが、このメソッドは任意の数の変数で機能することに注意してください。

x = [4, 5, 10, 4, 3, 11, 14 , 8, 10, 12]y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]classes = [0, 0, 1, 0, 0, 1, 1, 0, 1, 1]

入力特徴を一連のポイントに変換します。

data = list(zip(x, y))print(data)

結果:


[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (8, 22), (10, 21), (12, 21)]

入力機能とターゲットクラスを使用して、1つの最近傍を使用してモデルにKNNモデルを当てはめます。

knn = KNeighborsClassifier(n_neighbors=1)knn.fit(data, classes)

次に、同じKNNオブジェクトを使用して、予期しない新しいデータポイントのクラスを予測できます。まず、新しいxおよびy機能を作成し、次に新しいデータポイントでknn.predict()を呼び出し、0または1のクラスを取得します。

new_x = 8new_y = 21new_point = [(new_x, new_y)]prediction = knn.predict(new_point)print(prediction)

結果:


[0]

すべてのデータを新しいポイントとクラスとともにプロットすると、1 クラスの青色のラベルが付けられていることがわかります。テキスト注釈は、新しい点の位置を強調表示するためのものです。
plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")plt.show()

結果:

ただし、近傍の数を5に変更すると、新しいポイントの分類に使用されるポイントの数が変わります。その結果、新しいポイントの分類も同様に行われます。

knn = KNeighborsClassifier(n_neighbors=5)knn.fit(data, classes)prediction = knn.predict(new_point)print(prediction)

結果:


[1]

古いポイントとともに新しいポイントのクラスをプロットすると、関連するクラスラベルに基づいて色が変更されていることがわかります。

plt.scatter(x + [new_x], y + [new_y], c=classes + [prediction[0]])plt.text(x=new_x-1.7, y=new_y-0.7, s=f"new point, class: {prediction[0]}")plt.show()

結果:




プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細