[머신러닝] K-Nearest Neighbors 응용 - 필기체 인식

2018. 2. 27. 00:28공부 자료

[머신러닝] K-Nearest Neighbors 응용



    지난 포스트에서는 k-NN의 의미가 무엇인지 살펴보았다. 이번에는 k-NN을 파이썬으로 구현해서 응용 해 보는 포스팅을 가져 보려고 한다. 구현한 소스는 git-hub인 https://github.com/sshrik/knn 에 공유해두었다.


    소스는 크게 3개인 ioModule / knn / 그리고 main의 역할을 하는 HandwriteTraining으로 구분된다. 필기체 자료는 http://archive.ics.uci.edu/ml  에서 다운로드 받을 수 있다. 지난번에도 이야기 했 듯이, k - NN은 상위 k개의 majority vote를 통해 기존의 값들과의 비교로 데이터의 결과를 예측하는 것이다. 소스를 통해 확인 해 보도록 하자.


[ 사진 1 - knn.py ]


    읽어들인 dataSet( 0 ~ 63 index : 8 x 8 사진을 list로 표현한것, 64 index : Label , dataSet은 이러한 list들의 집합 )과 testData 한개를 받아서 결과를 계산하여, 상위 k개를 보고 결과를 반환하는 간단한 코드이다. 사실 내용이 별게 없다보니 포스팅 내용도 간단해 질 수 밖에 없다. ( ... ) 계산을 하기 전에, 시간을 줄이기 위해서 전체의 데이터를 모두 사용하는 것이 아니라 데이터중 몇 개의 데이터만 가지고 와서 ( 소스에서는 threshold ) 계산을 줄여보았었다. 데이터의 중복 사용을 막기 위해 사용하기 전에는 항상 shuffle 함수를 통해 섞어 주었다.


[ 사진 2 - HandwritingTraining.py ]    


    threshold가 400 / k가 20일 때에는 90%, 동일한 k에서 1600개의 threshold를 가질 때에는 94%, threshold를 전부 사용했을 때에는 96.3%의 결과를 얻었다. 참고로 기존의 논문에서는 k = 1일때 98%의 정확도, k = 2일때 97.4%의 정확도를 얻었다고 한다.

이 때, 계산하는데 걸린 시간은 총 3시간정도인데, 이는 라즈베리파이에서 진행한 결과이므로 어느정도 시간에 오차가 있을 수 있다고 생각된다.


    k - NN은 쉬운 알고리즘인만큼 여러개의 실습을 진행하지 않고 넘어가도 괜찮을 것 같다. 정확하고, 직관적인만큼 사람들이 이해하기 쉽지만, 기존에 labeling 된 데이터가 많이 필요한 기법인 만큼 사용되는 곳은 적을 것 같다. 쉽다는 장점에도, 기존에 데이터가 많이 부족한 상태에서 학습하기에는 부적절하기 때문이다. 또한 계산을 미리 해 둘 수 없는 만큼 즉각적인 반응이 필요한 곳에서는 사용하기 힘들 것 같다고 생각된다.