Hands-On Machine Learning

[핸즈온머신러닝] CH8. 차원 축소 (Dimension Reduction)

gayomii 2023. 1. 13. 09:20

목차

0. 차원이란?

1. 차원축소란? 
2. 차원축소를 하는 이유 
3. 차원의 저주
    3.1. 차원의 저주란? 
    3.2. 차원의 저주를 극복하는 방법 
4. 차원을 축소하는 방법 
    4.1 변수 선택 (feature selection)

    4.2 변수 추출 (feature extraction)
5. 차원축소를 위한 두가지 접근방법
    5.1 투영

    5.2 매니폴드
6. 차원축소기법

    6.1 pca
7. 차원축소의 한계


0. 차원이란?

점, 선, 정사각형, 정육면체, 테서랙트 (핸즈온 머신러닝)

기하학적의미에서 차원(dimension)이란 공간 내에 있는 점의 위치를 나타내기 위해 필요한 축의 개수입니다. 즉, 어떤 데이터(점)의 특징(위치)을 서술하는 데 사용되는 독립적인 특성(차원)의 개수라고 생각할 수 있습니다. 따라서 이러한 차원을 축소하거나 확장하여 여러 문제들을 해결할 수 있습니다.

 

1. 차원축소란? 

차원 축소(Dimensionality Reduction)란 고차원 공간에서 저차원 공간으로 데이터를 변환하여 변환된 저차원의 데이터가 고차원 원본 데이터의 의미 있는 속성을 최대한 유지할 수 있도록 하는 것입니다. 이때, 차원 축소 시 발생되는 원본 데이터로부터의 정보 손실 (information loss)을 최소화하면서 저차원으로 얼마나 잘 재표현(representation)할 수 있느냐가 관건입니다. 

 

2. 차원축소를 하는 이유

 이러한 차원축소를 하는 이유는 여러 가지가 있습니다. 

  • 훈련알고리즘의 속도 및 성능 증가 ( 잡음과 중복특성의 삭제)
  • 데이터시각화를 통한 통찰을 얻기 위해
  • 메모리공간을 절약

 

여러 가지 이유들 중 가장 궁극적인 목적은 차원의 저주(curse of dimension)라고 할 수 있습니다.

그럼 이때 차원의 저주가 무엇일까요?

3. 차원의 저주

    3.1. 차원의 저주란? 

변수의 수가 많아지면 데이터에 대한 정보가 많아지는 것 같지만, 피쳐가 많아지면 차원이 커지므로 분석을 위한 최소한의 필요 데이터 건수도 많아집니다. 이때, 충분히 공간을 표현할 만큼 큰 데이터 수집 없이, 적은 데이터로만 이 공간을 표현하는 경우 과적합(Overfitting)이 발생할 수 있습니다.

 

이러한 문제들을 차원의 저주(curse of dimension)라고 부릅니다.

간단히 말해서 저차원 공간에서는 없는 많은 문제들이 고차원 공간에서 발생한다는 뜻입니다.

   

차원 증가에 따른 필요 데이터의 기하급수적인 증가량

 


    3.2. 차원의 저주를 극복하는 방법 

차원의 저주를 극복하는 방법으로는 두 가지가 있습니다.

  • 훈련세트의 크기 키우기
  • 차원 축소

 

첫 번째 방법인 훈련세트의 크기를 키워 충분히 공간을 표현할 만큼의 데이터를 수집하는 것입니다. 예를 들어 크기가 1인 2차원 평면에 0.1 거리 이내에 훈련샘플을 모두 놓는다고 가정해 봅시다. 그러면 10 x 10 ($10^2$)만큼의 샘플이 필요합니다. 이를 100차원으로 확장한다고 생각해 봅시다. 그렇게 되면 10 x 10 x 10 x... x 10 ($10^{100}$) 개의 샘플이 필요합니다. 이것은 관측 가능한 우주에 있는 원자 수 모두를 합친 것보다 더 많은 양이라고 합니다. 따라서 현실적으로 어려운 방법인 것을 알 수 있습니다.

 

즉, 차원축소를 통해 차원의 저주를 극복하는 것이 가장 적합하다는 것을 알 수 있습니다.



4. 차원을 축소하는 방법 

일반적으로 차원을 축소하는 방법은 변수 선택 (feature selection)과 변수 추출 (feature extraction)두가지의 방법으로 나눌 수 있습니다.

그럼 이 두가지 방법에 관해 알아보겠습니다.

변수 추출과 변수 선택의 차이

 

4.1 변수 선택 (feature selection)

변수 선택이란 하나의 기준을 정해서 특정 피쳐를 제거하여 타깃값을 예측하는데 가장 도움이 되는 피쳐만 남기는 것을 말합니다.

Feature Selection의 방법론은 크게 3가지로 분류됩니다.

  • Filter Method : Feature 간 관련성을 측정하는 방법 (information gain, 상관계수 등등)
  • Wrapper Method : Feature Subset의 유용성을 측정하는 방법 (전진선택법, 후진제거법, 단계별 선택법)
  • Embedded Method : Feature Subset의 유용성을 측정하지만, 내장 metric을 사용하는 방법 (Lasso, Lidge 등등)

    4.2 변수 추출 (feature extraction)

변수 추출은 피처를 선택하는 것이 아닌 더 작은 피쳐들로 맵핑하는 방법입니다.

예를 들면 100개의 피쳐를 모두 녹여서 50개의 피쳐로 만드는 것입니다.

여기서 명심해야할 것은 변수추출법은 기존 변수에서 새로운 변수를 생성

변수추출법에 관해서는 아래 글들을 통해 더 자세하게 설명하겠습니다.

 

 

<변수선택과 변수추출의 비교>

  변수 선택 (feature selection) 변수 추출(feature extraction)
장점 선택된 변수의 해석이 쉽다. 변수들 간의 연관성이 고려된다.
변수의 수를 많이 줄일 수 있다.
단점 변수들 간 연관성은 고려되지 않는다. 추출된 변수의 해석이 어렵다.


5. 차원축소를 위한 두 가지 접근방법

차원축소을 축소하는 방법 중 하나인 변수추출을 위한 두 가지의 주요 접근방법입니다.

    5.1 투영

2차원에 가깝게 배치된 3차원 데이터셋

실전에서의 대부분의 훈련샘플 내 많은 특성들은 고차원의 공간 내 저 차원의 부분 공간(subspace)에 가까이 놓여있습니다. 그림을 보시면 3차원 데이터셋의 대부분이 2차원의 평면 형태로 놓여있는것을 볼 수 있습니다.

이러한 고차원 공간에 있는 훈련샘플을 저차원 공간에 다음과 같이 표현할 수 있습니다.

 

투영하여 만들어진 새로운 2D 데이터셋

앞의 3차원 데이터 셋을 2차원에 표현하였더니 데이터의 특성이 크게 뭉개지지 않고 거의 그대로 보존되는 것을 볼 수 있습니다.

이러한 경우에는 투영을 통해 데이터 셋의 차원을 쉽게 줄일 수 있습니다.

하지만 부분 공간이 뒤틀리거나 휘어있으면 투영이 최선의 방법은 아닙니다.

 

    5.2 매니폴드

매니폴드란 고차원의 데이터를 공간에 뿌릴 때 샘플들을 잘 아우를 수 있는 부분 공간(subspace)을 의미합니다.

그림을 참고하시면 이렇게 고차원 공간에서 휘어지거나 뒤틀린 2D 모양의 데이터 셋을 매니폴드라고 하며 이를 차원 축소하는 방법을 매니폴드 학습이라고 합니다.

스위스 롤 데이터셋

다음과 같이 휘어있는 스위스 롤 (=롤케이크) 데이터 셋처럼 부분공간이 뒤틀리거나 휘어있을 때 평면에 그대로 투영시키면 밑의 왼쪽 그림처럼 데이터가 뭉개져 표현됩니다.

많은 차원 축소 알고리즘이 훈련 샘플이 놓여있는 매니폴드를 모델링하는 식으로 작동합니다.

이를 매니폴드 학습(manifold learning)이라고 합니다.

이는 대부분 실제 고차원 데이터셋이 더 낮은 저차원 매니폴드에 가깝게 놓여있따는 매니폴드 가정(manifold assumption)에 근거합니다.

평면에 그냥 투영시켜서 뭉개진 것(왼쪽)과 스위스 롤을 펼쳐놓은 것(오른쪽)

하지만, 이러한 가정이 항상 통하지는 않습니다.

아래의 그림에서 볼 수 있듯이 저차원 매니폴드가 오히려 결정 경계(decision boundary)를 찾는 것이 더 어려울 때도 있습니다.

저차원에서 항상 간단하지 않은 결정경계

즉, 데이터셋의 차원을 감소시키면 학습 속도는 빨라지지만 데이터셋이 어떠한 모양을 하고 있느냐에 따라 모델 성능이 무조건 좋아지는것이 아니라 성능의 차이는 분명히 존재합니다.

 

6. 차원축소기법

    6.1 PCA

주성분 분석(PCA)은 가장 인기 있는 차원 축소 알고리즘입니다.

PCA가 말하는 것은 한마디로 데이터들을 정사영 시켜 차원을 낮춘다면, 어떤 벡터에 데이터들을 정사영 시켜야 원래의 데이터 구조를 제일 잘 유지할 수 있을까?라는 것입니다.

 

PCA는 다음과 같은 단계로 이루어집니다.

  1. 학습 데이터셋에서 분산이 최대인 축(axis)을 찾는다.
  2. 이렇게 찾은 첫번째 축과 직교(orthogonal)하면서 분산이 최대인 두 번째 축을 찾는다.
  3. 첫 번째 축과 두 번째 축에 직교하고 분산을 최대한 보존하는 세 번째 축을 찾는다.
  4. 1~3과 같은 방법으로 데이터셋의 차원(특성 수)만큼 네 번째, 다섯 번째, ... n번째의 축을 찾는다.

이러한 과정에서 해당 데이터의 i번째 축을 주성분(PC, Principal Component)이라고 합니다.

그러면 위의 방법에 관해 차근차근 알아보겠습니다.

투영할 부분 공간 선택하기

6.1.1 주성분 추출 방법

특이값 분해(Singular-value decomposition) 을 통해 찾을 수 있습니다. 

$n \times p$ matrix를 다음과 같은 3가지 행렬로 나누는 것을 SVD라고 합니다. SVD는 다른 제약이 존재하는decomposition과는 다르게 $n \times p$ matrix에 대해서 적용이 가능합니다. SVD를 하지 않으면 계산이 너무 복잡해지기 때문에 수행합니다. $$\mathbf{X}=\mathbf{U} \mathbf{D} \mathbf{V}^T$$

  • $\mathbf{U}=n \times p$
  • $\mathbf{D}=p \times p$
  • $\mathbf{V}=p \times p$
  • $\mathbf{V}^T\mathbf{V} = \mathbf{I}_p$, $\mathbf{U}^T\mathbf{U} = \mathbf{I}_p$, $\mathbf{D}$: 대각행렬

 

임의의 행렬 $\mathbf{X}$를 분해하면 제곱하면 단위행렬이 되는 $\mathbf{V}$와 $\mathbf{U}$, 대각행렬 $\mathbf{D}$의 간단한 형태로 나누어지게 되는 것입니다. 이 때, $\mathbf{V}$의 열벡터는 $\mathbf{X}^T\mathbf{X}$의 고유벡터(eigen vector)이며 $\mathbf{D}$의 대각원소는 $\mathbf{X}^T\mathbf{X}$의 고유값(eigen value)입니다. 

 

 

6.1.2 적절한 차원 수 선택

설명된 분산의 비율(expained variance ratio) 통해 차원을 줄였을 때, 얼만큼의 데이터 정보를 보존할지 정할 수 있습니다.

즉, 분산 비율이 클 수록 정보 손실이 작은 것입니다.

이때 축소할 차원 수를 임의로 정하여 차원축소를 진행 할 수도 있지만, 보다 이상적인 방법은 충분한 분산이 될때까지 더해야할 차원수를 선택하는 것입니다. 보존할 분산의 비율은 70%~95%, ... 임의로 정할 수 있습니다. 

pca = PCA(n_components=0.95)  # 보존 분산 비율 
pca.fit(X_train)
X_reduced = pca.fit_transform(X_train)

 

또 다른 방법은 설명된 분산을 차원수에 대한 함수로 그려 elbow 선택법을 이용하여 선택하는 방법입니다.  다음 plot을 기준으로 50개 차원을 선정하면 전체 중 약 80%를 보존할 수 있습니다. 

elbow plot

 

6.1.3 재구성오차

차원을 축소하여 압축된 데이터셋에 PCA 투영 변환을 반대로 적용하여 원 데이터의 차원으로 되돌릴 수 있습니다. 차원을 축소했을 때, 일정량의 정보를 잃었기 때문에 완전한 원본을 얻을 수는 없지만 원본과 매우 유사하게 복원시킬 수 있습니다. 원본 데이터와 차원 축소 후 복원한 재구성된 데이터 사이의 평균 제곱 거리를 재구성 오차(reconstruction error)라고 합니다. 

 

다음은 MNIST 데이터셋을 154차원으로 축소 후 inverse_transform() 을 적용하여 원래의 784차원으로 복원한 예시입니다. 

pca = PCA(n_components=154)
X_reduced = pca.fit_transform(X_train)
X_recovered = pca.inverse_transform(X_reduced)

분산의 95%가 유지된 MNIST 압축

6.1.4 랜덤PCA

확률적 알고리즘을 사용하여 처음 d개의 주성분에 대한 근삿값을 빠르게 찾는 방법입니다.

이 알고리즘의 계산 복잡도는 완전한 SVD 방식 : $O(m * n^2) + O(n^3)$이 아닌

Random PCA : $O(m * d^2) + O(d^3)$ 입니다.

따라서 d가 n 보다 많이 작으면 완전 SVD 보다 훨씬 빠르게 찾습니다.

rnd_PCA = PCA(n_components=154, svd_solver='randomized')
X_reduced = rnd_pca.fit_transform(X_train)

해당 코드와 같이 코드 내 svd_solver='randomized'만 추가하여 간편하게 적용 할 수 있습니다.


7. 차원축소의 한계

지금까지 차원과 차원축소의 목적 및 방법에 관해 알아보았습니다.

하지만 차원축소는 이와 같은 단점도 존재합니다.

  • 정보손실로 인한 성능감소
  • 파이프라인의 복잡도 증가
  • 변환된 데이터 이해의 어려움

즉, 분석의 목적과 피쳐의 의미에 따라 적절한 차원축소기법을 적용하여 어떻게 효과적인 분석을 할 수 있을지 곰곰이 생각해 보아야 합니다.


Reference

https://aytekin.tistory.com/49

https://excelsior-cjh.tistory.com/167


Kovi는 SSDC(Samsung Software Developer Community)를 기반으로 만들어진 커뮤니티입니다. ML, DL, Computer Vision, Robotics에 관심 있고 열정 있는 사람들이 모여 함께 활동 중입니다.

 

Kovi Instagram : https://www.instagram.com/kovi.or.kr/

Kovi SSDC : https://software.devcommunities.net/community/communityDetail/98

 

이 포스팅은 Kovi 커뮤니티 스터디의 일환으로 작성되었습니다.

posted by. gayomii & Goyami