> 백엔드 개발 > 파이썬 튜토리얼 > K 최근접이웃 분류, 분류: 지도 머신러닝

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

王林
풀어 주다: 2024-07-19 14:58:38
원래의
889명이 탐색했습니다.

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

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿