見出し画像

Trying Data Science(11): KNN, データの隣探し



1. はじめに


こんにちは、今日はデータ科学の重要なが概念であるKNN(K-Nearest Neighbors)についてまとめます!Python学習中よく聞く概念でしたけど、ちゃんと調べてみましょう!

2.KNNの概念

KNNは分類および回帰問題を解決するために使用されるアルゴリズムの一種です。KNNは、データポイント間の距離を基に、最も近いk個の近隣データポイントを見つけ、予測を行います。

動作原理


与えられた入力データポイントに対して、KNNは最も近いk個の近隣データポイントを見つけます。近隣のクラス(分類)または値(回帰)に基づいて予測を行います。

距離計


KNNは通常、ユークリッド距離やマンハッタン距離などの距離計測方法を使用して、データポイント間の距離を計算します。

ハイパーパラメータK


Kの値は近隣の数を表し、適切なKの値を選択することが重要です。小さいKの値はモデルがノイズに敏感に反応し、大きいKの値はモデルがより滑らかな決定境界を生成します。

KNNの利点

  • シンプルで理解しやすい

  • 非パラメトリックな手法:モデルを事前に仮定しないため、さまざまな種類のデータに適用できます。

  • 多目的:分類と回帰の両方のタスクに適用できる


KNNの欠点

  • 計算コストが高い:すべてのデータポイント間の距離を計算する必要があるため、大規模なデータセットで計算コストが高くなることがあります。

  • データの不均衡に敏感:クラスごとのデータの数が不均衡な場合、予測が偏る可能性があります。

  • 最適なKの選択が難しい:適切なKの値の選択が難しい場合があります。


KNNの使用例

  • 医学:患者の医療記録と特性を基に、類似した患者グループを見つけ、診断や治療に役立てる。

  • 映画の推薦:ユーザーが類似した興味を持つ他のユーザーを見つけ、映画や製品を推薦するのに使用される。

  • 地理情報システム(GIS):地理的データ分析で、位置ベースの検索や分析に活用されます。

  • テキスト分類:文書の分類やスパムフィルタリングなどの自然言語処理タスクで使用されます。


3. 例題実習

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ライブラリのインポート: 必要なライブラリをインポートします。

  • pandas: データを扱うためのライブラリ

  • numpy: 数学的な演算を行うためのライブラリ

  • matplotlib.pyplotおよびseaborn: データの可視化に使用するライブラリ


df = pd.read_csv('KNN_Project_Data')

データの取得: "KNN_Project_Data"というCSVファイルを読み込んで、データフレームdfに保存します。


sns.pairplot(df, hue='TARGET CLASS', palette='coolwarm')

データ探索(Exploratory Data Analysis, EDA): データの構造を理解するために、seabornを使用してペアプロットを作成します。ペアプロットは、各特徴量間の相関関係や分布を視覚化します。



from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(df.drop('TARGET CLASS', axis=1))
scaled_features = scaler.transform(df.drop('TARGET CLASS', axis=1))
df_feat = pd.DataFrame(scaled_features, columns=df.columns[:-1])

変数の標準化: KNN分類モデルは変数のスケールに影響を受けるため、特徴量を標準化するためにStandardScalerを使用します。


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(scaled_features, df['TARGET CLASS'], test_size=0.30)

トレーニングおよびテストデータの分割: データをトレーニングセットとテストセットに分割します。


from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)

KNNモデルの作成: KNN分類モデルを作成します。この例では、初期のK値として1を使用しています。


pred = knn.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(confusion_matrix(y_test, pred))
print(classification_report(y_test, pred))

モデルの評価: モデルのパフォーマンスを評価します。predictメソッドを使用して予測し、混同行列と分類レポートを出力します。


error_rate = []
for i in range(1, 40):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train, y_train)
    pred_i = knn.predict(X_test)
    error_rate.append(np.mean(pred_i != y_test))

K値の選択: 複数のK値に対するエラー率を計算し、エルボー(Elbow)メソッドを使用して最適なK値を選択します。


plt.figure(figsize=(10, 6))
plt.plot(range(1, 40), error_rate, color='blue', linestyle='dashed', marker='o', markerfacecolor='red', markersize=10)
plt.title('Error Rate vs. K Value')
plt.xlabel('K')
plt.ylabel('Error Rate')

エラー率のグラフ: 選択したK値に対するエラー率を可視化します。



knn = KNeighborsClassifier(n_neighbors=30)
knn.fit(X_train, y_train)
pred = knn.predict(X_test)
print('K=30の場合')
print('\n')
print(confusion_matrix(y_test, pred))
print('\n')
print(classification_report(y_test, pred))

最適なK値で再トレーニングおよび評価: 最適なK値を選択し、そのK値でモデルを再トレーニングし、評価します。

WITH K=30


[[114  27]
 [ 31 128]]


              precision    recall  f1-score   support

           0       0.79      0.81      0.80       141
           1       0.83      0.81      0.82       159

    accuracy                           0.81       300
   macro avg       0.81      0.81      0.81       300
weighted avg       0.81      0.81      0.81       300


4.まとめ

今日はK-Nearest Neighbors(KNN)分類モデルを使用してデータを分析および予測する方法を学びました。探索的データ分析(EDA)を行い、データの特徴を視覚化しました。 KNNモデルのトレーニングと評価では、初期のK値を使用してモデルを作成し、その後最適なK値を見つけるためにエラー率を分析しました。エラーレートをプロットしてK値の選択を行い、最終的に最適なK値でモデルを再トレーニングしました。

このプロジェクトを通じて、データの前処理、モデルトレーニング、評価、最適なパラメータの選択など、データ分析の基本的なステップを学びました。KNNモデルを使用することで、分類タスクを効果的に実行できますね! 今後のデータ分析プロジェクトでこれらのスキルを活用していきたいと思います!


エンジニアファーストの会社 株式会社CRE-CO
ソンさん


この記事が気に入ったらサポートをしてみませんか?