검색
검색
공개 노트 검색
회원가입로그인

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안

요약
  • KNN(K-Nearest Neighbors) 알고리즘은 분류와 회귀 문제를 해결하는 데 사용됩니다.
  • KNN의 핵심 아이디어는 새로운 데이터 포인트를 가장 가까운 K개의 이웃 데이터 포인트들을 바탕으로 분류하는 것입니다.
  • 실습을 통해 KNN 모델을 생성하고, 최적의 K값을 찾으며, 모델의 성능을 평가하는 과정을 다룹니다.
page thumbnail

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안 image 1

기계 학습의 기본적인 알고리즘 중 하나인 KNN(K-Nearest Neighbors)에 대해 실습해보겠습니다.

KNN은 분류(Classification)와 회귀(Regression) 문제를 해결하는 데 사용되는 알고리즘이에요.

KNN 알고리즘 개념

새로운 학교로 전학을 갔다고 상상해 보세요.

그런데 어느 그룹에 속해야 할지 모르겠다면 어떻게 해야 할까요?

바로 여러분과 가장 유사한 성격과 특징을 가진 학생들을 찾아

그들이 속한 그룹으로 가면 되겠죠?

이게 바로 KNN 알고리즘의 기본 아이디어랍니다!

KNN 알고리즘은 새로운 데이터 포인트를 분류할 때,

그 데이터 포인트와 가장 가까운

K개의 이웃 데이터 포인트들의 레이블을 참고하여 분류합니다.

KNN 알고리즘은 새로운 데이터 포인트를 분류할 때,

그 데이터 포인트와 가장 가까운 K개의

이웃 데이터 포인트들의 레이블을 참고하여 분류합니다.

그럼 실습을 통해 자세히 알아볼까요?

Step 1: 실습 준비

실습을 시작하기 전에 필요한 라이브러리를 import합니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안 image 2

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안 image 3

Step 2: 데이터 로드 및 분할

sklearn의 datasets 모듈에서 iris 데이터셋을 로드하고, 훈련 데이터와 테스트 데이터로 분할해 볼게요.

# 아이리스 데이터 로드
irisData = load_iris()  # sklearn에서 제공하는 iris 데이터셋을 로드

# 독립변수와 종속변수를 정의
x_total = irisData.data  # 독립변수(features)를 x_total에 할당
y_total = irisData.target  # 종속변수(target)를 y_total에 할당

# 데이터를 훈련 집합과 테스트 집합으로 분할 (8:2)
x_train, x_test, y_train, y_test = train_test_split(x_total, y_total, test_size=0.2, random_state=10)
# train_test_split 함수를 사용하여 데이터를 훈련 집합과 테스트 집합으로 분할
# test_size=0.2는 전체 데이터의 20%를 테스트 데이터로 사용한다는 의미
# random_state=10은 데이터 분할 시 재현 가능한 결과를 얻기 위해 설정하는 값

Step 3: KNN 모델 생성 및 학습

이제 KNN 모델을 생성하고 훈련 데이터로 학습시켜 볼까요?

# k-NN 분류분석 객체 생성
kNN = KNeighborsClassifier()  # KNeighborsClassifier 클래스를 사용하여 KNN 모델 객체 생성

# k-NN 분류분석 모형 학습
kNN.fit(x_train, y_train)  # fit 메서드를 사용하여 훈련 데이터로 KNN 모델을 학습

Step 4: 테스트 데이터에 대한 예측 및 성능 평가

학습된 KNN 모델을 사용하여 테스트 데이터에 대한 예측을 수행하고, 모델의 정확도를 평가해 보겠습니다.

# 학습된 모형으로 테스트 집합의 클래스 추정
predictedClass = kNN.predict(x_test)  # predict 메서드를 사용하여 테스트 데이터에 대한 예측 수행

# 모형의 정확도 파악
print("훈련 집합의 정확도: {0:.4f}".format(kNN.score(x_train, y_train)))  # 훈련 데이터에 대한 정확도 출력
print("테스트 집합의 정확도: {0:.4f}".format((predictedClass == y_test).mean()))  # 테스트 데이터에 대한 정확도 출력
print("교차검증 정확도: {0:.4f}".format(cross_val_score(kNN, x_train, y_train, cv=10).mean()))
# 교차 검증을 사용하여 모델의 성능 평가
# cv=10은 10-폴드 교차 검증을 수행한다는 의미

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안 image 4

Step 5: 최적의 K 값 찾기

KNN 알고리즘에서 가장 중요한 하이퍼파라미터는 K 값이에요. 최적의 K 값을 찾기 위해 다양한 K 값에 대해 모델을 학습하고 성능을 평가해 볼게요.

train_acc = []  # 훈련 데이터에 대한 정확도를 저장할 리스트
test_acc = []  # 테스트 데이터에 대한 정확도를 저장할 리스트

for n in range(1, 31):  # K 값을 1부터 30까지 변화시키면서 반복
    temp_kNN = KNeighborsClassifier(n_jobs=-1, n_neighbors=n)  # 각 K 값에 대해 KNN 모델 객체 생성
    temp_kNN.fit(x_train, y_train)  # 훈련 데이터로 모델 학습
    predictionResult = temp_kNN.predict(x_test)  # 테스트 데이터에 대한 예측 수행
    train_acc.append(temp_kNN.score(x_train, y_train))  # 훈련 데이터에 대한 정확도를 리스트에 추가
    test_acc.append((predictionResult == y_test).mean())  # 테스트 데이터에 대한 정확도를 리스트에 추가

Step 6: 결과 시각화

최적의 K 값을 찾기 위해 각 K 값에 대한 훈련 데이터와 테스트 데이터의 정확도를 시각화해 볼까요?

plt.figure(figsize=(12, 9))  # 그래프의 크기 설정
plt.plot(range(1, 31), train_acc, label='Training Dataset')  # 훈련 데이터에 대한 정확도 그래프 그리기
plt.plot(range(1, 31), test_acc, label='Test Dataset')  # 테스트 데이터에 대한 정확도 그래프 그리기
plt.title("Accuracy vs. Number of Neighbors", fontsize=16)  # 그래프 제목 설정
plt.xlabel("Number of Neighbors", fontsize=14)  # x축 레이블 설정
plt.ylabel("Accuracy", fontsize=14)  # y축 레이블 설정
plt.xticks(np.arange(0, 31, step=1))  # x축 눈금 설정
plt.legend(fontsize=14)  # 범례 설정
plt.show()  # 그래프 출력

[쉽게 설명해보기_ kNN] kNN(K-Nearest Neighbors) 알고리즘 실습 교안 image 5

KNN 실습의 시각화 결과에서 다음과 같은 정보를 얻을 수 있습니다:

  1. K 값에 따른 정확도 변화: 그래프는 K 값(Number of Neighbors)에 따른 훈련 데이터셋과 테스트 데이터셋의 정확도 변화를 보여줍니다. K 값이 변함에 따라 정확도가 달라지는 것을 확인할 수 있습니다.

  2. 과적합(Overfitting)과 과소적합(Underfitting): K 값이 작을 때(예: K=1)는 훈련 데이터셋의 정확도가 매우 높지만 테스트 데이터셋의 정확도는 상대적으로 낮습니다. 이는 모델이 훈련 데이터에 과적합되었음을 의미합니다. 반면, K 값이 클 때(예: K=30 이상)는 훈련 데이터셋과 테스트 데이터셋의 정확도 차이가 줄어들지만 전반적인 정확도가 낮아집니다. 이는 모델이 과소적합되었음을 나타냅니다.

  3. 최적의 K 값 선택: 그래프를 통해 훈련 데이터셋과 테스트 데이터셋의 정확도 차이가 적으면서도 전반적인 정확도가 높은 K 값을 선택할 수 있습니다. 이 예시에서는 K 값이 5에서 15 사이일 때 좋은 성능을 보이는 것으로 판단됩니다.

  4. 모델 성능 평가: 시각화 결과를 통해 KNN 모델의 전반적인 성능을 평가할 수 있습니다. 훈련 데이터셋과 테스트 데이터셋의 정확도 차이가 크지 않고 전반적인 정확도가 높다면 모델이 잘 일반화되었다고 볼 수 있습니다.

이러한 정보를 바탕으로 적절한 K 값을 선택하고 모델의 성능을 평가할 수 있습니다.

또한, 과적합과 과소적합을 인지하고 모델을 개선하는 데 활용할 수 있습니다.

<실습 노트>

Google Colaboratory

조회수 : 100
heart
공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기
T
페이지 기반 대답
AI Chat