PYTHON/머신러닝
[PYTHON] KNN K-최근접 이웃(K-Nearest Neighbors)
G허니
2024. 4. 28. 20:50
K-최근접 이웃(K-Nearest Neighbors, KNN)은 지도 학습 알고리즘 중 하나로, 분류 및 회귀 문제에 널리 사용됩니다. 이 알고리즘은 인스턴스 기반(instance-based) 학습 방법 중 하나로, 데이터 간의 거리를 기반으로 이웃을 찾아 예측을 수행합니다.
알고리즘 동작 방식:
- 이웃의 수 선택(K 선택): 예측하려는 데이터 포인트에 대해 가장 가까운 이웃의 수(K)를 선택합니다.
- 거리 측정: 입력 데이터 포인트와 모든 학습 데이터 포인트 간의 거리를 측정합니다. 일반적으로 유클리드 거리나 맨해튼 거리 등이 사용됩니다.
- 가장 가까운 이웃 선택: 거리를 기반으로 입력 데이터 포인트에 가장 가까운 K개의 학습 데이터 포인트를 선택합니다.
- 다수결 투표 (분류) 또는 평균 (회귀): 분류 문제의 경우, 선택된 이웃들의 클래스를 확인하고 다수결 투표를 통해 입력 데이터의 클래스를 할당합니다. 회귀 문제의 경우, 선택된 이웃들의 출력 값을 평균하여 입력 데이터의 출력 값을 예측합니다.
주요 특징:
- 간단하고 직관적: KNN은 단순하며 직관적인 알고리즘으로, 구현하기 쉽습니다.
- 비모수적(non-parametric): KNN은 모델을 학습하는 데에 별도의 파라미터가 필요하지 않습니다. 대신, 모든 학습 데이터를 저장하고 이를 기반으로 예측을 수행합니다.
- 데이터에 민감: KNN은 입력 데이터와 거리 기반으로 이웃을 찾기 때문에, 데이터의 스케일과 분포에 민감합니다. 따라서 데이터 전처리가 중요합니다.
- 계산 비용이 높음: 모든 학습 데이터와의 거리를 계산해야 하므로, 데이터가 매우 큰 경우 계산 비용이 높을 수 있습니다.
적용 분야:
- 분류 문제: KNN은 분류 문제에서 많이 사용됩니다. 예를 들어, 손글씨 인식, 얼굴 인식, 이상 감지 등에 적용될 수 있습니다.
- 회귀 문제: KNN은 회귀 문제에도 사용될 수 있습니다. 예를 들어, 주택 가격 예측, 주식 가격 예측 등에 적용될 수 있습니다.
모델링
KNN 알고리즘을 사용하기 위해 정규화를 진행합니다.
# 모듈 불러오기
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
# 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
# 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
# 한번에 가능
# x_train = scaler.fit_transform(x_train)
# 1단계: 불러오기
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error, r2_score
# 2단계: 선언하기
model = KNeighborsRegressor()
# 3단계: 학습하기
model.fit(x_train, y_train)
# 4단계 예측하기
y_pred = model.predict(x_test)
# 5단계: 평가하기
print(mean_absolute_error(y_test, y_pred))
print(r2_score(y_test, y_pred))
K-최근접 이웃은 단순하고 강력한 알고리즘으로, 데이터의 패턴을 학습하고 예측하는 데 유용합니다. 그러나 데이터의 스케일에 민감하며 계산 비용이 높을 수 있으므로, 적절한 전처리와 데이터 크기를 고려하여 사용해야 합니다.