본문 바로가기
IT/ML

차원의 저주 KNN으로 쉽게 이해하기

by 모던네이쳐 2020. 8. 24.
728x90

 

차원의 저주(Curse of Dimensionality)

 

 간단히 말해, 데이터의 특징(feature)이 너무나도 많아서 알고리즘 성능 저하가 나타나는 현상을 일컫는다. 데이터를 학습시키는 근본적인 이유는 데이터 간의 경향성이나 어떤 패턴을 찾아 새로운 데이터에 대해서도 발견한 패턴을 적용하여 예측하기 위함이다. 하지만 데이터 셋(data set)이 고차원 공간(high-dimensional spaces)을 가지고 있다면 데이터 간 거리가 멀어져 비슷한 특징을 가지는 패턴이나 클러스터를 찾기 더 어려워진다.

 

 

K-최근접 이웃(KNN, K-Nearest Neighbor)

 새로운 데이터를 예측하고자 할 때, 기존 데이터들 중 가장 특성이 비슷한(거리가 가까운) K개의 데이터의 평균으로 예측치를 내는 방법이다.

 

KNN(K-Nearest Neighbor)

 

차원이 커지면 생기는 현상

 차원이 커지면 근접한 이웃의 거리가 점점 멀어지게 된다. 아래 예시와 같이 ‘Sepal Width’라는 하나의 특성만을 사용하여 분류 예측을 하고자 하면 근처 데이터들이 많아 분류하기가 쉽다. 차원을 하나 더 늘려 ‘Sepal Length’로도 분류를 하게 되면 데이터 간 거리가 점차 생기는 것을 확인할 수 있다.

Iris Data with Different Dimensionality

 물론 이 예시와 같이 두 차원만으로 분류하는 것은 큰 문제가 되지 않지만 100차원, 1000차원이 넘는 데이터라면 데이터간의 거리가 상당히 멀어지게 된다. Joel Grus(Data Science from Scratch의 저자)의 말에 따르면 10,000개의 데이터를 대상으로 0차원에서 100차원으로 차원의 수를 늘려가면 두 데이터 간의 거리는 평균적으로 0.8까지 늘어나는 것을 볼 수 있다. 차원이 훨씬 커짐으로써 평균 거리가 1에 가깝게 되면 설명력이 그만큼 떨어지게 된다.

 

 

차원의 저주를 해결하는 법

  1. 더 많은 데이터를 모은다. 차원이 크더라도 엄청난 양의 데이터를 모을 수 있다면 데이터의 밀도가 높아져 특징을 좀 더 잘 설명해줄 수 있게 된다.
  2. 차원 축소의 방법을 사용한다. PCA(Principal Components Analysis) 등의 방법을 사용하여 특징의 개수를 축소시킬 수 있다.

 


 

참고로 iris data를 scatter plot으로 보고 싶으면 다음을 실행하면 된다.

 

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

iris = load_iris()
dataset = pd.DataFrame(data= np.c_[iris['data']], columns= iris['feature_names'])
dataset['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)

feature_columns = dataset.columns[:4]
X = dataset[feature_columns].values
y = dataset['species'].values

plt.figure()
ax = sns.pairplot(dataset, hue = 'species', size=3, markers=["o", "s", "D"])