[Machine Learning with Python Cookbook] ch9. Dimension Reduction using Feature Extraction

4월 12, 2021





Summary

 차원 축소를 위한 특성 추출(feature extraction)의 목적은 특성에 내재된 정보는 많이 유지하면서 특성 집합 $ \rho_{original} $을 새로운 집합 $ \rho_{new} $로 변환하는 것입니다. 특성 추출의 한 가지 단점은 만들어진 새로운 특성을 사람이 이해하지 못한다는 것입니다.
 해석 가능한 모델을 유지하고 싶다면 특성 선택(feature selection)을 통한 차원 축소가 더 나은 방법입니다.

    * 주성분을 사용해 특성 줄이기 (9.1)
        - 일련의 특성이 주어졌을 때 데이터의 분산을 유지하며 특성의 수 줄이기: sklearn의 PCA 사용. PCA는 비지도 학습 기법으로 타겟 벡터 정보를 사용하지 않고 특성 행렬만 이용함.
         pca = sklearn.decomposition.PCA(n_components=0.99, whiten=True)
        - 데이터가 선형적으로 구분되면 (즉, 다른 클래스 사이에 직선이나 초평면 hyperplane을 그릴 수 있다면) PCA가 잘 동작함

    선형적으로 구분되지 않은 데이터의 차원 축소하기 (9.2)
        - 커널 트릭을 사용하는 주성분 분석의 확장을 사용하여 비선형 차원 축소를 수행
         kpca = sklearn.decomposition.KernelPCA(kernel='rbf', gamma=15, n_components=1)
        - 커널이란 데이터를 투영하는 다른 방법. 커널 함수는 선형적으로 구분되지 않는 데이터를 선형적으로 구분되는 고차원으로 투영시킴

    * 클래스 분리를 최대화하여 특성 줄이기 (9.3)
        - 분류 모델에 사용될 특성을 줄임: 선형 판별 분석 (LDA linear discriminant analysis)을 사용하여 클래스를 최대한 분리하는 성분 축으로 특성을 투영함
         lda = sklearn.discriminant_analysis.LinearDiscriminantAnalysis(n_components=1)
        - LDA는 분류 알고리즘이지만 차원 축소에도 자주 사용됨. PCA와 유사하지만 PCA가 데이터에서 분산이 최대인 성분 축에만 관심이 있는 반면, LDA는 클래스 간의 차이를 최대화하는 추가적인 목적을 가짐. 또한 LDA는 타겟 벡터를 사용함

    행렬 분해를 사용하여 특성 줄이기 (9.4)
        - 음수가 아닌 특성 행렬이 있을 때 차원 축소하는 방법: 비음수 행렬 분해(NMF non-negative matrix factorization) 사용
         nmf = sklearn.decomposition.NMF(n_components=10, random_state=1)
        - NMF는 선형 차원 축소를 위한 비지도 학습 기법으로, 원하는 특성 개수 r이 주어지면 NMF는 다음과 같이 특성 행렬을 분해함
         $ \mathbf{V} \approx \mathbf{W} \mathbf{H} $
         W는 nxr 크기 행렬   
         H는 rxd 크기 행렬 
         r값을 조절하여 필요한 차원 축소의 양을 정할 수 있음

    * 희소한 데이터의 특성 줄이기 (9.5)
        - 희소 특성 행렬의 차원을 축소함: TSVD truncated singular value decomposition를 사용함
        - TSVD는 PCA와 비슷하지만 PCA와 달리 희소 특성 행렬에 사용할 수 있다는 장점을 가짐
        - 자연어 처리에서는 TSVD를 잠재 의미 분석(LSA latent semantic analysis)이라고도 부름


Code