PythonにおけるK-最近傍法(KNN)
K近傍法(kNN)は、分類および回帰タスクの両方を扱うことができる監視学習技術です。私はKNNを実生活に由来するアルゴリズムと見なしています。人々は周囲の人々から影響を受ける傾向があります。
K最近傍アルゴリズムの背後にあるアイデア
私たちの行動は、私たちが育った仲間によって形作られます。私たちの親も様々な方法で私たちの性格を形成します。もしあなたがスポーツを楽しむ人々の中で育ったなら、スポーツを愛するようになる可能性が非常に高いです。もちろん例外もあります。KNNも同様に機能します。
- 親しい友達がいて、その人とほとんどの時間を過ごすと、似たような趣味を持ち、同じものを愛するようになります。それがk=1のkNNです。
- もしあなたが常に5人のグループと一緒にいるなら、そのグループの各メンバーはあなたの行動に影響を与え、最終的には5人の平均のようになってしまいます。それがk=5のkNNです。
kNN分類器は、データポイントのクラスを多数決の原則を用いて特定します。kが5に設定されている場合、5つの最も近いポイントのクラスが調査されます。予測は優勢なクラスに従って行われます。同様に、kNN回帰は5つの最も近い地点の平均値を取ります。
近くにいる人々を目の当たりにしますが、データポイントがどのように近いと見なされるかについてはどうでしょうか?データポイント間の距離が測定されます。距離を推定するためのさまざまな技術があります。ユークリッド距離(p=2のミンコフスキー距離)は、最も一般的に使用される距離測定法の一つです。以下のグラフィックは、2次元空間内の2つの点間のユークリッド距離を計算する方法を説明しています。これは、位置のx座標とy座標の差の二乗を使用して決定されます。
PythonにおけるKNNアルゴリズムの実装
それでは、PythonでのKNNの実装に入っていきましょう。コードを分解して理解しやすくするための手順を説明します。
1. モジュールのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
2. データセットの作成
Scikit-learnには合成データセットを作成するための多くのツールがあり、これは機械学習アルゴリズムのテストに非常に適しています。私はmake blobsメソッドを利用するつもりです。
X, y = make_blobs(n_samples = 500, n_features = 2, centers = 4,cluster_std = 1.5, random_state = 4)
このコードは、2つの特徴を持つ4つのクラスに分かれた500サンプルのデータセットを生成します。関連するパラメータを使用することで、サンプル数、特徴、およびクラスの数を簡単に変更できます。また、各クラス(またはクラスタ)の分布を変更することもできます。
3. データセットを視覚化する
plt.style.use('seaborn')
plt.figure(figsize = (10,10))
plt.scatter(X[:,0], X[:,1], c=y, marker= '*',s=100,edgecolors='black')
plt.show()
4. データをトレーニングデータセットとテストデータセットに分割する
すべての監視付き機械学習手法において、データセットを訓練セットとテストセットに分割することは重要です。まずモデルを訓練し、その後、データセットのさまざまな部分でテストします。データを分けないと、モデルがすでに知っているデータでテストしていることになります。train_test_splitメソッドを使用することで、テストを簡単に分けることができます。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
トレインサイズとテストサイズのオプションを使用することで、元のデータのうち、トレインセットとテストセットそれぞれにどれだけ利用されるかを決定できます。デフォルトの分離は、トレインセットが75%、テストセットが25%です。
5. KNN分類器の実装
その後、kNN分類器オブジェクトを作成します。k値が1と5の2つの分類器を開発し、k値の重要性を示します。モデルはトレインセットを使ってトレーニングされます。k値はn_neighbors引数を使って選択されます。デフォルト値が5であるため、明示的に指定する必要はありません。
knn5 = KNeighborsClassifier(n_neighbors = 5)
knn1 = KNeighborsClassifier(n_neighbors=1)
6. KNN分類器の予測
次に、テストセットでターゲット値を予測し、それを実際の値と比較します。
knn5.fit(X_train, y_train)
knn1.fit(X_train, y_train)
y_pred_5 = knn5.predict(X_test)
y_pred_1 = knn1.predict(X_test)
7. 両方のk値に対して予測精度を算出する
from sklearn.metrics import accuracy_score
print("Accuracy with k=5", accuracy_score(y_test, y_pred_5)*100)
print("Accuracy with k=1", accuracy_score(y_test, y_pred_1)*100)
kの値の正確さは次のようになります:
Accuracy with k=5 93.60000000000001
Accuracy with k=1 90.4
8. 予測の視覚化
k=5 と k=1 の予測値とテストセットを見て、k 値の影響を確認しましょう。
plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_5, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=5", fontsize=20)
plt.subplot(1,2,2)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_1, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=1", fontsize=20)
plt.show()
KNNを実装するための最適なk値を見つける方法
- k=1: モデルは狭すぎて、適切に一般化されていません。また、ノイズへの感度が高いです。このモデルは訓練セットにおいて新しい未知のデータポイントを高い精度で予測しますが、新鮮で以前には見たことがないデータポイントに対しては良い予測者ではありません。その結果、私たちは過剰適合したモデルを持っている可能性が高いです。
- k=100:このモデルは、トレーニングセットとテストセットの両方で過度に広範で信頼性がありません。アンダーフィッティングはこの状況を指す用語です。
KNNアルゴリズムの限界
KNNは理解しやすいアルゴリズムです。それは予測を生成するために内部の機械学習モデルに依存していません。KNNは分類手法で、機能するために必要なのはカテゴリの数だけです(1つ以上)。これは、新しいカテゴリを追加すべきかどうかを迅速に評価できることを意味し、他にいくつのカテゴリがあるかを知る必要はありません。
この単純さの欠点は、新しい病気などの異常事態を予測できないことであり、KNNは健康な集団における希少な項目の普及率を知らないため、それを達成することができません。
KNNはテストセットで高い精度を達成しますが、時間とメモリの観点から遅くてコストがかかります。予測のために全トレーニングデータセットを保存するためには、大量のメモリが必要です。さらに、ユークリッド距離は大きさに非常に敏感なため、大きな大きさを持つデータセットの特徴が、小さな大きさを持つものを常に上回ります。
最後に、これまでに議論したすべてを考慮すると、KNNは高次元のデータセットには理想的ではないことを念頭に置くべきです。
結論
さて、KNNアルゴリズムについてより良い理解が得られたことを願っています。私たちは、KNNが予測を生成するために完全なデータセットをどのように保存するかについて、さまざまなアイデアを見てきました。
KNNは、予測を行うために学習モデルを使用しないいくつかのラザイ学習アルゴリズムの一つです。KNNは、到着した観察データと既存のデータとの類似性を平均化することによって、リアルタイムで予測を生成します。
読んでくれてありがとう!



