K-최근접 이웃(K-Nearest Neighbors, KNN)은 머신러닝 및 딥러닝에서 매우 간단하고 직관적인 알고리즘으로,
주어진 데이터 포인트에 대해 가장 가까운 K개의 이웃을 찾고 그 이웃들의 라벨에 따라 예측을 수행합니다.
KNN은 주로 분류 문제에 사용되지만 회귀 문제에도 적용될 수 있습니다.
1. KNN의 기본 원리
KNN 알고리즘의 기본적인 아이디어는 다음과 같습니다. 주어진 샘플을 분류하고자 할 때,
해당 샘플과 가장 가까운 K개의 데이터를 선택합니다. 이 K개의 데이터가 주는
정보를 기반으로 새로운 샘플의 라벨을 결정합니다.
예를 들어, K가 3이라면, 주어진 샘플에 가장 가까운 3개의 이웃의 라벨을 확인하고,
그 중 가장 많은 라벨이 선택됩니다.
1.1 거리 측정 방법
KNN에서 이웃을 찾기 위해서는 두 데이터 포인트 간의 거리를 측정해야 합니다.
일반적으로 사용되는 거리 측정 방법은 다음과 같습니다:
- 유클리드 거리 (Euclidean Distance): 두 점 (x1, y1)과 (x2, y2) 간의 거리로 정의됩니다.
- 맨하탄 거리 (Manhattan Distance): 두 점 간의 거리의 절대값 합으로 정의됩니다.
- 미세한 거리 (Minkowski Distance): 일반화된 거리 척도로, 유클리드와 맨하탄 거리를 포함합니다.
2. KNN의 장단점
2.1 장점
- 구현이 간단하고 직관적입니다.
- 모델 학습이 필요 없기 때문에 즉시 예측할 수 있습니다.
- 비선형 데이터에 대해서도 좋은 성능을 보입니다.
2.2 단점
- 대규모 데이터셋에서는 예측 속도가 느려집니다.
- K 값의 선택이 결과에 큰 영향을 미칩니다.
- 고차원 데이터에서 성능이 떨어질 수 있습니다. (차원의 저주)
3. KNN을 파이토치로 구현하기
이 섹션에서는 PyTorch를 사용하여 KNN을 구현하는 방법을 알아보겠습니다.
이를 위해 필요한 라이브러리를 설치하고, 필요한 데이터셋을 준비하겠습니다.
3.1 필요한 라이브러리 설치
pip install torch numpy scikit-learn
3.2 데이터셋 준비
유방암 데이터셋을 사용하여 KNN을 구현할 것입니다.
scikit-learn에서 제공하는 유방암 데이터셋을 불러오겠습니다.
import numpy as np
import torch
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 데이터셋 로드
data = load_breast_cancer()
X = data.data
y = data.target
# 데이터셋 분할 (훈련/테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 데이터 정규화
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
3.3 KNN 알고리즘 구현
이제 KNN 알고리즘을 구현해 보겠습니다.
먼저, KNN을 수행하는 클래스를 정의하겠습니다.
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
distances = []
for x in X:
distance = np.sqrt(np.sum((self.X_train - x) ** 2, axis=1))
distances.append(distance)
distances = np.array(distances)
neighbors = np.argsort(distances)[:, :self.k]
return np.array([self.y_train[neighbor].mode()[0] for neighbor in neighbors])
3.4 모델 학습 및 예측
KNN 모델을 사용하여 학습하고 예측하는 과정을 보여드리겠습니다.
# KNN 모델 생성
knn = KNN(k=3)
# 훈련 데이터로 모델 적합
knn.fit(X_train, y_train)
# 테스팅 데이터로 예측
predictions = knn.predict(X_test)
# 정확도 계산
accuracy = np.mean(predictions == y_test)
print(f'모델 정확도: {accuracy * 100:.2f}%')
4. KNN을 개선하기
KNN의 성능을 향상시킬 수 있는 몇 가지 방법을 살펴보겠습니다.
예를 들어, K 값을 조정하거나 거리 척도를 변경하는 방법이 있습니다.
또한, 데이터의 차원을 축소하여 성능을 개선할 수도 있습니다.
4.1 K 값 조정
K 값은 KNN 알고리즘의 성능에 크게 영향을 미칩니다.
K 값을 너무 작게 설정하면 과적합(overfitting)이 발생할 수 있으며,
너무 크게 설정하면 일반화 성능이 떨어질 수 있습니다.
따라서 Cross-Validation 기법을 사용하여 최적의 K 값을 찾아야 합니다.
4.2 거리 척도 변경
유클리드 거리 외에도 맨하탄 거리, 미세한 거리 등을 사용할 수 있습니다.
실험을 통해 가장 적절한 거리 측정 방법을 선택하는 것이 중요합니다.
4.3 차원 축소
PCA(주성분 분석)와 같은 차원 축소 기법을 사용하여 데이터의 차원을 줄이면
KNN의 성능이 향상될 수 있습니다.
차원이 높은 경우 데이터를 시각적으로 이해하기 어려울 뿐 아니라,
계산의 복잡성도 증가하게 됩니다.
5. KNN과 딥러닝의 관계
KNN 알고리즘은 딥러닝과 함께 사용될 수 있습니다.
예를 들어, 딥러닝 모델의 출력을 KNN의 기본 레이어에 연결하여
보다 효율적인 분류기(classifier)로 만들 수 있습니다.
또한, KNN의 이웃 데이터에서 정보를 추출하여 딥러닝의 특성(feature)으로 사용될 수 있습니다.
6. 마무리
K-최근접 이웃(KNN)은 머신러닝의 기본적인 알고리즘으로,
그 구현과 이해가 매우 쉽습니다.
하지만 알고리즘의 단점들, 특히 대규모 데이터셋과 고차원 데이터에서의
성능 문제를 이해하고 이를 개선하는 방법을 아는 것이 중요합니다.
이 글을 통해 KNN에 대한 기초 지식을 쌓고,
PyTorch를 통해 KNN을 실제로 구현해보는 기회를 가지셨길 바랍니다.