본문 바로가기

Python

Python에서 Jupyter Notebook을 통해 머신러닝하기 : Classfication편

K-최근접 이웃(K-NN) 알고리즘을 이용한 머신러닝 구현

K-최근접 이웃(K-Nearest Neighbors, K-NN) 알고리즘은 분류와 회귀에 모두 사용될 수 있는 간단하면서도 효과적인 머신러닝 알고리즘입니다. 이 알고리즘은 새로운 데이터 포인트의 클래스나 값을 예측할 때, 주변의 K개의 가장 가까운 이웃들의 정보를 활용합니다. 이번 포스트에서는 scikit-learn 라이브러리를 사용하여 K-NN을 구현하는 방법을 단계별로 알아보겠습니다.

1. 필요한 라이브러리 임포트

먼저 필요한 라이브러리들을 임포트합니다.

 

 

2. 데이터 준비

아이리스 데이터셋을 로드하고 특성(X)과 타겟(y)으로 분리합니다.

준비한 데이터

이 데이터프레임은 아이리스 꽃의 특성(sepal length, sepal width, petal length, petal width)과 해당 꽃의 종류를 나타내는 target 열을 포함하고 있습니다. target 열의 0은 특정 아이리스 종을 나타냅니다.

데이터 분리

 

3-1. 데이터 전처리

 

인코딩 (Encoding)

  • 필요 여부: 불필요
  • 이유: 아이리스 데이터셋의 특성은 이미 숫자형 데이터입니다. 타겟 변수는 이미 숫자로 인코딩되어 있습니다.

피처 스케일링 (Feature Scaling)

  • 필요 여부: 필요
  • 이유: K-NN은 거리 기반 알고리즘이므로 특성들의 스케일이 다르면 거리 계산에 영향을 줄 수 있습니다.

 

 

3-2.데이터 분할

데이터를 학습 세트와 테스트 세트로 분리합니다.

 

 

4. 모델링 및 학습

K-NN 모델을 초기화하고 학습시킵니다.

 

 

5. 예측 및 평가

테스트 데이터에 대한 예측을 수행하고 정확도를 계산합니다.

 

6. K 값에 따른 정확도 변화

다양한 K 값에 대한 모델의 정확도를 확인해봅시다.

 

결론

K-NN 알고리즘은 구현이 간단하고 직관적이지만, 데이터의 특성과 크기에 따라 성능이 크게 달라질 수 있습니다. 이 예제에서는 아이리스 데이터셋에 대해 높은 정확도(97%)를 달성했습니다.

K-NN의 장단점

장점:

  • 쉬운 모델, 쉬운 알고리즘과 이해
  • 튜닝할 hyperparameter 스트레스가 적음
  • 초기 시도해보기 좋은 시작점이 되는 모델

단점:

  • 샘플 데이터가 늘어나면 예측시간도 늘어나기 때문에 매우 느려짐
  • pre-processing을 잘하지 않으면 좋은 성능을 기대하기 어려움
  • feature가 많은(수 백개 이상) 데이터셋에서는 좋은 성능을 기대하기 어려움
  • feature의 값이 대부분 0인 데이터셋과는 매우 안좋은 성능을 냄

K-NN은 작은 데이터셋이나 빠른 프로토타이핑에 적합하며, 데이터의 분포가 복잡하지 않을 때 좋은 성능을 보입니다. 그러나 대규모 데이터셋에서는 계산 비용이 높아질 수 있으므로 주의가 필요합니다. K 값의 선택은 모델 성능에 큰 영향을 미치므로, 다양한 K 값을 시도해보고 최적의 값을 찾는 것이 중요합니다.