KNN(K-Nearest Neighbors) 알고리즘은 지도학습(Supervised Learning) 분류와 회귀에 사용되는 간단하고 인기있는 알고리즘이다. 인스턴스 기반(Instance-based) 학습 또는 게으른 학습(Lazy Learning)의 한 유형으로 분류된다.
KNN 알고리즘의 동작 방식은 다음과 같다.
1. 훈련 데이터셋 저장: 알고리즘은 훈련 데이터셋을 저장한다. 각 데이터 포인트는 특성(Features) 벡터와 해당 데이터 포인트의 클래스(레이블)로 구성된다.
2. 예측: 새로운 입력 데이터가 주어지면, 해당 데이터와 가장 가까운 K개의 훈련 데이터 포인트를 찾는다. 일반적으로 유클리디안 거리(Euclidean Distance)나 맨해튼 거리(Manhattan Distance) 등의 거리 측정 방법을 사용하여 가장 가까운 이웃을 찾는다.
3. 다수결 투표(Classification) 또는 평균 계산(Regression): K개의 가장 가까운 이웃을 찾으면, 분류(Classification) 문제의 경우 이웃들의 클래스 중 가장 많은 클래스를 새로운 데이터 포인트의 클래스로 예측한다. 회귀(Regression) 문제의 경우 이웃들의 클래스(레이블)의 평균을 새로운 데이터 포인트의 예측값으로 사용한다.
KNN 알고리즘은 비모수적(Non-parametric) 알고리즘으로, 모델을 만들지 않고 훈련 데이터셋을 그대로 메모리에 저장하여 사용한다. 이러한 특성으로 인해 새로운 데이터가 주어지면 실시간으로 예측이 가능하며, 비교적 구현이 간단하고 이해하기 쉬운 장점이 있다. 그러나 훈련 데이터셋이 크고 차원이 높을 경우 예측 속도가 느려질 수 있고, 특성 간의 스케일링이 중요하다는 단점도 있다.
KNN 알고리즘은 분류, 회귀, 이상 탐지(Anomaly Detection) 등 다양한 문제에 사용될 수 있으며, 알고리즘의 성능은 이웃의 개수(K)에 따라 달라진다. 적절한 K값을 선택하는 것이 중요하며, 이를 위해 교차 검증(Cross-validation) 등의 기법을 사용하여 성능을 평가하는 것이 좋다.
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 붓꽃 데이터셋 불러오기
iris = load_iris()
X = iris.data # 특성(Feature) 데이터
y = iris.target # 클래스(레이블) 데이터
# 데이터 분할: 훈련 데이터와 테스트 데이터로 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 스케일링 (표준화)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# KNN 알고리즘 모델 생성
knn_model = KNeighborsClassifier(n_neighbors=3) # 이웃의 개수 K를 3으로 설정
knn_model.fit(X_train_scaled, y_train) # 모델 학습
# 테스트 데이터로 예측
y_pred = knn_model.predict(X_test_scaled)
# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print("정확도: {:.2f}".format(accuracy))
'AI' 카테고리의 다른 글
조건부 확률 분포 (0) | 2023.08.14 |
---|---|
결합 확률 분포, 주변 확률 분포 (0) | 2023.08.14 |
Standard Scaling (0) | 2023.07.29 |
데이터 시각화: pandas, matplotlib (0) | 2023.07.22 |
활성화 함수(activation function) (0) | 2023.07.03 |