- 데이터 분류에 사용되는 아주 간단한 지도학습 알고리즘
- 상대적으로 이해하기 쉽지만, 다른 알고리즘에 비해서 연산 속도가 느리다.
k-최근접 이웃 알고리즘의 이해
- 핵심은 '이웃'
- 이웃은 나와 가까운 거리에 사는 사람들을 뜻함
- 알고리즘에서 이웃이란 가까이 존재하는 데이터들을 의미
- 따라서 kNN 알고리즘이란 현재 데이터를 특정값으로 분류하기 위해 기존 데이터 안에서 현재 데이터로부터 가까운 k개의 데이터를 찾아 k개의 레이블 중 가장 많이 분류된 값으로 현재의 데이터를 분류하는 알고리즘
- 예시
- 만약 서울 어딘가에 데려다 놓고 이곳이 강남인지 강북인지 알려면?
- 주변에 보이는 가까운 사람들에게 똑같은 질문을 던져서 많은 답을 얻은 쪽으로 대답하는 한다.
- 주변 5명에게 물어 4명이 강남, 1명이 강북이라고 대답했다면 지금 현재 위치는 강남으로 분류하는 것
- 다섯 명에게 물었기 때문에 k=5인 kNN 알고리즘을 사용한 것.
- 즉, kNN 알고리즘의 k는 몇 개의 이웃을 살펴볼 것인지 나타내는 변수이고, NN이란 현재 알고자 하는 데이터로부터 근접한 데이터를 의미.
- 강남/강북 문제와 같은 이진 분류를 할 때는 과반수의 대답을 얻기 위해 k를 홀수로 지정하는 것이 좋다.
강남, 강북 예제는 실제로 나와 주변 사람까지의 거리를 잴 수 있기 때문에 최근접 이웃을 찾는 과정이 어렵지 않았다. 하지만 위치(현실 공간) 데이터가 없는 예측/분류 문제에는 어떻게 kNN 알고리즘을 적용할 수 있을까?
kNN 알고리즘을 포함한 대다수의 머신러닝 알고리즘에서 사용되는 공간이라는 개념은 사실 벡터 공간을 의미한다.
- 현실 공간 : 평면 이동 및 수직 이동이 가능한 3차원 공간
- 벡터 공간 : 벡터 연산이 가능한 N차원 공간
kNN 알고리즘은 k(탐색할 이웃의 개수)에 따라 데이터를 다르게 예측할 수도 있다.
- 보통 k는 1로 설정하지 않음.
- 그 이유는 하나의 이웃으로 현재 데이터를 판단하기에는 정보가 너무 한쪽으로 편향돼 있기 때문.
- k는 보통 홀수로 설정한다.
- 그 이유는 k가 짝수일 경우 과반수 이상의 이웃이 나오지 않을 수 있기 때문.
최적의 k를 찾기 위해서는 보통 검증 데이터를 통해 가장 정확도가 높은 k를 알고리즘의 k로 선정한다.
다중 분류
- 이진 분류(binary classification) : 두 가지 중 하나를 분류하는 경우
- 다중 분류(multiclass classification) : 여러 개의 가능한 레이블 중 하나로 분류하는 경우
kNN 알고리즘은 다중 분류에도 활용이 가능하다!
kNN 알고리즘의 수학적 이해
kNN 알고리즘은 데이터의 속성으로 만들어진 벡터 공간 속에서 새로운 데이터와 기존 데이터와의 거리를 계산해서 가장 가까운 이웃부터 먼 이웃까지 판단한 후 가장 가까운 이웃부터 두 번째로 가까운 이웃, ..., k번째로 가까운 이웃의 레이블을 측정해서 가장 많이 측정된 레이블로 새로운 데이터를 분류하는 알고리즘이다.
- 점과 점 사이의 거리를 구하는 법
- 피타고라스의 정리
kNN 알고리즘의 장점과 단점
장점
- 다른 머신러닝 알고리즘보다 이해하기가 상당히 쉽다.
- 수학적으로 거리를 계산하는 방법만 알면 이해하기 쉽다.
- 숫자로 구분된 속성에 우수한 성능을 보인다.
- 거리, 횟수, 점수와 같이 수치화된 데이터
- 별도의 모델 학습이 필요없다.
- 이러한 특성을 게으른 학습(lazy learning)이라고 한다.
- 게으른 학습은 데이터베이스의 실시간 데이터를 사용해야 할 때 유용하다.
단점
- 예측 속도가 느리다.
- 예측할 때마다 전체 데이터와의 거리를 계산하기 때문
- 비교할 속성이 많아질수록 연산 속도는 더 느려진다.
- 다른 머신러닝 알고리즘에 비해 예측값이 지역 정보에 많이 편향될 수 있다.
- 다른 머신러닝 알고리즘은 예측값이 기존의 전체 데이터에서 학습된 모델에서 나온다.
- kNN 알고리즘은 오직 가까운 이웃을 통해 예측한다.
- 아무리 좋은 데이터를 가지고 있더라도 k의 개수가 적거나 몇 개의 예외적인 데이터가 이웃으로 존재할 경우 예측값이 틀릴 가능성이 높아진다.
결론
k-최근접 이웃 알고리즘과 조금은 친해졌다!
이제는 이웃사촌까지는 아니어도 이웃이라고는 할 수 있지 않을까?
친구 따라 강남 간다는 옛 성현들의 지혜를 다시 한번 되새기면서 오늘의 블로그 글을 마친다.
실습
- 2017 NBA 농구선수 데이터를 활용해 선수의 포지션을 예측해봤다.
- 코드 보러 가기
참고자료
'공부하며 기록하기' 카테고리의 다른 글
파이썬으로 코호트 분석해 보기 (0) | 2022.03.19 |
---|---|
[주피터 노트북]머신러닝으로 Iris 품종 분류해보기 (0) | 2021.01.08 |
[노션] 인터넷에 있는 각종 정보를 노션으로 스크랩해 보자! (0) | 2020.10.31 |