본문 바로가기

파이썬/머신러닝

차원의 저주 개념, 발생 원인과 해결 방법

머신러닝에서 훈련 샘플이 수백, 수천만개 특성을 갖고 있으면 훈련이 느리고 좋은 결과값을 얻기도 다소 어렵다. 이를 차원의 저주라고 부른다.

 

 

오늘 포스팅에서는 차원의 저주에 대해 자세히 다뤄보겠다.

 

 

차원의 저주란?

 

차원의 저주란 차원이 증가하면서 학습데이터 수가 차원 수보다 적어져서 성능이 저하되는 현상을 일컫는다. 차원이 증가할수록 변수가 증가하고, 개별 차원 내에서 학습할 데이터 수가 적어진다. 

 

 

이때 주의할 점은 변수가 증가한다고 반드시 차원의 저주가 발생하는 것은 아니다. 관측치보다 변수 수가 많아지는 경우에 차원의 저주 문제가 발생하는 것이다.

 

 

출처: minye-lee19.gitbook.io

위 그림에서 보는 것과 같이 차원이 증가할수록 빈 공간이 많아진다.

 

 

같은 데이터지만 1차원에서는 데이터 밀도가 촘촘했던 것이 2차원, 3차원으로 차원이 커질수록 점점 데이터 간 거리가 멀어진다. 이렇게 차원이 증가하면 빈 공간이 생기는데 빈 공간은 컴퓨터에서 0으로 채워진 공간이다. 즉, 정보가 없는 공간이기 때문에 빈 공간이 많을수록 학습 시켰을 때 모델 성능이 저하될 수밖에 없다.

 

 

고차원 공간은 이렇게 공간이 많아 훈련 데이터가 서로 멀리 떨어져 있고 새로운 샘플도 훈련 샘플과 멀리 떨어져 있을 가능성이 높다. 그렇기 때문에 예측을 위해서는 외삽법(=보외법)을 많이 사용해야 하는데 이러면 오버피팅 발생 가능성이 높다.

 

 

 

출처: 두산백과

 

외삽이란 이용가능한 자료의 범위가 한정되어 있어 그 범위 이상의 값을 구할 수 없을 때 관측된 값을 이용해 한계점 이상의 값을 추정하는 것을 의미한다. 위 그림에서는 A~B까지의 범위만 주어져 있을 때 P값을 이용해서 Q값을 예측하는 것이다. 당연히 예측 정확도가 떨어질 것이다.

 

 

 

이런 차원의 저주 문제에 치명적인 것이 바로 KNN이다. 

KNN(K-최근접 이웃)분류기 

 

 

차원이 커질 수록 주변 이웃들이 멀어지니 예측에 사용할 포인트 값이 한참 떨어져 있어 모델 성능도 나빠지고 설명력도 좋지 않게 된다.

 

 

차원의 저주 해결방법은?

 

이러한 차원의 저주 문제를 해결하기 위한 이론적인 해결책은 훈련 샘플의 밀도가 충분히 높아질 때까지 데이터를 모아서 훈련 세트의 크기를 키우는 것이다. 하지만 아쉽게도 일정 밀도에 도달하기 위해 필요한 훈련 샘플 수는 차원의 수가 커짐에 따라 기하급수적으로 늘어난다.

 

 

예를 들어 크기가 1인 2차원 평면에 0.1 거리 이내에 훈련 샘플을 모두 놓으려면 최소한 10 x 10 개의 샘플이 필요하다. 이를 100개의 차원으로 확장하면 10^100개의 훈련 샘플이 필요하다. 우주에 존자하는 원자 수가 10^80개라고 하니 사실상 불가능한 방법이라고 할 수 있다..ㅋㅋ 그렇기 때문에 현실적으로는 PCA와 같은 차원축소 기법을 이용해서 차원의 저주 문제를 해결한다.

 

 

특성 수를 크게 줄여 차원축소를 하면 훈련 속도가 빨라지고 시각화 하기에도 좋다. 다만 일부 정보가 유실되기 때문에 성능도 조금 나빠질 수 있다. 따라서 무작정 차원 축소를 하기 보다는 원본 데이터로 훈련해서 시간이 오래 걸리는지 확인하고 차원축소 필요 여부를 결정할 필요가 있다.