본문 바로가기
Stay Hungry Stay Foolish/ML & DL

[파이썬 머신러닝 완벽 가이드] 6. 차원 축소(Dimension Reduction)

by HANNI하니 2020. 3. 5.

차원 축소 : 매우 많은 피처로 구성된 데이터 세트의 차원을 축소해 새로운 차원의 데이터 세트를 생성하는 것

-> 잠재적 특성을 피처로 도출해 함축적 형태의 이미지 변환과 암축 수행 가능

-> 과적합 영향력이 작아져서 오히려 원본 데이터로 예측하는 것보다 예측 성능 좋아짐

 

차원 축소 알고리즘

1. PCA(Principal Component Analysis, 주성분분석)

-분산이 데이터의 특성을 가장 잘 나타내는 것으로 간주하여, 데이터 변동성이 가장 큰 방향으로 축을 생성하고, 새롭게 생성된 축으로 데이터를 투영하는 방식.

-첫 번째 벡터 축 : 가장 큰 데이터 변동성을 기반으로 생성

 두 번째 벡터 축 : 첫 번째 벡터 축에 직각이 되는 벡터(직교벡터)

 세 번째 벡터 축 : 두 번째 벡터 축과 직각이 되는 벡터를 설정하는 방식으로 축 생성

-(선형대수관점)

 입력 데이터의 공분산 행렬을 고유값(eigenvalue)으로 분해하고, 이렇게 구한 고유벡터에 입력 데이터를 선형 변환하는 것.

C=공분산행렬, P=n*n 직교행렬, ∑=n*n 정방행렬
e=고유벡터(Ax=ax,행렬A를 곱하더라도 방향이 변하지 않고 그 크기만 변하는 벡터), ⋋=고유벡터의 크기

공분산 = 고유벡터 직교 행렬 * 고유값 정방 행렬 * 고유벡터 직교 행렬의 전치 행렬

입력 데이터의 공분산 행렬이 고유벡터와 고유값으로 분해될 수 있으며, 이렇게 분해된 고유벡터를 이용해 입력 데이터를 선형 변환하는 방식이 PCA이다.

 

[PCA step]

1.입력 데이터 세트의 공분산 행렬을 생성합니다.

2.공분산 행렬의 고유벡터와 고유값을 계산합니다.

3.고유값이 가장 큰 순으로 k(PCA 변환 차수)만큼 고유벡터를 추출합니다,

4.고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 반환합니다.

 

 

 

  • 예제

->PCA는 속성의 스케일에 영향을 받기 때문에 PCA로 압축하기 전에 개별 속성을 함께 스케일링해야한다. 사이킷런의 StandardScaler를 이용해 평균이 0, 분산이 1인 표준 정규 분포로 모든 속성값을 변환한다.  PCA 클래스는 생성 파라미터로 n_components(PCA로 변환할 차원의 수)를 입력받는다.
->넘파이 행렬을 dataframe으로 변환
->PCA 변환된 데이터 세트를 2차원상에서 시각화
->PCA 객체의 explained_variance_ratio_ 속성은 전체 변동성에서 개별 PCA 컴포넌트별로 차지하는 변동성 비율을 제공, PCA를 2개 요소로만 변환해도 원본 데이터의 변동성을 95% 설명할 수 있다.
->Estimator는 RandomForestClassifier를 이용하고 cross_val_score()로 3개의 교차 검증 세트로 정확도 결과 비교

->4개의 속성이 2개의 변환 속성이 돼도 예측 성능에 전혀 영향을 받지 않을 정도로 PCA 변환이 잘 적용됐음을 의미

->대부분은 PCA 변환 차원 개수에 따라 예측 성능이 떨어질 수 밖에 없다.

 

 

 

2. LDA(Linear Discriminant Analysis)

-선형 판별 분석법. PCA와 매우 유사한 방식.

PCA LDA
입력 데이터 세트를 저차원 공간에 투영해 차원을 축소하는 기법
비지도학습 지도학습의 분류에서 사용하기 쉽도록 개별 클래스를 분별할 수 있는 기준을 최대한 유지하면서 차원 축소
입력 데이터의 변동성이 가장 큰 축

입력 데이터의 결정 값 클래스를 최대한으로 분리할 수 있는 축

->클래스 간 분산(between-class scatter)과 클래스 내부 분산(within-class scatter)의 비율을 최대화하는 방식으로 차원을 축소

 

클래스 간 분산은 최대한 크게 가져가고, 클래스 내부의 분산은 최대한 작게 가져가는 방식

 

[LDA step]

1.클래스 내부와 클래스 간 분산 행렬을 구한다. 이 두 개의 행렬은 입력 데이터의 결정 값 클래스별로 개별 피처의 평균 벡터(mean vector)를 기반으로 구한다.

2.클래스 내부 분산 행렬을 Sw, 클래스 간 분산 행렬을 Sb라고 하면 두 행렬을 고유벡터로 분해할 수 있다.

3.고유값이 가장 큰 순으로 k(LDA변환 차수만큼) 추출한다.

4.고유값이 가장 큰 순으로 추출된 고유벡터를 이용해 새롭게 입력 데이터를 반환한다.

 

3. SVD(Singular Value Decomposition, 특이값 분해)

-정방행렬만을 고유벡터로 분해할 수 있는 PCA와 달리, SVD는 행과 열의 크기가 다른 행렬에도 적용할 수 있다.

-사이파이의 SVD는 scipy.linalg.svd 이용

U,V=특이 벡터, 서로 직교하는 성질

  • 예제

->랜덤 행렬을 생성하는 이유는 행렬의 개별 로우끼리의 의존성을 없애기 위함
-> 생성된 a행렬에 U, Sigma, Vt를 도출. Sigma 행렬의 경우 행렬의 대각에 위치한 값만 0이 아니고, 그렇지 않은 경우는 모두 0이므로 0이 아닌 값의 경우만 1차원 행렬로 표현한다. 분해된 U, Sigma, Vt를 이용해 다시 원본 행렬로 복원. Sigma는 다시 0을 포함한 대칭행렬로 먼저 변환한 뒤에 내적을 수행해야 한다.

 

 

-Truncated SVD

: ∑의 대각원소 중에 상위 몇 개만 추출해서 여기에 대응하는 U와 V의 원소도 함께 제거해 더욱 차원을 줄인 형태로 분해하는 것

: 넘파이가 아닌 사이파이에서만 지원. 사이파이의 truncated svd는 희소행렬로만 지원돼서 scipy.sparse.linalg.svds를 이용

->붓꽃 데이터를 스케일링으로 변환한 뒤에 사이킷런 TruncatedSVD클래스, PCA클래스 변환. 거의 동일한 결과

-데이터 세트가 스케일링으로 데이터 중심이 동일해지면 사이킷런의 SVD와 PCA는 동일한 변환을 수행

 SVD와 PCA는 동일한 변환을 수행

 PCA는 밀집행렬(Dense Matrix)에 대한 변환만 가능하며 SVD는 희소 행렬(Sparse Matrix)에 대한 변환도 가능

 

4. NMF(Non-Negative Matrix Factorization)

-Truncated SVD와 같이 낮은 랭크를 통한 행렬 근사(Low-Rank Approximation)방식의 변형

-원본 행렬 내의 모든 원소 값이 모두 양수(0이상)라는 게 보장되면, 좀 더 간단하게 두 개의 기반 양수 행렬로 분해될 수 있는 기법을 지칭한다.

-분해 행렬 W는 원본 행에 대해서 이 잠재 요소의 값이 얼마나 되는지에 대응하며, 분해 행렬 H는 이 잠재 요소가 원본 열(즉, 원본 속성)로 어떻게 구성됐는지를 나타내는 행렬

-사이킷런에서 NMF는 NMF 클래스를 이용해 지원된다.

댓글