My Data Story

[분류] K 최근접 이웃(KNN) 본문

Machine Learning/2. 지도 학습 알고리즘

[분류] K 최근접 이웃(KNN)

Hwasss 2021. 8. 9. 01:05
728x90

 '서포프 벡터 머신' 목차 ◈ 

1. K 최근접 이웃 (KNN)

     - KNN 개념에 대해 살펴보고, KNN 적용 시 고려해야 하는 사항을 알아보자.


1. KNN 개념

KNN 알고리즘의 아이디어는 아주 간단하다. 

 

step1

특징들이 가장 유사한 (즉 예측 변수들이 유사한) K개의 레코드를 찾는다.

 

step2

분류 : 유사한 레코드들 중에 다수가 속한 클래스가 무엇인지 찾은 후에 새로운 레코드를 그 클래스에 할당한다. 

예측 : 유사한 레코드들의 평균을 찾아서 새로운 레코드에 대한 예측값으로 사용한다.

 

분류 문제에서 KNN을 활용 할 경우 결과값을 클래스값 대신 클래스 추정 확률로 낼 수 있다.

K개의 가장 가까운 점들이 속한 클래스의 비율을 각 클래스의 추정 확률로 정할 수 있다.

클래스 추정 확률을 사용하면 간단한 다수결 투표와 다른 분류 규칙을 만들어 낼 수 있다.

이는 특히 불균형 문제를 다룰 때 중요하다. 예를 들어 희귀한 클래스의 데이터를 잘 분류하는 것이 목표라면 컷오프는 보통 50% 미만이 되어야 할 것이다. 희귀한 사건에 대한 확률을 컷 오프로 정하는 것은 매우 일반적인 방법이다.

 

KNN은 가장 간단한 예측/분류 방법 중 하나이다. 회귀와는 달리 모델을 피팅하는 과정이 필요 없다. 

그렇다고 KNN이 완전 자동화된 방법이란 것은 아니다.  

특징들이 어떤 척도에 존재하는 지, 가까운 정도를 어떻게 특정할 지, K를 어떻게 설정할 것인지에 따라 예측 결과가 달라진다. 

 

2. 레코드 간의 유사성

레코드 간의 유사성은 거리 지표를 통해 결정된다.

 

두 벡터 사이에 가장 많이 사용되는 지표는 유클리드 거리이다. 

 

 

또 다음으로 많이 사용되는 지표는 맨하탄 거리이다. 

 

 

수치 데이터를 다룰 때, 마할라노비스 거리를 사용하면 두 변수의 상관 관계를 사용하는 장점이 있다. 두 변수 사이에 높은 상관관계가 있다면 아주 유용하다. 하지만 공분산 행렬을 활용하여 계산이 필요하고 복잡성이 증가한다.

 

두 벡터 사이의 거리를 측정할 때, 상대적으로 큰 스케일에서 측정된 변수들이 측정치에 미치는 영향이 크다. 

따라서 데이터 표준화(스케일 조정)를 통해 이 문제를 해결할 수 있다. 

 

3. KNN 사용을 위한 전처리

3.1 원-핫 인코딩

KNN 은 거리 기반의 계산을 활용한 알고리즘이기 때문에, 예측 변수 중 명목형 변수가 존재한다면 수치형으로 변형해주어야 한다.

명목형 변수를 수치형 변수로 바꾸기 위해 자주 사용하는 기법이 원-핫 인코딩이다. 선형 회귀나 로지스틱 회귀에서 원-핫 인코딩은 다중 공선성과 관련된 문제를 일으키지만 KNN이나 다른 알고리즘에서는 문제가 되지 않아 편하게 원-핫 인코딩을 사용하면 된다. 

 

 

3.2 데이터 표준화

레코드 간의 유사성 측정은 두 벡터 사이의 거리 계산을 통해 측정한다. 이는 상대적으로 큰 스케일에서 측정된 변수들이 측정치에 미치는 영향이 클 수 있음을 의미한다. 이러한 문제는 데이터 표준화(스케일 조정)를 통해 해결할 수 있다. 표준화 과정을 적용하게 되면, 각 변수가 예측력 측면에서 갖는 중요성이 모두 같다는 의미를 내포하게 된다. KNN에서는 데이터를 미리 표준화하는 것이 필수이다. 

 

데이터 표준화하는 방법은 다양하게 존재한다.

그 중 StandardScaler()를 활용한 정규화는 모든 변수에서 평균을 빼고 표준 편차로 나누는 과정을 통해 변수들을 모두 비슷한 스케일에 놓는다. 이때 평균 대신 중간값 같은 좀 더 로버스트한 위치 추정값을 사용할 수 있다. 마찬가지로 표준 편차 대신 사분위 범위와 같은 다른 척도 추정 방법도 사용할 수 있다.

 

가끔은 변수를 0과 1사이로 축소하는 것이 무리한 것처럼 보인다.

단위 분산을 갖도록 모든 변수를 조정하는 것이 다소 억지스러울 수 있다는 것을 인식해야 한다.

이는 각 변수가 예측력 측면에서 갖는 중요성이 모두 같다는 것을 의미한다. 

 

cf. 정규화(표준화) 과정은 기존 데이터의 분포에 영향을 미치지 않는다. 

      데이터의 분포가 원래 정규 분포가 아니라면, 정규화한다고 해서 정규 분포 형태가 되는 것은 아니다. 

 

4. K 선택하기

 K를 잘 선택하는 것은 KNN 성능을 결정하는 중요한 요소이다. 

일반적으로 K가 너무 작으면 데이터의 노이즈 성분까지 고려하는 오버피팅 문제가 발생한다. 

K값이 클수록 결정함수를 좀 더 부드럽게 하는 효과를 가져와 학습 데이터에서의 오버피팅 위험을 낮출 수 있다.

하지만 K값이 너무 크면 결정 함수가 너무 과하게 평탄화되어 데이터의 지역 정보를 예측하는 KNN의 기능을 잃어 버리게 된다. 

 

오버피팅과 오버 스무딩  사이의 균형을 맞춘 최적의 K값을 찾기 위해 정확도 지표를 사용한다.

홀드 아웃 데이터 (타당성 검사를 위해 따로 떼어놓은 데이터)에서 정확도를 측정하여 K값을 결정하는 데 사용한다.

(물론 최적의 K값을 결정하는 일반적인 규칙은 없다.)

 

데이터에 노이즈가 없고 잘 구조화된 데이터의 경우 K값이 작을 수록 잘 동작한다. 

데이터에 노이즈가 많은 데이터의 경우, K값이 클 수록 좋다. 

(-> 최적 K값을 결정하기 앞 서, 데이터 전처리를 통해 최대한 노이즈를 줄이는 것이 중요할 것 같다.)

 

보통 동률이 나오는 것을 방지하기 위해 K값을 홀수로 정하거나 데이터 수의 제곱급 만큼 설정하기도 한다. 

 

5. KNN을 통한 피처 엔지니어링 

KNN은 구현이 간단하고 직관적이지만 성능면에서 다른 분류 방법에 비해 경쟁력이 떨어진다. 

하지만 다른 분류 방법들의 특정 단계에서 사용할 수 있도록 모델의 '지역적 정보'를 추가하기 위해 KNN 을 활용하기도 한다. 

 

step1

KNN은 데이터 기반하여 분류 결과 (클래스에 속할 확률)을 얻는다. 

 

step2

이 결과는 해당 레코드에 새로운 특징을 추가한다.

이 결과를 다른 분류 방법에 사용한다. 

원래의 예측 변수들을 2번씩 사용하는 셈이다.

 

여기서 어떤 예측 변수들을 두 번씩 사용한다는 것이 다중 공선성 문제를 야기하지 않을까 궁금할 수 있다. 

하지만 이는 문제가 되지 않는다. 

소수의 근접한 레코드들로부터 얻은 매우 지협적인 정보이기 때문에 새로운 정보는 불필요하거나 중복성이 있지 않다.

 

KNN을 이런 식으로 분류 단계의 일부로 사용하는 것은 마치 여러 가지의 모델링 방법을 합쳐 하나의 예측 결과를 만들어 내는 앙상블 학습  형태로 볼 수도 있다. 또한 예측 능력을 높이기 위해 피처들을 새롭게 만들어 내는 '피처 엔지니어링' 이라고 볼 수 있다.