유유상종의 진리를 이용한 분류 모델, kNN(k-Nearest Neighbor)

머신러닝 알고리즘을 거칠게(roughly) 나누자면 지도학습과 비지도학습 알고리즘으로 구분지을 수 있다. 그 기준이 되는 것을 알고리즘을 학습시킬 때(훈련시킬 때) 레이블(label)이 필요한가의 여부다. 레이블이 있는 학습 데이터가 필요하면 지도학습(supervised learning)이고, 레이블이 없는 학습 데이터만으로 훈련이 가능하면 비지도학습 알고리즘이다. 선생님이 학생에게 여러 개의 예제를 알려주는데 답도 알려주어서 학습시키면 지도학습이고, 예제는 알려주는데 답은 안 알려주면서 학습시키는 것은 비지도학습이라고 볼 수 있다. kNN은 레이블이 있는 학습 데이터가 있어야 작동이 가능하기 때문에 지도학습 알고리즘에 속한다. kNN은 지도학습 알고리즘 중에서도 가장 간단한 알고리즘이라고 평가된다. 

 

kNN(k-Nearest Neighbor) 모델은 이름에 기본적인 작동 방식을 잘 담아내고 있다. 테스트 데이터에서 k개의 가장 가까운 이웃을 찾아서 그 이웃들 중 다수가 속한 클래스가 테스트 데이터의 클래스가 되게 한다는 것이다. 만약 k=1로 설정되어 있다면, 테스트 데이터에서부터 가장 가까운 학습 데이터의 클래스가 바로 테스트 데이터의 클래스가 되는 것이다. k=3으로 설정되어 있다면, 테스트 데이터에서 가장 가까운 3개의 학습 데이터들의 클래스를 살펴본 후 그 중 다수가 속하고 있는 클래스가 바로 테스트 데이터의 클래스로 결정된다. k=n인 경우도 마찬가지로 작동한다. 이것이 무슨 말인가는 아래 그림을 보면 아마 이해가 될 것이다. 데이터의 특성이 2개, 즉 2차원인 경우를 예로 삼았다. 그리고 각각 다른 클래스에 속하는 학습 데이터들은 다른 도형으로 나타냈다. 그리고 테스트 데이터는 십자가 모양으로 나타냈다. 

 

k=1일 때를 살펴보면 테스트 데이터에서 가장 가까운 학습 데이터는 동그라미 클래스에 속함을 알 수 있다. 따라서 테스트 데이터의 클래스를 동그라미 클래스로 정해준다. k=3일 때를 보면, 3개의 가장 가까운 이웃 중 과반수가 넘는 2개가 세모 클래스임을 알 수 있다. 따라서 이때는 테스트 데이터의 클래스를 세모 클래스로 정해준다. k=9일 때는 9개의 가장 가까운 이웃 중 5개가 세모 클래스에 속함을 확인할 수 있다. 따라서 테스트 데이터의 클래스는 세모가 된다. 

 

방금 이 간단한 예제에서 확인할 수 있듯이, kNN 알고리즘은 테스트 데이터를 기준으로 가상의 원을 확장시켜간다. 그러다 k만큼의 학습 데이터를 만나게 되면 그때 그 학습 데이터들의 클래스를 확인해서 과반수가 속하는 클래스를 테스트 데이터의 클래스로 삼아주는 것이다. 

 

내가 참고한 김의중 님의 책[1]에서는 k를 꼭 홀수로 설정해줘야 한다고 하는데, 꼭 그렇지는 않다. k가 짝수더라도, 테스트 데이터와 최근접 이웃들의 거리에 따라서 변별력있게 테스트 데이터의 클래스를 결정해줄 수 있기 때문이다. 만약 k=4로 설정했는데, 두 개는 동그라미 클래스, 두 개는 세모 클래스에 속한다고 해보자. 이때는 테스트 데이터에서 동그라미 클래스에 속하는 학습 데이터들까지의 거리의 합과 세모 클래스에 속하는 학습 데이터들까지의 거리의 합을 비교함으로써 어느 클래스로 결정해주는 것이 더 적당한지 판단할 수 있다. 만약 그 거리의 합이 같다면 k=4보다 하나 적은 k=3의 결과를 참고한다. 그랬더니 세모 클래스에 속한 것이 2개, 동그라미 클래스에 속한 것이 1개였다. 그렇다면 테스트 데이터의 클래스는 세모가 된다.  

 

참고로 kNN은 레이지 러닝(lazy learning)이라고 부르기도 한다. 게으른 학습자라고 표현할 수 있는데, 테스트 전에 미리 학습 과정을 거치는 선형회귀, 서포트벡터머신(SVM)과 같은 다른 지도학습 알고리즘과 달리 kNN은 테스트 데이터가 주어졌을 때 비로소 최근접이웃들을 찾아가는 방식으로 학습을 시작하기 때문이다. 레이지 러닝에 반대 되는 개념은 이거 러닝(eager learning)이다. 

 

 

 

<참고자료>

[1] 김의중 지음, "알고리즘으로 배우는 인공지능, 머신러닝, 딥러닝 입문", 위키북스(2016)

[2] https://proinlab.com/archives/2125, Younghun Chae, "kNN (k-Nearest Neighbor) 알고리즘"

댓글()