My Data Story

[차원 축소] 커널PCA 본문

Machine Learning/3. 비지도 학습 알고리즘

[차원 축소] 커널PCA

Hwasss 2021. 8. 13. 17:26
728x90

◈  '차원 축소' 목차 

1. 투영, 매니폴드

2. PCA, 랜덤 PCA, 점진적 PCA

3. 커널 PCA

     사이킷런에서 커널 PCA 를 구현하고 적절한 하이퍼파라미터 선정 방법에 대해 알아본다. 

4. MDS, Isomap

5. 지역 선형 임베딩 LLE

6. t-SNE

 


1. 커널 PCA

이전까지 살펴본 PCA는 SVD 알고리즘을 활용한 방법이고

커널 PCA 는 SVM 때 처럼 고차원에 보낸 듯한 효과를 내어 PCA를 적용한다. 커널 PCA 를 적용해 차원 축소를 위한 복잡한 비선형 투형을 수행할 수 있다.  이 기법은 투영한 후 샘플의 군집을 유지하거나 꼬인 매니폴드에 가까운 데이터셋을 펼칠 때도 유용하다. 

 

2. KernelPCA

사이킷런에서 KernelPCA 를 통해 커널 PCA 모델을 구현할 수 있다.

 

from sklearn.decomposition import KernelPCA

rbf_pca = KernelPCA(n_components=2, kernel='rbf', gamma=0.04)
X_reduced = rbf_pca.fit_transform(X)

 

3. 적절한 커널 선택과 하이퍼파라미터 튜닝

■ 방법1

kPCA는 비지도 학습이기 때문에 좋은 커널과 하이퍼파라미터를 선택하기 위한 명확한 성능 측정 기준이 없다.

 

하지만 차원 축소는 종종 지도학습(예를 들면 분류)의 전처리 단계로 활용되므로

그리드 탐색을 사용하여 주어진 문제에서 성능이 가장 좋은 커널과 하이퍼파라미터를 선택할 수 있다. 

 

예를 들어,

kPCA를 사용해 차원을 축소하고 분류를 위해 로지스틱 회귀를 적용한다.

그 후 가장 높은 분류 정확도를 얻기 위해 GridSearchCV를 활용해 kPCA의 가장 좋은 하이퍼파라미터를 찾아낸다.

해당 과정을 파이프라인으로 구현하면 다음과 같다.

 

from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import PipeLine

clf = Pipeline([
          ('kpca', KernelPCA(n_components=2)),
          ('log_reg', LogisiticRegression())
      ])

param_grid = [{
        'kpca_gamma' : np.linspace(0.03, 0.05, 10),
        'kpca_kernel' : ['rbf', 'sigmoid']
    }]
    
grid_search = GridSearch(clf, param_grid, cv=3) 
grid_serach.fit(X,y)

print(grid_search.best_params_)
#{'kpca_ganmma' : 0.04333333, 'kpca_kernel' : 'rbf'}

 

■ 방법2

완전한 비지도 학습 방법으로 가장 낮은 재구성 오차를 만드는 커널과 하이퍼파라미터를 선택하는 방식도 있다.

 

커널 PCA는 커널 트릭 덕분에 특성맵 을 사용하여 훈련 세트를 무한 차원의 특성 공간(오른쪽 아래 그래프) 에 맵핑한 다음,

변환된 데이터셋을 선형 PCA를 사용해 2D 투영한 것과 수학적으로 동일하다.

 

<커널 PCA와 재구성 원상>

 

축소된 공간에 있는 샘플(오른쪽 아래 그래프)에 선형 PCA를 역전시키면 재구성된 데이터가 생성된다.

재구성된 데이터는 원본 공간이 아닌 특성 공간에 놓이게 된다.

이 특성 공간은 무한 차원이기 때문에 재구성된 포인트를 계산할 수 없으며 재구성에 따른 실제 에러도 계산할 수 없다.

다행히 재구성된 포인트에 가깝게 매핑된 원본 공간의 포인트를 찾을 수 있는데, 이를 재구성 원상이라 부른다.

재구성 원상과 원본 샘플과의 제곱 거리를 측정하여 재구성 원상의 오차를 최소화하는 커널과 하이퍼파라미터를 선택할 수 있다. 

 

 

그렇다면, 사이킷런에서 재구성을 어떻게 하는가?

 

투영된 샘플(X_reduced)을 훈련 세트로, 원본 샘플을 타깃으로 하는 지도 학습 회귀 모델을 훈련시킨 후, 재구성 원상 오차를 성능의 지표로 측정한다. 이렇게 되면 재구성 원상 오차를 최소화 시키는 커널과 하이퍼파라미터를 찾기 위해 교차 검증으로 그리드 탐색을 진행할 수 있다.

 

이때, 사이킷런에서 KernelPCA는 매개 변수 fit_inverse_transformer 의 기본값으로 False로 두고 있다.

그 이유는 KernelPCA는 진짜로 고차원 공간으로 데이터를 변환하는 것이 아니라, 커널 트릭을 활용해 고차원 공간에 있는 것처럼 작동하는 것이기 때문이다. 따라서 투영된 샘플의 재구성 원상을 구하기 위해서 매개변수 fit_inverse_transformer = True 로 설정해야 inverse_transform() 매서드를 사용할 수 있다. 

 

사이킷런에서 재구성하는 코드는 다음과 같다.

 

from sklearn.Composition import KernelPCA
from sklearn.metrics import mean_squared_error

rbf_pca = KernelPCA(n_components=2, kernel='rbf', gamma=0.0433, fit_inverse_transform=True)

X_reduced = rbf_pca.fit_transform(X)
X_preimage = rbf_pca.inverse_transform(X_reduced)

mean_squared_error(X, X_preimage)