본문 바로가기
머신러닝

[머신러닝] K-최근접 이웃 (K-Nearest Neighbor)

by Gom Guard 2017. 11. 28.


지도학습 알고리즘

  • 지도학습 관련 알고리즘들로는 

  • 이 있다고 말씀 드렸었습니다. 그 중 오늘은 가장 고전적이며 직관적인 최근접 이웃법 (Nearest Neighbor) 에 대해 알아보겠습니다.

최근접 이웃법 (Nearest Neighbor) - 이론

  • 최근접 이웃법은 한마디로 유유상종 이라고 할 수 있습니다. 새로운 데이터를 입력 받았을 때 가장 가까이 있는 것이 무엇이냐를 중심으로 새로운 데이터의 종류를 정해주는 알고리즘 입니다. 그림으로 살펴보겠습니다.

  • 저 물음표에는 세모와 동그라미 중에 어떤게 들어갈까요?

  • 최근접 이웃 알고리즘은 "?" 의 주변에 있는 것이 세모이기 때문에 세모라고 판단하는 알고리즘 입니다. 매우 간단하고 직관적인 알고리즘 입니다.

  • 하지만 단순히 가장 가까이에 있는 것과 같게 선택하는 것이 옳은 분류가 될까요? 다음 경우를 살펴보겠습니다.

  • '?' 에서 가장 가까운 것은 파란 동그라미 입니다. 하지만 조금만 더 넓혀서 본다면 뭔가 부적절하다는 것이 느껴집니다.

  • 이렇기 때문에 단순히 주변에 무엇이 가장 가까이 있는가를 보는 것이 아니라 주변에 있는 몇개의 것들을 같이 봐서 가장 많은 것을 골라내는 방식을 사용하게 됩니다. 이 방식을 KNN 이라고 부릅니다. KNN 에서 K 는 주변의 개수를 의미합니다.

  • K 가 1일때는 '?' 를 파란 동그라미라고 판단하겠지만 K 를 4로 변경한다면 빨간 세모라고 판단할 것입니다.

  • 하지만 문제가 하나 있습니다. 과연 K 는 몇이어야 좋은 것일까. 최선의 k값을 선택하는 것은 데이터마다 다르게 접근해야합니다. 일반적으로 k 값이 커질수록 분류에서 이상치의 영향이 줄어들지만 분류자체를 못하게 되는 상황이 발생합니다. 일반적으로는 총데이터의 제곱근값을 사용하고 있으며 최적의 k 값을 찾기 위한 연구는 아직도 진행중입니다.



지도학습 알고리즘 - 예제1 - 토마토 분류

  • 아래의 사진은 음식을 당도와 아삭함으로 구분한 예제 입니다.

  • 토마토는 6,4 의 데이터를 가지고 있습니다. 과일, 단백질, 채소 중에 어떤 부분에 분류될까요?

  • 다음 테이블은 토마토의 예측 결과표 입니다. k 의 값의 변화에 따라 예측이 달라지는 것을 알 수 있습니다.



  • 사실 토마토는 채소인데 당도와 아삭함으로 구별해보았을 때는 과일이나 단백질로 주로 나오는 걸 알 수 있습니다. 보통 사람들이 처음에 토마토가 채소라는 것을 알고 놀라는 것을 보면 적절하게 분류했다고 할 수도 있을까요?


지도학습 알고리즘 - 예제2 -  암진단

  • 두번째 예제는 암진단 데이터 입니다. 데이터는 이곳 에서 받으시거나 확인하실 수 있습니다. 이 데이터는 32개의 컬럼을 가지고 있습니다. 그중 첫번째는 ID 이기 때문에 제외하고 두번째는 종속변수인 것을 고려하면 30개의 독립변수가 있는 것입니다. 첫번째 예제처럼 독립변수가 2개 정도라면 사람이 손으로도 구할 수 있으며 그래프를 그렸을 경우에는 더욱 직관적으로 이해할 수 있습니다. 하지만 이와 같이 컬럼이 30개가 된다면 머리로 계산해내는 것은 쉽지 않습니다.
  • 총 569 개의 세포 정보가 입력 되어 있는데, 이 한정된 자료로 효과적인 모델을 만들어야 합니다. 추가 자료가 있다면 569개의 정보를 모두 모델 생성과정에 사용할 수 있겠지만 자료가 없다면 이 자료를 TRAIN 데이터와 TEST 데이터로 나누어 사용해야 보다 일반적인 모델을 만들 수 있습니다. 다시 말하지만 우리의 목적은 "레이블이 없는 데이터를 예측하는 것" 입니다.
  • 1번부터 469번까지를 TRAIN 데이터로, 나머지 데이터를 TEST 데이터로 구성 한 뒤 KNN 알고리즘을 이용해서 분석해보았습니다.
  • R 을 통해 분석한 결과 Cross Table 입니다. 세로는 실제 Test 데이터의 레이블, 가로는 예상 레이블 입니다. 
    • 좌상단의 61 이라는 숫자는 실제로 악성인데 예상도 악성인 것
    • 우상단의 0 은 실제로 악성인데 음성이라고 예상한 것
    • 좌하단의 4 는 실제로 음성인데 악성이라고 예상한 것
    • 우하단의 35 는 실제로 음성이고 예상도 음성인 것을 말합니다.
  • 따라서 96개는 제대로 분류 했고 4개는 잘못 분류 했기 때문에 정확도 96%의 모델이라고 말할 수 있습니다.
  • 이번 예제의 경우에는 정확도가 높게 나왔지만 낮게 나왔을 경우 높이는 여러 방법들이 있습니다. Z - 점수 표준화 방법, 데이터 셔플 등 여러 기술을 통해 정확도를 높이는 방법들이 있습니다.


댓글12

  • :) 2018.11.19 11:49

    좋은글 감사합니다
    답글

  • ds 2019.03.08 14:04

    토마토 분류 예제 결과표에서 질문이 있습니다.
    k의 수를 높여갈때 분류되는 종류(과일,채소,단백질)들의 수가 같으면 어떤기준으로 분류가 되나요?
    k9,k10에서가 이해가 잘안돼서요
    답글

    • Gom Guard 2019.03.08 14:07 신고

      ds 님 안녕하세요.

      숫자가 같은 방법을 해결 하기 위해서 많은 이론들이 있습니다만 대표적으로 거리별로 가중치를 주어서 해결하는 방식이 있습니다.

      가중치를 주는 방식도 천차만별일 수 있고 데이터 마다 다를 수 있겠지요.

      ds 님께서 차후 적용시에는 더 다양하게 고민하셔서 적용하시면 될 것 같습니다. ^^

      어떤 값을 분류하기가 애매한 경우에는 실제로 사람이 분류하기도 어려운 법이니까요.

  • ds 2019.03.08 14:41

    빠른 답변 감사드립니다.
    혹시 본 예제의 경우는 어떤식으로 가중치를 주어서 나온 결과인지 알수 있을까요??
    답글

    • Gom Guard 2019.03.08 14:52 신고

      제가 사용했던 모델은 개수가 많은 것을 기본으로 하되 같은 경우에는 랜덤하게 추출하는 모델을 사용했었던걸로 기억합니다.

  • :D 2019.05.17 00:28

    좋은 글 감사합니다! Knn 알고리즘 공부중인데 도움 많이 되었습니다!
    답글

    • Gom Guard 2019.10.21 07:05 신고

      :D님.
      안녕하세요. ^^

      좋은 댓글 달아주셔서 감사합니다. 도움이 되어 저도 참 기분이 좋네요 ^^

      좋은 하루 보내세요~~

  • Rampazy 2019.10.21 06:38

    학교 전공이라 공부중인데 저희 교수님보다 훨씬 설명 잘하시는 것 같습니다
    좋은 글 감사합니다
    답글

    • Gom Guard 2019.10.21 07:04 신고

      Rampazy 님 안녕하세요.
      이른 새벽부터 행복한 댓글 감사합니다. ^^

      도움이 되어 다행이네요.

      좋은 하루 되세요~ 감사합니다~

  • passingby 2020.01.22 12:10

    안녕하세요, knn 공부 중에 들어왔습니다. 쉬운 정리 감사합니다.
    오타가 하나 있는 것 같은데, benign과 malignant는 각각 양성과 음성(악성)으로,
    설명에는 반대로 적혀 있는 것 같습니다 :)
    답글

  • 게으름 2020.06.09 12:02

    좋은 정보 감사합니다. 어디서 부터 배워야할 지 몰라 막막했는데 정말 쉽게 설명해주셔서 조금이나마 이해할 수 있었습니다.
    답글

  • 블루벨 2020.06.18 15:47

    좋은 정보 감사드립니다!
    답글