프로그래밍/Python

파이썬을 사용한 KNN(최근접 이웃) 구현해보기

Dibrary 2022. 6. 6. 09:50
반응형

안녕하세요 Dibrary입니다.

이번에는 KNN을 구현 해 보겠습니다.

KNN은 약자이고 K-Nearest Neighbors 즉, 'K개의 근접 이웃'을 의미합니다. 

모르는 대상이 있을 때, 그것의 근접에 있는 이웃을 통해 그것이 '어떤' 이웃과 비슷하다~ 는 판정을 컴퓨터가 하는 셈이죠.

 


저는 Jupyter를 켜고 하겠습니다.

우선 mglearn을 다운로드 하셔야 합니다. pip install mglearn을 하시면 자동으로 됩니다.

이 코드를 입력해서 본 결과는 mglearn에 make_forge라는 데이터의 시각화 입니다.

 

데이터는 discrete_scatter에 들어가서 표현이 된 것이고, X라는 데이터가 2개의 값을 가지고 있으므로, X[:,0] X[:,1] 로 나타냈고, y가 색상이 다른 특성입니다.

과연 그런지 데이터를 보겠습니다. 

네 X의 데이터 10개만을 가져와 봤는데, 2개의 값으로 이뤄져있고,

X[:,0]은 왼쪽 값만 담겨있고, X[:,1]은 오른쪽 값만 담겨있네요. y는 1과 0으로만 이뤄진 분할이 가능한 변수네요.

직접 위에 그래프 점의 위치는 X라는 값에 속해있고, y라벨도 일치합니다.

 


KNN은 어떤 방식으로 이뤄지는지 이미지를 보겠습니다.

지금 이웃을 2개 찾으세요~ 라고 지시한 후에 컴퓨터가 별표 근처 이웃을 찾는 모습입니다.
(코드는 그저 이미지를 보여주는 용도입니다. 숫자를 2 말고 3같이 변경해보셔도 됩니다.)

 


 

그럼 이제 진짜 훈련을 시켜보겠습니다.

코드만 있으니까 뭔가 삭막해 보이네요.

별건 없고, X, y라는 데이터에서 X_train, X_test, y_train, y_test 로 홀드아웃(테스트용, 훈련용 분류)를 한 것입니다.

그리고 머신은 이웃 2개를 활용하게 machine이라는 이름으로 객체를 생성했습니다.

 

그리고 fit을 이용해서 훈련시키고, X_test데이터를 predict(예측)하게 해 보았습니다.

정확도는 85.7% 입니다.

 

 

정말 머신이 제대로 작동하나 눈으로 보고싶으시다면 내가 임의로 데이터를 만들어서 확인해 보면 됩니다.

저는 임의로 이렇게 넣어보았습니다. 일직선으로 처음에 데이터를 만들고, 그렇게만 하면 심심하니까 몇 개 분포를 추가했습니다. (데이터를 만들 때 numpy 객체를 썼음에 주의하세요)

이제 이 데이터를 훈련해서 임의 값을 뭐로(0인지 1인지) 예측하는지 보면 됩니다.

우선 정확도는 0.66 즉, 66%라고 나옵니다. 그닥 신뢰할 만하지는 않겠네요. 물론, 데이터가 너무 적은 이유도 있습니다. 이런 경우를 과소적합이라고 하죠.

 

이제 훈련도 끝났겠다, 임의 값을 뭐로 분류하는지 보겠습니다.

오 4, 3 위치에는 주위에 0이 많은 것을 볼 수 있고, 결과는 0이 나옵니다.
7, 6 위치에는 주위에 1이 둘러 싼 것을 볼 수 있고, 결과는 1이 나옵니다.

 

즉, 훈련 데이터만 충분하다면 비교적 괜찮은 판단을 할 지도 모른다는 것이죠.

 

이런식으로 자신만의 머신을 만들어 판단을 해 보는 것도 재밌습니다.
위 코드의 핵심 부분만 잘 알고 있으면 어디서든 간단한 머신을 구현할 수 있습니다.

728x90
반응형