최근 feature가 많은 정형 데이터를 다루다 보니, 어떻게 하면 효과적인 모델링을 할 수 있을 지 살펴보던 중 차원 축소 내용을 정리할 필요가 있다고 생각하여 정리해보려고 합니다. 다른 분들에게도 해당 글이 도움이 되셨으면 좋겠습니다. 이번 포스팅에서는 차원 축소에 대한 소개와 PCA, LDA, SVD에 대해 간단하게 설명합니다.
1. 차원 축소
차원 축소는 많은 feature를 가진 데이터의 차원을 축소해서 새로운 차원의 데이터를 구성하는 것입니다. 여기서, 축소라는 단어에서 알 수 있듯이 고차원의 데이터를 저차원의 데이터로 만듭니다. 일반적으로 차원이 증가하면, 데이터 간의 거리가 기하급수적으로 증가하게 되어 희소한 구조를 가지게 됩니다. 또한 feature가 많을 때에는 feature 끼리의 상관관계가 높을 수 있습니다. 이러한 현상은 다중공선성의 문제를 일으킬 수 있습니다. 이로 인해, 예측 성능 저하로 이어지게 됩니다. 그리고 고차원의 데이터는 시각화가 어렵지만, 저차원인 3차원 이하로 만들었을 때에는 눈으로 보고 판단하기 쉬워질 수 있으므로 차원 축소를 하는 것이 좋습니다. 다만, 차원 축소를 했을 때, 데이터 손실이 발생하는 단점이 있습니다. 그렇다면 차원 축소에는 어떤 것들이 있을까요?
차원 축소는 크게 feature 선택, feature 추출로 나눌 수 있습니다.
먼저, feature 선택은 위에서 말한 것과 같이 다중공선성의 문제를 일으키는 feature를 제거하는 방식을 말합니다. 데이터를 대변할 수 있는 대표적인 feature들을 선택하는 것이죠.
두 번째, feature 추출은 고차원의 데이터를 기존 feature와 전혀 다른 형태로 압축하는 것을 말합니다. 기존의 데이터 공간이 아닌, 새로운 공간으로 옮겨오는 것을 말합니다. 이러한 방법은 데이터를 더 잘 설명할 수 있는 잠재적인 요소(Latent Factor)를 추출합니다. 대표적인 알고리즘에는 PCA, SVD, NMF 등이 존재합니다. 이러한 알고리즘은 단순히 정형데이터에서만 알고리즘들이 사용되지 않고 이미지, 텍스트(SVD, NMF)에서도 차원 축소를 통해 예측 성능을 높이기도 합니다.
한 가지 예를 들어보겠습니다. 한 축구선수가 있다고 해봅시다. 흔히, FIFA 게임을 해보셨다면, 캐릭터의 능력치가 대분류와 소분류로 나뉘는 것을 아실 겁니다. 신체적 능력치에는 속력, 가속력, 점프, 밸런스와 같은 신체적 능력치를 나타내는 요소들이 존재합니다. 보통 게임을 할 때, 신체적 능력치 전체를 보기 보단 속력, 가속력이 빠른 선수를 먼저 찾는 편이죠. 이처럼 특정 feature인 속력, 가속력을 선수 선정에 중요한 feature로 선택할 수 있을 겁니다. 반대로, 이러한 세부 feature들을 하나의 score인 신체적 능력치라 표현하는 것은 feature 추출에 해당할 수 있습니다. 각 feature들이 또 다른 feature로 압축되었기 때문이죠.
어느 정도 차원 축소에 대한 내용을 이해하셨다면, 이어서 다양한 차원 축소 알고리즘에 대해 배워봅시다.
2. PCA(Principal Component Analysis)
PCA는 변수끼리의 상관관계를 활용해서 대표하는 성분을 추출하는 차원 축소하는 방법으로, 주성분 분석이라고 부릅니다. PCA의 원리는 가장 높은 분산을 갖는 데이터 축으로 차원을 축소합니다. 그래서 가장 높은 분산을 갖는 데이터로 첫번째 축을 설정하게 되고, 첫번째 축과 직교하는 또 다른 축을 두번째로 설정하게 됩니다. 이와 같이 연속적으로 직교하는 벡터들로 축을 생성하여 원하는 차원으로 축소시키게 됩니다. PCA는 공분산 행렬을 고유벡터와 고유값으로 분해하여, 고유값이 큰 순으로 고유벡터를 추출해서 데이터를 압축하는 과정입니다. 조금 더 디테일한 내용을 위해서는 선형대수학에서 나오는 determinant, 고유값, 고유벡터, 고유값 분해, 직교행렬, 대각 행렬 등의 개념이 필요합니다. 해당 내용은 여기에 담기에 너무 많으므로, 다음 포스팅에서 자세히 다뤄보도록 하겠습니다.
PCA는 변수간의 상관관계를 통해서 차원을 축소하기 때문에 변수의 scale의 영향을 많이 받습니다. 그렇기 때문에 PCA를 활용하기 전에는 변수에 대해 scaler를 반드시 적용해줘야 합니다. PCA로 변환된 주성분은 해석하기 어렵다는 단점이 존재합니다.
3. LDA(Linear Discriminant Analysis)
LDA는 선형 판별 분석법이라고 불리는데, PCA와 다르게 클래스를 잘 분리할 수 있는 축을 찾아서 차원을 축소합니다. 위의 그림처럼 파란색과 빨간색의 클래스를 분류해야 한다고 했을 때, 오른쪽의 검은색 축을 찾아서 차원 축소하게 됩니다. 이 때, LDA는 클래스 간의 분산은 크게하면서, 클래스 내부 분산은 작게 만드는 방식으로 차원을 축소합니다. 그래서 PCA에서 활용한 공분산 행렬이 아닌, 클래스 간의 분산 행렬과 클래스 내부 분산 행렬을 만들어서 고유벡터를 구합니다. PCA와 다른 점은 고유값 분해를 하는 대상의 행렬이 다르다는 점입니다.
4. SVD(Singular Value Decomposition)
SVD는 PCA와 유사한 행렬 분해 기법을 이용합니다. PCA는 $n \times n$의 정방 행렬만 분해할 수 있지만, SVD의 경우에는 행과 열의 개수가 다른 행렬에도 적용이 가능합니다. 고유값 분해를 다양한 케이스에도 적용가능하도록 한 것이 SVD입니다. SVD는 인위적으로 더 적은 크기로 분해하기 때문에, 다시 원래의 행렬로 원복하기는 어려운 특징이 있습니다. SVD는 차원 축소에서도 활용되지만, 인공지능 모델 경량화에서도 자주 활용되는 방법입니다. 고유값 분해와 SVD에 대한 선형대수학 내용은 다음 포스팅에 자세하게 작성하도록 하겠습니다.
5. 정리
차원 축소는 고차원에서 저차원으로 축소하는 방법입니다. 차원 축소를 통해, 계산량을 줄이고 다중공선성 문제를 해결할 수 있습니다. 하지만, 차원 축소를 한 만큼 실제 데이터의 소실을 잃게 된다는 단점이 존재합니다. PCA, LDA, SVD 등 다양한 차원 축소 방법이 존재하지만, 공통적으로 선형대수학에서 활용되는 고유값 분해(Eigen Value Decomposition), 특잇값 분해(Singular Value Decomposition)를 활용하고 있습니다. 이번 포스팅에서는 각 방법들이 어떤 차이가 있는지 간략하게 알아봤습니다. 다음 포스팅에서는 차원 축소 방법들의 기초가 되는 선형대수학 내용들을 설명하고, 직접 데이터에 적용하여 어떤 차이가 있는지 살펴보도록 하겠습니다.