머신러닝

차원축소 : 주성분분석

Cozzi 2021. 11. 21. 22:12
차원 축소를 해야 하는 이유

- 차원의 저주를 해결하기 위해

  <차원의 저주> : 차원이 증가할 때 학습 데이터 수가 차원의 수보다 적어 성능이 저하됨.

                      : 데이터의 용량이 큰 경우, 불필요한 샘플들이 많이 포함되어 있어 모델의 성능이 저하됨

 

   -> 이 때 샘플을 늘리거나 차원을 줄여서 이 문제를 해결해야하나, 샘플을 늘리는 것은 현실적으로 쉽지 않음

  

- 데이터 시각화를 용이하게 해 데이터를 더 직관적으로 파악할 수 있게 하기 위해

- 특성의 수를 유의미하게 줄여 훈련 속도와 성능을 최대로 유지하기 위해

 

차원 축소 방법

- Feature Selection : heatmap 을 그려 상관관계가 큰 특성들을 합치거나, 필요없는 특성 제거

- Feature Extraction : projection 등을 통해 feature 추출

 

차원축소 종류

- 사영(projection)

- 다양체 학습

 

-> 오늘은 사영 중 pca를 다룰 예정

 

PCA (주성분 분석)

분산을 최대한 보존 (정보 손실을 최소화) 하면서 차원을 줄이는 방법

 

* 첫째 주성분 : 분산을 최대한 보존하는 축

* 둘째 주성분 : 첫째 주성분과 수직을 이루면서 분산을 보존하는 축

.

.

.

 

특이값 분해 (SVD)를 이용하여 주성분을 분석할 수 있음

 

 

 

간단한 코드

 

from sklearn.decomposition import PCA

pca = PCA(n_components = 2)  
X2D = pca.fit_transform(X)

#V행렬 중 d까지 열로만 구성된 행렬 W의 전치행렬반환

pca.components_

# 주성분에 대한 원데이터의 분산의 비율 반환

pca.explained_variance_ratio_

 

* 만약, 적절한 d의 값을 모른다면,

# 유지하고 싶은 분산의 비율을 파라미터로 고정시킴

pca = PCA(n_components =0.95)
X2D = pca.fit_transform(x)

# 전체 주성분의 원데이터 분산 유지비율을 누적합으로 plot 한 뒤 적절한 d값 반환

pca = PCA()
pca.fit(X_train)

cumsum = np.cumsum(pca.explained_variance_ratio_)
d = np.argmax(cumsum >= 0.95) + 1
d

위의 두가지 방법 중 하나를 사용해서 pca를 진행하면 된다.