# AI 이론/Machine Learning

주성분 분석(PCA)란?

alz 2022. 4. 6. 16:01
차원의 저주란?

 

많은 경우 머신러닝 문제는 훈련 샘플이 각각 수천 심지어 수백만 개의 특성(Feature)을 가지고 있습니다.

이런 많은 특성은 훈련을 느리게 할 뿐만 아니라, 좋은 솔루션을 찾기 어렵게 만듭니다.

이런 문제를 차원의 저주(curse of dimensionality) 라고합니다.

 

이러한 문제를 해결하기 위해서는 차원을 줄여줘야 하는데, 이때 사용하는 방식이 PCA라는 차원축소 알고리즘 입니다.

PCA는 비지도 변수 추출(Principal Component analysis)
비지도이므로 target 값 y는 사용되지 않는다.

 

▷ PCA,주성분 분석

분산을 최대로 유지하자!  가 핵심입니다.

 

사진을 보면 데이터 x1,x2의 분포 사진에 2개의 축이있습니다.(c1,c2)

c1에 데이터를 사영(Projection) 할경우 오른쪽 사진의 맨위와 같이 나올 것이고,

c2에 사영하게 되면 오른쪽 사진의 맨아래와 같이 나오게 될것입니다.

PCA의 주된 목적은 분산을 최대한 유지하자 이므로, C1축을 선택하는것이 정보 손실을 최소화 할수 있다고 생각할 수 있습니다.

두번째 축은 첫번째 주성분 축에 직교하면서, 다음으로 큰 분산을 갖는 축이다.

그에 따라서 두번째 축은 c2가 선택이 될텐데, 현재의 예제에서는 선택의 폭이 적지만, 차원이 많아지면 여러 방향으로 직교하는 축을 찾을 수 있습니다.

이렇게 i번째 축을 정의하는 단위 벡터를 i번째 주성분(principal component, PC)라고 합니다. 위 예제에서는 첫번째 PC는 c1이고, 두번째 PC는 c2입니다

 

 

주성분(Principal component)는 어떻게 찾을까?

 

특잇값 분해(singular value decomposition) SVD 방식을 통해서 훈련세트 행렬X를 세개의 행렬 곱셈으로 나눌 수 있습니다. 

 

특이값 분해란?

임의의  m x n차원의 행렬 A에 댇해서 다음과 같이 행렬을 분해 할 수 있다는 행렬분해 기법중 하나이다.

특이값 분해를 통해 다음과 같은 의미를 가질 수있는데,

1. 직교하는 벡터집합에 대하여, 선형 변환 후에 그 크기는 변하지만 여전히 직교할 수 있게 되는 그 직교집합은 무엇인가?

2.그리고 선형 변환 후의 결과는 무엇인가?

https://angeloyeo.github.io/2019/08/01/SVD.html 이분의 블로그에 잘 정리 해놓으셔서 이 글을 보는게 좋습니다

 

다음과 같은 코드로 파이썬에서는 SVD분해를 할 수있습니다.

# 각 특성마다 평균을 빼준다.
X_centered = X - X.mean(axis=0)
U,s,Vt = np.linalg.svd(X_centered)
c1 = Vt.T[:,0]
c2=  Vt.T[:,1]

 

 d차원으로 투영하기

주성분을 모두 추출해냈다면 처음 d개의 주성분으로 정의한 초평면에 투영하여 데이터셋의 차원을 d차원으로 축소할 수 있습니다(분산을 최대로 보존하는 투영) 

 

사이킷런 사용하기

from sklearn.decomposition import PCA

pca = PCA(n_components=2) # n_components : 주성분의 개수
X2D = pca.fit_transform(X)

 

적절한 차원수는 어떻게 구할까?
"분산을 이용하자" 

축소할 차원 수를 임의로 정하기보다는 충분한 분산(예를 들면 95%)이 될 때까지 더해야 할 차원수를 선택하는것이 간단합니다. 물론 데이터 시각화를 위해 차원을 축소하는경우 2개나 3개로 줄이는것이 일반적입니다.

 

MNIST 데이터에는 28 *28개의 특성이 있는데, 이중 95% 이상의 분산을 갖게되는 특성수를 구하는 코드입니다.

numpy의 cumsum을 사용하면 배열의 누적합을 구할 수 있습니다.

 

784개의 차원중 154개의 차원으로 축소시켜도 분산 95%를 유지 할 수 있다.

 

 

개념 정리 및 연습문제

  • 데이터셋의 차원을 축소하는 주요 목적은 무엇이며, 대표적인 단점은 무엇인가?

    장점
    1. 알고리즘의 속도가 향상된다.(아닐경우도 존재함) 
    2. 고차원의 데이터에 대해서 데이터 시각화가 가능하다
    3. 메모리를 절약할 수 있다

    단점
    1.일부 정보 손실로 알고리즘 학습시 제대로 학습되지 않을 수있다
    2.머신러닝 파이프라인 비용이 증가할 수 있다
    3.차원이 줄어듦에 따라서 데이터를 이해하기 힘들 수 있다

 

  • 기본 PCA,점진적PCA,랜덤 PCA,커널 PCA는 어느 경우에 사용되는가?

PCA : 데이터셋의 크기가 메모리와 맞을때 사용

Incremetal PCA: 메모리에 담을 수 없는 크기의 데이터셋의 경우 / 온라인 데이터(새로운 데이터가 준비되는 대로 실시간으로)

Random PCA : 차원을 크게 축소 시킬때 
Kernnel PCA : 비선형 데이터를 다룰때