top of page

머신러닝의 주성분 분석 (Principal Component Analysis)을 쉽게 이해하여 보자

scikit-learn과 같은 여러 파이썬 (Python) 패키지는 Principal Component Analysis (PCA, 주성분 분석)과 같은 여러 머신러닝 (또는 기계학습) 알고리즘 (algorithms)을 구현하여 만들어집니다. 그럼, 이런 알고리즘을 배워 보는 것은 어떨까요?


알고리즘의 결과 값을 기반으로 더 나은 결정을 하기 위하여 그 밑바닥에 깔린 수학적인 콘셉트를 이해하는 것이 알고리즘 자체를 “블랙박스” 같이 다루는 것보다 아주 중요합니다.


이 포스팅에서는 PCA 알고리즘의 주요 콘셉트인 Dimensionality Reduction (차원 축소), eigenvectors (고유벡터), eigenvalues (고윳값)등에 관하여 알아본 후 파이썬 (Python) 클래스를 구현하여 하나의 데이터 셋에 PCA 분석을 해 보겠습니다.



 

1. 차원 축소 (Dimensionality Reduction)


머신러닝의 많은 실제 문제들은 몇천개에서 몇백만개의 특성(feature)을 사용합니다. 이런 데이터 셋을 훈련에 이용하려면 계산적으로 아주 까다롭고 결과 솔루션을 이해하는 것도 다소 어렵습니다.


특성의 개수가 늘어나면서 포인트간 거리는 덜 명백해지고 가깝고 먼 거리를 분류하기가 어려워 지므로, 결과적으로 데이터의 양은 더 부족한 현상이 생기게 되며 메트릭 거리 (distance metrics)의 정보가 덜 유익해지게 됩니다. 이 현상을 차원의 저주 (curse of dimensionality)라고 하지요.


데이터가 부족하면 부족 할수록 만들어 지는 모델은 훈련시키기가 더 어렵고 기본 패턴이 아닌 노이즈를 포함시킨 과적합 (overfitting)을 하게되죠. 이렇게 되면 새롭고 미지의 데이터에 부적합한 일관화를 하게 됩니다.


차원 축소는 오리지널 정보를 최대한 유지하면서 변수또는 특성을 줄이기 위해 데이터 사이언스와 머신러닝 (기계학습)에 이용이 되고 있습니다. 이 기술은 계산의 효율성을 높이고 데이터의 시각화를 돕기위하여 복잡한 데이터 셋을 간단하게 변형하는 데에 유용합니다.


 

2. 주성분 분석 (PCA, Principal Component Analysis)은 어떻게 실행하나?


“차원의 저주”를 완화시키기 위해 아주 많이 사용되는 기술들 중 하나는 주성분 분석 (PCA, Principal Component Analysis)입니다. PCA는 데이터셋 중, 분산(variance)에 많은 변화를 주는 축을 찾아 가장 중요한 정보들만 추려내면서 특성의 개수를 줄이는 기술입니다. 이런 축 (axes)들을 주성분 (principal components)이라고 합니다


PCA는 예측은 하지 않지만 큰 분산(variance)의 값을 가지는 저차원적 대표의 데이터 셋을 찾는 것을 목표로하기 때문에 이 방법은 비지도학습 알고리즘 (unsupervised learning algorithm)에 속합니다.


그러나 왜 높은 분산의 값을 가지는 것이 중요한 정보를 가지는 것과 같을까요?


한 도시의 범죄 정보의 데이터셋을 분석한다고 가정해 봅시다. 이 데이터는 “사람을 상대로 한 범죄 - 부상이 있는 경우”, “사람을 상대로 한 범죄 - 부상이 없는 경우” 등의 많은 특성이 있습니다. 당연히 첫 번째의 특성이 많을 수록 두 번째의 특성도 많아지게 됩니다.

다시말하면, 위 예제의 두 특성은 상관관계가 높아서 여분을 줄이는 차원축소가 가능하죠.


PCA 알고리즘은 더 정교하게 이런 방법을 구현하는 것에 불과합니다.


이제는 PCA 알고리즘의 계산 방식을 단계별로 하나씩 쪼개어 알아보겠습니다.


1 단계: 데이터 중앙 배치


PCA는 데이터의 스케일에 영향을 받으므로 처음으로 해야할 일은 각 특성의 평균 값을 빼어 모든 특성들의 평균 값이 0이 되게 합니다.


image
오리지널 데이터 (왼쪽), 중앙으로 재배치된 데이터 (오른쪽)

2 단계: 공분산 행렬 (covariance matrix) 계산


이제는 공분산 행렬(covariance matrix)을 계산하여 데이터셋에서 어떤 특성의 짝이 같이 변하는지 알아보게 됩니다. 데이터셋이 n 개의 특성이 있다면 결과적으로 공분산 행렬의 사이즈 (모양)는 n x n이 됩니다.


아래의 이미지를 설명하자면, 상관관계가 높을 수록 빨간 색에 가깝습니다. 당연히 자기 자신의 특성과는 상관관계가 가장 높죠.


image
공분산 행렬의 Heatmap

3 단계: 고유값 분해 (eigenvalue decomposition)


다음에는 2단계에서 만들어진 공분산 행렬(covariance matrix)에 고유값 분해 (eigenvalue decomposition)를 행하게 됩니다. 공분산 행렬, Σ에 고유값 분해는 스칼라셋 (고유값)과 벡터 (고유벡터)를 다음과 같이 찾는 프로세스입니다:


image

Where:

  • Σ : n×n 공분산 행렬 (covariance matrix).

  • v : non-zero vector (고유벡터, eigenvector).

  • λ : 고유벡터 v에 속해있는 고유값 (eigenvalue).


고유벡터는 데이터 (주성분)의 최대 분산(variance)의 방향을 가리키고 고유값은 각 주성분의 고유벡터 방향의 분산을 수치화한 값을 가리킵니다.

행렬 A가 고유값과 고유벡터로 분해가 된다면 다음과 같은 공식으로 표현이 됩니다:


image

Where:

  • Q : 열이 A의 고유벡터인 행렬.

  • Λ : 대각선의 값이 A의 고유벡터인 대각선 행렬.


이렇게 하여 공분산 행렬의 고유값과 고유벡터를 찾을 수 있습니다.


image
고유벡터의 시각화

위의 이미지는 첫번째 고유벡터는 데이터중 가장 높은 분산이 존재하는 방향을 가리키고 있고 두번째 고유벡터는 두번째로 높은 분산의 방향을 가리키고 있습니다.


4 단계: 주성분 선택


앞에서 언급이 되었듯이 고유값은 고유벡터의 방향의 분산을 수치화한 것입니다. 그러므로 고유값들을 내림차순으로 정렬한 후 상위 n 개의 주성분만 저장합니다.


5 단계: 데이터 투영


마지막으로 오리지널 데이터를 선택된 주성분으로 표현된 차원의 데이터로 투영해야 합니다. 그러기 위하여 1단계에서 중앙으로 모인 데이터에 고유값 분해 후 만들어진 고유벡터 행렬을 곱합니다.


image

 

3. 파이썬 (Python) 구현


PCA의 주요 콘셉트를 이해했으므로 이젠 예제 코드를 만들어 보겠습니다.


첫번째로 환경을 만들기 위해 수학 계산을 위해 numpy와 시각화를 위해 matplotlib 패키지를 불러오겠습니다:



다음에는 이전에 다루었던 모든 콘셉트를 하나의 파이썬 클래스와 다음의 메서드로 요약하겠습니다:


init 메서드:

알고리즘의 파라미터를 초기화하는 생성자 메서드입니다. 파라미터는 컴포넌트의 개수, 컴포넌트의 벡터를 저장하는 행렬, 그리고 각 선택된 차원의 설명된 분산 (explained variance)을 저장하는 배열입니다.


fit 메서드:

fit 메서드에서는 이전의 4개 섹션에서 다루어진 부분을 구현합니다. 그리고 설명된 분산(explained variance)도 계산이 됩니다.


transform 메서드:

transform 메서드는 선택된 차원으로의 데이터 투영 기능을 담당합니다.


plot_explained_variance 메서드:

이 헬퍼 함수는 설명된 분산(explained variance)을 바 차트로 시각화하는 메서드입니다.


아래의 코드가 클래스입니다:


 

4. 평가와 해석


이제는 만들어진 클래스와 데이터를 이용하여 시뮬레이션을 구현해 보겠습니다. 데이터셋은 10개의 특성 (feature)과 100개의 샘플이 존재합니다.



PCA를 시작하기전에 한 가지 문제가 있습니다. 어떻게 하면 최적화 된 차원의 개수를 정할 수 있을까요? 통상적으로 데이터셋 중 설명된 분산에 적어도 95%이상의 영향을 주는 성분의 개수를 알아보아야 합니다.


그러기 위해서는 각 주성분이 전체 분산에 얼만큼의 영향을 미치는지 알아봅시다:



다음에는 분산의 누적합을 시각화하여 몇개의 차원이 95%이상의 전체분산을 달성하는지 알아 보겠습니다.


image
분산의 누적합

위의 차트에서 보다시피 97.064%의 설명된 분산을 차지하는 최적화된 차원의 개수는 4입니다. 다르게 설명하자면, 10개의 특성을 4개로 줄이면서 97%이상의 오리지널 정보를 유지했습니다.


결과적으로는 처음 10개의 특성은 상관관계가 높다는 뜻이되고 이 알고리즘은 고차원의 데이터를 상관관계가 낮은 주성분으로 변형시켰습니다.


 

5. 결론과 다음 단계


이 포스팅에서는 PCA를 사용하여 10개의 특성을 4개로 줄이면서 97% 이상의 오리지널 정보를 유지하였습니다.


게다가, 최적화된 주성분의 개수를 찾는 방법도 알아보았습니다. 문제의 유형에 따라 유지해야하는 분산의 %도 다를 수 있습니다.


이로써 “차원의 저주”를 완화하는 PCA 분석의 잠재성을 알수 있는데요, 다음과 같은 추가적인 탐색도 생각해 볼 수 있습니다:


  • PCA를 거친 데이터셋으로 분류 (classification)나 회기 (regression) 분석하여 보고 오리지널 데이터셋과 성능을 비교해 보기

  • PCA와 데이터 시각화를 이용하여 오리지널 데이터셋에 보이지 않았던 특성을 찾아내기

  • t-Distributed Stochastic Neighbor Embedding (t-SNE)나 Linear Discriminant Analysis (LDA, 선형판별분석) 같은 다른 차원 축소법 탐색해보기



참고:


Comments


pngegg (11)_result.webp

<Raank:랑크 /> 구독 하기 : Subscribe

감사합니다! : Thanks for submitting!

bottom of page