이론적으로 차원의 저주를 해결하는 해결책 하나는 훈련 세트의 크기를 키우는 것이다. 데이터의 차원이 높다면 그만큼 많은 샘플을 수집하면 된다. 듣기에는 간단해 보이지만 실상은 그렇지 않다. 차원 수가 커짐에 따라 필요한 샘플 수는 기하급수적으로 늘어나기 때문에, 고차원 데이터에서 이 기준을 맞추기는 불가능에 가깝다. 따라서 우리는 차원 축소라는 방법을 택한다. 차원 축소(Demension Reduction)란 피처의 정보 손실을 최소화하면서 낮은 차원의 새로운 피처로 변환하는 과정을 의미한다.
주성분 분석(Principal Component Analysis)
대표적인 차원 축소 기법으로 주성분 분석(Principal Component Analysis; PCA)이 있다. 주성분 분석을 이해하기 위해서는 특이값 분해 과정을 이해해야 한다. 특이값 분해(Singular Value Decomposition; SVD)는 간단히 말해 어떤 직사각형 행렬을 다른 세 개의 행렬로 분해할 수 있다는 것인데, 행렬의 차원을 축소하거나 데이터를 더 효율적으로 표현하기 위해 사용된다. 특이값 분해에 대한 자세한 설명은 아래 포스팅에서 확인할 수 있다.
특이값 분해(Singular Value Decomposition)
특이값 분해(Singular Value Decomposition; SVD)는 임의의 행렬을 세 개의 다른 행렬로 분해하는 기법으로, 특이값 분해를 살펴보기 앞서 고유값 분해의 개념을 먼저 이해하는 것이 좋다. 고유값 분해(E
ndyakwon.tistory.com
주성분 분석은 기본적으로 투영(Projection)으로 이해할 수 있다. 대부분의 학습 데이터셋은 고차원 공간에서 저차원 부분공간(Subspace)에 위치하게 된다. 이는 고차원의 데이터의 일부 피처만으로 데이터를 표현할 수 있음을 의미한다. 아래 그림은 3차원 데이터를 2차원 부분공간으로 투영시킨 모습을 보여준다. 이처럼 PCA는 $p$차원의 $X$를 어떤 $d(d<p)$차원의 공간에 프로젝션하는 과정이라 볼 수 있다.
그렇다면 데이터를 어떤 공간에 투영시켜야 기존의 데이터를 잘 유지할 수 있을까? PCA는 분산을 최대로 설명하는 공간에 데이터를 투영한다. 즉, 데이터의 분산이 가장 큰 방향으로 데이터를 압축하면 데이터의 핵심 구조를 유지하면서도 차원을 줄일 수 있다.
$$Z_{i} = \beta_{i}^\top \mathbf{X} = \beta_{i1} X_{1} + \beta_{i2} X_{2} + \cdots + \beta_{ip} X_{p}$$
주성분 $Z_{i}$는 $X$들의 선형 결합으로 표현되며, 이때 $\beta$는 $X$들을 다른 벡터 공간으로 매핑하는 역할을 한다. $\beta$는 선형 결합의 분산을 최대로 하는 값이며, 서로 직교(orthogonal)한다. 따라서 첫 번째 주성분은 가장 큰 분산을 설명하고, 두 번째 주성분은 첫 번째 주성분과 직교하며 남은 분산에서 가장 큰 부분을 설명한다.
$$\beta_{i} = \text{argmax}_{\beta \in R^{p}} \text{var}(\beta^\top \mathbf{X})$$
계산 과정
$\beta^\top \mathbf{X}$의 분산을 최대로하는 $\beta$를 구하는 것은 곧, $\beta^\top \text{var}(\mathbf{X}) \beta$를 최대로 하는 $\beta$를 구하는 것과 동일하므로 아래와 같은 최적화 문제를 도출할 수 있다. 여기서 $\Sigma$는 $\mathbf{X}$의 공분산 행렬이다.
$$\text{maximize} \ \text{var}(\beta^\top \mathbf{X}) = \beta^\top \Sigma \beta ,\quad \text{subject to}\; || \beta || = 1$$
최적화 문제를 풀기 위해, 고유값 분해(EVD)를 사용한다. 공분산 행렬 $\Sigma$는 대칭 행렬이므로 다음과 같이 표현할 수 있다.
$$\Sigma\beta = \lambda\beta$$
$\lambda$는 공분산 행렬의 고유값이고, $\beta$는 고유 벡터이다. 공분산 행렬의 고유 벡터는 데이터가 어떤 방향으로 분산되어 있는지를 나타내며, 고유값이 클수록 해당 방향의 분산이 크다는 것을 의미한다. 따라서 첫 번째 주성분 $\beta_1$은 가장 큰 고유값 $\lambda_1$에 대응하는 고유 벡터로 설정되며, 이후의 주성분들은 두 번째로 큰 고유값, 세 번째로 큰 고유값에 대응하는 고유 벡터로 정의된다.
한편, 공분산 행렬은 아래와 같이 구할 수 있다.
$$\Sigma = \frac{1}{n}\sum(X_{i}-\bar{X}) (X_{i}-\bar{X})^\top = \frac{1}{n}\tilde{X}^\top\tilde{X}$$
데이터 차원이 매우 클 때는 공분산 행렬을 구하는 것이 어려워진다. 이때 특이값 분해(SVD)를 사용하면 공분산 행렬을 구하지 않고도 PCA를 계산할 수 있다. SVD는 데이터 행렬 $\tilde{X}$를 다음과 같이 분해한다.
$$\tilde{X}=U D V^\top$$
이때 D는 $\sqrt{\lambda_{i}}$를 대각 원소로 하는 행렬이며, $\lambda_{i}$는 $\tilde{X}\tilde{X}^\top$의 고유값이다. SVD의 결과로 얻은 $U$ 행렬의 열들은 PCA의 주성분으로 해석될 수 있다.
Reference
Aurélien Géron, Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow
박유성, 파이썬을 이용한 통계적 머신러닝