Machine-learning-with-python-knn-algorithm-finding-nearest-neighbors

提供:Dev Guides
移動先:案内検索

KNNアルゴリズム-最近傍の検索

前書き

K最近傍(KNN)アルゴリズムは、教師付きMLアルゴリズムの一種であり、分類と回帰予測の両方の問題に使用できます。 ただし、主に業界の分類予測問題に使用されます。 次の2つのプロパティはKNNを適切に定義します-

  • 遅延学習アルゴリズム-KNNは、特殊なトレーニングフェーズがなく、分類中のトレーニングにすべてのデータを使用するため、遅延学習アルゴリズムです。
  • ノンパラメトリック学習アルゴリズム-KNNは、基礎データについて何も想定していないため、ノンパラメトリック学習アルゴリズムでもあります。

KNNアルゴリズムの動作

K最近傍(KNN)アルゴリズムは、「特徴の類似性」を使用して新しいデータポイントの値を予測します。これは、新しいデータポイントに、トレーニングセットのポイントとどれだけ一致するかに基づいて値が割り当てられることをさらに意味します。 私たちは次のステップの助けを借りてその動作を理解することができます-

  • ステップ1 *-アルゴリズムを実装するには、データセットが必要です。 そのため、KNNの最初のステップでは、トレーニングデータとテストデータを読み込む必要があります。
  • ステップ2 *-次に、Kの値を選択する必要があります。 最も近いデータポイント。 Kは任意の整数です。
  • ステップ3 *-テストデータの各ポイントについて、以下を実行します-
  • 3.1 -ユークリッド距離、マンハッタン距離、またはハミング距離のいずれかの方法を使用して、テストデータとトレーニングデータの各行の間の距離を計算します。 距離を計算するために最も一般的に使用される方法はユークリッドです。
  • 3.2 -距離値に基づいて、昇順で並べ替えます。
  • 3.3 -次に、ソートされた配列から上位K行を選択します。
  • 3.4 -現在、これらの行の最も頻繁なクラスに基づいて、テストポイントにクラスを割り当てます。
  • ステップ4 *-終了

以下は、Kの概念とKNNアルゴリズムの動作を理解するための例です-

次のようにプロットできるデータセットがあるとします-

Kの概念

ここで、黒い点(ポイント60,60)を持つ新しいデータポイントを青または赤のクラスに分類する必要があります。 K = 3、つまり 3つの最も近いデータポイントが見つかります。 それは次の図に示されています-

KNNアルゴリズム

上の図では、黒い点が付いたデータポイントの3つの最近傍を見ることができます。 これらの3つのうち、2つは赤のクラスにあるため、黒のドットも赤のクラスに割り当てられます。

Pythonでの実装

知っているように、K最近傍(KNN)アルゴリズムは、分類と回帰の両方に使用できます。 以下は、KNNを分類子および回帰変数として使用するPythonのレシピです-

分類子としてのKNN

まず、必要なPythonパッケージのインポートから始めます-

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

次に、次のようにそのウェブリンクから虹彩データセットをダウンロードします-

path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

次に、次のようにデータセットに列名を割り当てる必要があります-

headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

今、私たちは次のようにパンダのデータフレームにデータセットを読み取る必要があります-

dataset = pd.read_csv(path, names = headernames)
dataset.head()
sepal-length sepal-width petal-length petal-width Class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

データの前処理は、次のスクリプト行を使用して行われます。

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

次に、データをトレイン分割とテスト分割に分割します。 次のコードは、データセットを60%のトレーニングデータと40%のテストデータに分割します-

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.40)

次に、データのスケーリングは次のように行われます-

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

次に、次のようにsklearnのKNeighborsClassifierクラスの助けを借りてモデルを訓練します-

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 8)
classifier.fit(X_train, y_train)

最後に、予測を行う必要があります。 それは次のスクリプトの助けを借りて行うことができます-

y_pred = classifier.predict(X_test)

次に、次のように結果を印刷します-

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

出力

Confusion Matrix:
[[Classification Report:
                  precision   recall   f1-score   support
    Iris-setosa        1.00     1.00       1.00        21
Iris-versicolor        0.70     1.00       0.82        16
 Iris-virginica        1.00     0.70       0.82        23
      micro avg        0.88     0.88       0.88        60
      macro avg        0.90     0.90       0.88        60
   weighted avg        0.92     0.88       0.88        60

Accuracy: 0.8833333333333333

リグレッサーとしてのKNN

まず、必要なPythonパッケージのインポートから始めます-

import numpy as np
import pandas as pd

次に、次のようにそのウェブリンクから虹彩データセットをダウンロードします-

path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

次に、次のようにデータセットに列名を割り当てる必要があります-

headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

今、私たちは次のようにパンダのデータフレームにデータセットを読み取る必要があります-

data = pd.read_csv(url, names = headernames)
array = data.values
X = array[:,:2]
Y = array[:,2]
data.shape
output:(150, 5)

次に、モデルに適合するように_sklearn_から_KNeighborsRegressor_をインポートします-

from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors = 10)
knnr.fit(X, y)

最後に、我々は次のようにMSEを見つけることができます-

print ("The MSE is:",format(np.power(y-knnr.predict(X),2).mean()))

出力

The MSE is: 0.12226666666666669

KNNの長所と短所

Pros

  • 理解して解釈するのは非常に簡単なアルゴリズムです。
  • このアルゴリズムにはデータに関する仮定がないため、非線形データには非常に便利です。
  • これは分類と回帰に使用できるため、汎用性の高いアルゴリズムです。
  • 精度は比較的高いですが、KNNよりも優れた教師あり学習モデルがあります。

Cons

  • それはすべてのトレーニングデータを保存するため、計算的に少し高価なアルゴリズムです。
  • 他の教師あり学習アルゴリズムと比較して、高いメモリストレージが必要です。
  • 大きなNの場合、予測は遅くなります。
  • データの規模と無関係な機能に非常に敏感です。

KNNのアプリケーション

以下は、KNNを正常に適用できる領域の一部です-

銀行システム

KNNを銀行システムで使用して、個人がローン承認にふさわしい天気を予測できますか? その個人は、債務不履行者に似た特性を持っていますか?

信用格付けの計算

KNNアルゴリズムを使用して、同様の特性を持つ人と比較することにより、個人の信用格付けを見つけることができます。

政治

KNNアルゴリズムを使用して、有権者を「投票する」、「投票しない」、「党に投票する」「議会」、「党に投票する」「BJP」などのさまざまなクラスに分類できます。

KNNアルゴリズムを使用できる他の領域には、音声認識、手書き検出、画像認識、およびビデオ認識があります。