K 最近傍分類、分類: 教師あり機械学習

王林
リリース: 2024-07-19 14:58:38
オリジナル
839 人が閲覧しました

k 最近傍分類

定義と目的

k-最近傍 (k-NN) 分類は、特徴空間内の最近傍のクラスに基づいてデータ ポイントを分類するために機械学習で使用されるノンパラメトリックなインスタンスベースの学習アルゴリズムです。 。 k 個の最近傍のクラスを考慮して、データ ポイントにクラスを割り当てます。 k-NN 分類の主な目的は、既存のラベル付きデータとの類似性を利用して、新しいデータ ポイントのクラスを予測することです。

主な目的:

  • 分類: 多数決または最近傍の加重投票に基づいて、事前定義されたクラスの 1 つに新しいデータ ポイントを割り当てます。
  • 推定: データ ポイントが特定のクラスに属する可能性を決定します。
  • 関係を理解する: 特徴空間内でどのデータ ポイントが類似しているかを特定します。

k-NN 分類の仕組み

1.距離メトリック: アルゴリズムは距離メトリック (通常はユークリッド距離) を使用して、データ ポイントの「近さ」を判断します。

  • ユークリッド距離:
    • d(p, q) = sqrt((p1 - q1)^2 + (p2 - q2)^2 + ... + (pn - qn)^2)
    • n 次元空間内の 2 点 p と q の間の直線距離を測定します。

2. k の選択: パラメーター k は、分類の決定を行うために考慮する最近傍の数を指定します。

  • 小さい k: モデルがトレーニング データに対して敏感すぎるため、過学習が発生する可能性があります。
  • k が大きい: モデルが一般化されすぎて、データ内のより細かいパターンが見逃される可能性があるアンダーフィッティングにつながる可能性があります。

3.多数決: 新しいデータ ポイントの予測クラスは、その k 個の最近傍の中で最も一般的なクラスです。

  • 多数決:
    • k 個の近傍内の各クラスの出現数を数えます。
    • カウントが最も高いクラスを新しいデータ ポイントに割り当てます。

4.重み付け投票: 場合によっては、隣接するものは距離に応じて重み付けされ、より近い隣接するものほど分類に大きな影響を与えます。

  • 加重投票:
    • 距離の逆数で各近隣住民の投票を重み付けします。
    • 各クラスの加重投票を合計します。
    • 加重合計が最も高いクラスを新しいデータ ポイントに割り当てます。

主要な概念

  1. ノンパラメトリック: k-NN はノンパラメトリック手法であり、データの基礎となる分布について何の仮定も行わないことを意味します。これにより、さまざまな種類のデータを柔軟に処理できるようになります。

  2. インスタンスベースの学習: アルゴリズムはトレーニング データセット全体を保存し、データ内のローカル パターンに基づいて予測を行います。クエリが作成されるまで処理を遅らせるため、「遅延」学習アルゴリズムとしても知られています。

  3. 距離計算: 距離メトリックの選択は、モデルのパフォーマンスに大きな影響を与える可能性があります。一般的なメトリックには、ユークリッド距離、マンハッタン距離、ミンコフスキー距離などがあります。

  4. k の選択: k の値は重要なハイパーパラメーターです。相互検証は、特定のデータセットの k の最適値を決定するためによく使用されます。

k 最近傍 (k-NN) 分類の例

k-最近傍 (k-NN) 分類は、最近傍のクラスに基づいてデータ ポイントを分類するために使用されるノンパラメトリックなインスタンスベースの学習アルゴリズムです。この例では、合成データを使用してマルチクラス分類に k-NN を実装し、モデルのパフォーマンスを評価し、3 つのクラスの決定境界を視覚化する方法を示します。

Python コード例

1.ライブラリをインポート

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
ログイン後にコピー

このブロックは、データ操作、プロット、機械学習に必要なライブラリをインポートします。

2. 3 つのクラスでサンプル データを生成する

np.random.seed(42)  # For reproducibility
n_samples = 300

# Class 0: Cluster at the top-left corner
X0 = np.random.randn(n_samples // 3, 2) * 0.5 + [-2, 2]

# Class 1: Cluster at the top-right corner
X1 = np.random.randn(n_samples // 3, 2) * 0.5 + [2, 2]

# Class 2: Cluster at the bottom-center
X2 = np.random.randn(n_samples // 3, 2) * 0.5 + [0, -2]

# Combine all classes
X = np.vstack((X0, X1, X2))
y = np.array([0] * (n_samples // 3) + [1] * (n_samples // 3) + [2] * (n_samples // 3))
ログイン後にコピー

このブロックは、特徴空間の異なる領域にある 3 つのクラスの合成データを生成します。

3.データセットを分割します

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
ログイン後にコピー

このブロックは、モデル評価のためにデータセットをトレーニング セットとテスト セットに分割します。

4. k-NN 分類器の作成と学習

k = 5  # Number of neighbors
knn_classifier = KNeighborsClassifier(n_neighbors=k)
knn_classifier.fit(X_train, y_train)
ログイン後にコピー

このブロックは、指定された近傍数で k-NN 分類器を初期化し、トレーニング データセットを使用してトレーニングします。

5.予測を立てる

y_pred = knn_classifier.predict(X_test)
ログイン後にコピー

このブロックは、トレーニングされたモデルを使用してテスト セットで予測を行います。

6. Evaluate the Model

accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
print("\nClassification Report:")
print(classification_report(y_test, y_pred))
ログイン後にコピー

Output:

Accuracy: 1.00

Classification Report:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        22
           1       1.00      1.00      1.00        16
           2       1.00      1.00      1.00        22

    accuracy                           1.00        60
   macro avg       1.00      1.00      1.00        60
weighted avg       1.00      1.00      1.00        60
ログイン後にコピー

This block calculates and prints the accuracy and classification report, providing insights into the model's performance.

7. Visualize the Decision Boundary

h = 0.02  # Step size in the mesh
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

Z = knn_classifier.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure(figsize=(12, 8))
plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.RdYlBu, edgecolors='black')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(f'k-NN Classification (k={k})')
plt.colorbar()
plt.show()
ログイン後にコピー

This block visualizes the decision boundaries created by the k-NN classifier, illustrating how the model separates the three classes in the feature space.

Output:

knn classification

This structured approach demonstrates how to implement and evaluate k-NN for multiclass classification tasks, providing a clear understanding of its capabilities and the effectiveness of visualizing decision boundaries.

以上がK 最近傍分類、分類: 教師あり機械学習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!