>  기사  >  백엔드 개발  >  K 최근접이웃 분류, 분류: 지도 머신러닝

K 최근접이웃 분류, 분류: 지도 머신러닝

王林
王林원래의
2024-07-19 14:58:38829검색

k-최근접이웃 분류

정의 및 목적

k-Nearest Neighbors(k-NN) 분류는 특징 공간에서 가장 가까운 이웃의 클래스를 기반으로 데이터 포인트를 분류하기 위해 기계 학습에 사용되는 비모수적 인스턴스 기반 학습 알고리즘입니다. . k개의 가장 가까운 이웃 클래스를 고려하여 데이터 포인트에 클래스를 할당합니다. k-NN 분류의 주요 목적은 기존 레이블 데이터와의 유사성을 활용하여 새로운 데이터 포인트의 클래스를 예측하는 것입니다.

주요 목표:

  • 분류: 다수결 또는 가장 가까운 이웃의 가중치 투표를 기반으로 사전 정의된 클래스 중 하나에 새 데이터 포인트를 할당합니다.
  • 추정: 데이터 포인트가 특정 클래스에 속할 가능성을 결정합니다.
  • 관계 이해: 특성 공간에서 어떤 데이터 포인트가 유사한지 식별합니다.

k-NN 분류 작동 방식

1. 거리 측정법: 알고리즘은 거리 측정법(일반적으로 유클리드 거리)을 사용하여 데이터 포인트의 "가까움"을 결정합니다.

  • 유클리드 거리:
    • d(p, q) = sqrt((p1 - q1)^2 + (p2 - q2)^2 + ... + (pn - qn)^2)
    • n차원 공간에서 두 점 p와 q 사이의 직선 거리를 측정합니다.

2. k 선택: 매개변수 k는 분류 결정을 내릴 때 고려해야 할 최근접 이웃의 수를 지정합니다.

  • 작은 k: 모델이 훈련 데이터에 너무 민감한 경우 과적합으로 이어질 수 있습니다.
  • 큰 k: 모델이 너무 일반화되어 데이터에서 더 미세한 패턴을 놓칠 수 있는 과소적합으로 이어질 수 있습니다.

3. 다수 투표: 새로운 데이터 포인트에 대한 예측 클래스는 k개의 최근접 이웃 중에서 가장 일반적인 클래스입니다.

  • 과반수 투표:
    • k개의 이웃 사이에서 각 클래스의 발생 횟수를 계산합니다.
    • 가장 높은 개수의 클래스를 새 데이터 포인트에 할당합니다.

4. 가중 투표: 경우에 따라 거리에 따라 이웃에 가중치가 부여되며, 가까운 이웃이 분류에 더 많은 영향을 미칩니다.

  • 가중 투표:
    • 각 이웃의 투표를 거리의 역수로 평가하세요.
    • 클래스별 가중치 투표를 합산합니다.
    • 새 데이터 포인트에 가중치 합계가 가장 높은 클래스를 할당합니다.

주요 개념

  1. 비모수적: k-NN은 비모수적 방법입니다. 즉, 데이터의 기본 분포에 대해 어떠한 가정도 하지 않습니다. 이를 통해 다양한 유형의 데이터를 유연하게 처리할 수 있습니다.

  2. 인스턴스 기반 학습: 알고리즘은 전체 교육 데이터 세트를 저장하고 데이터의 로컬 패턴을 기반으로 예측합니다. 쿼리가 이루어질 때까지 처리를 지연시키기 때문에 "게으른" 학습 알고리즘이라고도 합니다.

  3. 거리 계산: 거리 측정법의 선택은 모델 성능에 큰 영향을 미칠 수 있습니다. 일반적인 측정항목으로는 유클리드 거리, 맨해튼 거리, 민코프스키 거리 등이 있습니다.

  4. k의 선택: k 값은 중요한 하이퍼 매개변수입니다. 교차 검증은 주어진 데이터 세트에 대한 최적의 k 값을 결정하는 데 종종 사용됩니다.

k-최근접이웃(k-NN) 분류 예

k-NN(k-Nearest Neighbors) 분류는 가장 가까운 이웃의 클래스를 기반으로 데이터 포인트를 분류하는 데 사용되는 비모수적 인스턴스 기반 학습 알고리즘입니다. 이 예에서는 합성 데이터를 사용하여 다중 클래스 분류를 위한 k-NN을 구현하고, 모델 성능을 평가하고, 세 클래스에 대한 결정 경계를 시각화하는 방법을 보여줍니다.

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. 데이터세트 분할

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.