머신러닝 스터디

[핸즈온 머신러닝 3판] 8장 차원 축소

min-sk 2024. 11. 19. 11:01

 

 

머신러닝에서 많은 특성은 훈련은 느리게 하고, 좋은 솔루션을 찾기 어렵게 만드는 데요. 이런 문제를 종종 차원의 저주라고 합니다.

훈련 속도를 높이는 것 외에도 차원 축소는 데이터 시각화에도 아주 유용한데요. 이번 시간에 차원의 저주에 대해 알아보고, 차원 축소에 대해 배워보는 시간을 가져보겠습니다.

8.1 차원의 저주

우리는 3차원 세계에서 살고 있어서 고차원 공간을 직관적으로 상상하기 어렵습니다. 기본적인 4차원 초입방체 조차로 머릿속으로 그리기 어려우니 말이죠. 

 

고차원 공간에서는 많은 것이 상당히 다르게 작동합니다. 예를 들어 단위 면적 (1 x 1 사각형) 안에 있는 점을 랜덤으로 선택한다면 경계선에서 0.001 이내에 위치할 가능성은 0.4%입니다. 하지만 10,000차원의 단위 면적을 가진 초입방체에서는 이 가능성이 99.999999%보다 커집니다.

그렇지만 고차원은 많은 공간을 가지고 있기에 새로운 샘플도 훈련 샘플과 멀리 떨어져 있을 가능성이 높습니다. 이 경우 예측을 위해 훨씬 많은 외삽을 해야 하기 때문에 저차원일 때보다 예측이 더 불안정합니다.

 

8.2 차원 축소를 위한 접근법

이제 차원을 감소시키는 두 가지 주요한 접근법인 투영과 매니폴드 학습에 대해 알아보겠습니다.

 

8.2.1 투영

대부분의 실전 문제는 훈련 샘플이 모든 차원에 걸쳐 균일하게 퍼져 있지 않습니다. 즉, 결과적으로 모든 훈련 샘플이 고차원 공간 안의 저차원 부분 공간에 놓여 있습니다.

예를 들어서 그림과 같은 상황을 생각해봅시다. 모든 훈련 샘플이 거의 평면 형태로 놓여 있습니다.

여기서 모든 훈련 샘플을 이 부분 공간에 수직으로(즉, 샘플과 평면 사이를 연결한 짧은 파선을 따라) 투영하면 2D 데이터셋을 얻습니다.

 

그러나 차원 축소에 있어서 투영이 언제나 최선의 방법은 아닙니다. 스위스 롤 데이터셋처럼 부분 공간이 뒤틀리거나 휘어 있기도 합니다.

 

그냥 평면에 투영시키면 밑의 그림의 왼쪽 그림처럼 되지만, 우리가 원하는 것은 스위스 롤을 펼쳐서 오른쪽처럼 2D 데이터셋을 얻는 것입니다.

8.2.2 매니폴드 학습

스위스 롤은 2D 매니폴드의 한 예입니다. 간단히 말해 2D 매니폴드는 고차원 공간에서 휘어지거나 뒤틀린 2D 모양입니다.

 

많은 차원 축소 알고리즘이 훈련 샘플이 놓여 있는 매니폴드를 모델링하는 식으로 작동합니다. 이를 매니폴드 학습이라고 합니다. 이는 대부분 실제 고차원 데이터셋이 더 낮은 저차원 매나폴드에 가깝게 놓여 있다는 매니폴드 가정 또는 매니폴드 가설에 근거합니다.

매니폴드 가정은 종종 암묵적으로 다른 가정과 병행되곤 합니다. 바로 처리해야 할 작업이 저차원의 매니폴드 공간에 표현되면 더 간단해질 것이란 가정입니다. 그러나 이런 암묵적인 가정이 항상 유효하지는 않습니다.

 

8.3.1 분산 보존

저차원의 초평면에 훈련 세트를 투영하기 전에 먼저 올바른 초평면을 선택해야 합니다.

밑에 그림을 예시로 들 때, 실선에 투영된 것(위)은 분산을 최대로 보존하는 반면, 점선에 투영된 것(아래)은 분산을 매우 적게 유지하고 있습니다. 파선에 투영된 것(가운데)은 분산을 중간 정도로 유지하고 있습니다.

8.3.2 주성분

주성분의 개념

목적: PCA는 데이터의 분산이 가장 큰 축을 찾아 데이터를 효율적으로 표현하는 것이 목표입니다.

첫 번째 주성분 (PC1): 데이터에서 가장 많은 분산을 차지하는 방향을 나타냅니다.

두 번째 주성분 (PC2): 첫 번째 주성분에 직교(orthogonal)하며 남은 분산을 최대한 많이 보존하는 방향을 나타냅니다.

이후 주성분들도 마찬가지로 직교 조건을 만족하면서 분산을 보존합니다.

 

주성분의 방향과 특징

PCA는 원점에 맞춰진 단위 벡터(길이가 1인 벡터)로 주성분의 방향을 설정합니다. 단위 벡터는 방향만 중요하며, 같은 축에 대해 반대 방향으로 나타날 수도 있습니다. PCA를 반복 수행하면 방향이 바뀔 가능성은 있지만, 동일한 분산 비율을 보존합니다.

 

주성분 찾기 방법

주성분은 특잇값 분해(Singular Value Decomposition, SVD)를 통해 계산할 수 있습니다.

훈련 세트 행렬 c를 특잇값 분해하여 다음과 같이 분해합니다.

8.3.3 d차원으로 투영하기

차원 축소와 투영의 목적

초평면으로의 투영: 데이터를 주성분들로 구성된 초평면에 투영함으로써 고차원 데이터를 저차원으로 축소합니다.

목표: 분산을 가능한 한 최대한 보존하면서 데이터의 차원을 줄이는 것입니다.

 3D 데이터의 분산을 가장 잘 설명하는 첫 두 개의 주성분을 사용해 데이터를 2D 평면에 투영.

 

 

8.3.4 사이킷런 사용하기

사이킷런의 PCA 모델은 SVD를 사용하여 구현합니다.

from sklearn.decomposition import PCA 

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

 

8.3.5 설명된 분산의 비율

주성분의 설명된 분산의 비율은 유용한 정보입니다. 이 비율은 각 주성분의 축을 따라 있는 데이터셋의 분산 비율을 나타냅 니다.

 

8.3.6 적절한 차원 수 선택

축소할 차원 수를 임의로 정하기보다는 충분한 분산이 될 때까지 더해야 할 차원 수 를 선택하는 것이 간단합니다.

(물론 예외적으로 데이터 시각회를 위해 치원을 축소히는 경우에는 차원을 2개나 3개로 줄입니다)

 

또 다른 방법은 설명된 분산을 차원 수에 대한 함수로 그리는 것입니다. 일반적으로 이 그래프에는 설명된 분산의 빠른 성장 이 멈추는 변곡점이 있습니다. 여기서는 차원을 약 100으로 축소해도 설명된 분산을 크게 손해를 보지 않을 것입니다.

 

마지막으로 지도 학습 작업의 전처리 단계로 차원 축소를 사용하는 경우, 다른 하이퍼파라미터와 마찬가지로 차원 수를 튜닝할 수 있습니다.

 

8.3.7 적절한 차원 수 선택

차원 축소 후 훈련 세트는 훨씬 적은 공간을 차지합니다.

예를 들어 95%의 분산을 유지하도록 MNIST 데이터 세트에 PCA를 적용하면 원래 784개의 특성 중에서 154개의 특성만 남게 됩니다.

또한 압축된 데이터셋에 PCA 투영의 변환을 반대로 적용하여 784개의 차원으로 되돌릴 수도 있습니다.

원본 데이터와 재구성된 데이터 사이의 평균 제곱 거리를 재구성 오차라고 합니다.

 

8.3.8 랜덤 PCA

목적: svd_solver 매개변수를 randomized로 설정하면 랜덤 PCA 알고리즘을 사용하여 정확도를 약간 희생하는 대신 계산 속도를 대폭 향상시킬 수 있습니다.

속도: 랜덤 PCA는 복잡도가 O(m x n x d) + O(d^3)로, 완전한 SVD 방식보다 훨씬 빠릅니다.

기본값: svd_solver의 기본값은 auto로 설정되어 있으며, 특정 조건(행렬 크기와 주성분 수)이 충족되면 자동으로 랜덤 PCA를 사용합니다.

정확도: 더 높은 정확도를 원한다면 svd_solver를 full로 설정해 완전한 SVD 방식을 사용할 수 있습니다.

 

8.3.9 점진적 PCA

목적: 대규모 데이터셋을 처리할 때 모든 데이터를 메모리에 올릴 수 없는 상황에서 사용합니다.

특징: 데이터셋을 여러 미니배치로 나누어 하나씩 PCA를 수행합니다. 특히 점진적 PCA는 온라인 학습(Online Learning) 방식으로 실시간 데이터 처리에 적합합니다.

구현: partial_fit 메서드를 사용하여 각 미니배치를 순차적으로 처리하며, 전체 데이터를 메모리에 올릴 필요 없이 처리 가능합니다.

 

8.4 랜덤 투영

정의: 랜덤 투영은 고차원 데이터를 무작위로 생성된 저차원 공간으로 투영하는 차원 축소 방법입니다.

목적: 데이터의 구조를 최대한 보존하면서 계산 비용을 줄이고, 메모리를 절약합니다. 특히 대규모 데이터나 매우 고차원 데이터에서 효과적입니다.

특징: 투영 후에도 데이터 간의 거리와 분포가 대체로 유지됩니다. 차원 축소 시, 무작위로 생성된 투영 행렬(랜덤 행렬)을 사용합니다.

핵심 원리: 존슨-린덴스트라우스 정리(Johnson-Lindenstrauss Lemma)를 기반으로, 데이터의 거리를 거의 그대로 유지하면서 저차원으로 변환할 수 있다는 점을 활용합니다.

 

장점: 계산 속도가 빠르고, 대규모 데이터에 적합합니다. 데이터 간 거리 유지로 모델 성능 저하를 최소화합니다.

단점: 무작위성을 기반으로 하므로 결과가 재현되지 않을 수 있습니다(랜덤 시드로 제어 가능). PCA처럼 데이터를 명확하게 설명할 수 있는 주성분을 제공하지 않습니다.

 

8.5 지역 선형 임베딩

정의: LLE는 비선형 차원 축소 기법으로, 고차원 데이터를 저차원으로 변환할 때 데이터의 지역적 관계(Locally Linear Relationship)를 보존하는 데 초점을 맞춥니다.

 

핵심 원리

  1. 지역적 선형 관계 유지: 각 데이터 포인트를 주변 이웃들의 선형 조합으로 표현합니다. 고차원에서 정의된 이 선형 조합 관계를 저차원에서도 최대한 유지합니다.
  2. 비선형 구조 학습: 데이터의 비선형 구조를 반영하여 차원을 축소합니다. PCA와 달리, 전역적인 선형 관계가 아닌 국소적인 구조에 중점을 둡니다.

작동 과정

  1. 이웃 찾기: 각 데이터 포인트의 가장 가까운 kk개의 이웃을 찾습니다.
  2. 선형 조합 계산: 각 데이터 포인트를 이웃들의 선형 조합으로 나타내는 가중치를 계산합니다.
  3. 저차원 표현 찾기: 저차원 공간에서 이 가중치를 최대한 유지하는 위치를 계산합니다.

LLE는 데이터의 복잡한 비선형 구조를 유지하며 시각화나 차원 축소에 활용됩니다. 예를 들어, 다음과 같이 sklearn을 사용해 구현할 수 있습니다.

from sklearn.manifold import LocallyLinearEmbedding

lle = LocallyLinearEmbedding(n_neighbors=10, n_components=2, random_state=42)
X_reduced = lle.fit_transform(X)

 

장점: 비선형 구조를 잘 반영하여 차원을 축소합니다. 또한 데이터의 국소적인 패턴이나 구조를 보존합니다.

단점: 대규모 데이터에서 계산 비용이 높습니다. 또한 이웃 수 kk와 같은 하이퍼파라미터에 민감합니다.

 

8.6 다른 차원 축소 기법

1. 다차원스케일링(MDS): 샘플 간의 거리를 보존하면서 치원을 축소합니다. 랜텀 투영은 고차원 데이터에는 적합하지만 저차원 데이터에는 잘 작동하지 않습니다.

2. Isomap: 각 샘플을 가장 가까운 이웃과 연결하는 식으로 그래프를 만듭니다. 그런 디음 샘플간의 지오데식 거리를 유지하면서 차원을 축소합니다.

3. t-SNE: 비슷한 샘플은 가까이, 비슷하지 않은 샘플은 멀리 떨어지도록 하면서 차원을 축소합니다. 주로 시각화에 많이 시용되며 특히 고차원 공간에 있는 샘플의 군집을 시각화할 때 사용됩니다.

4. 선형 판별 분석: 이는 선형 분류 알고리즘입니다. 하지만 훈련 과정에서 클래스 사이를 가장 잘 구분하는 축을 학습합니다. 이 축은 데이터가 투영되는 초평면을 정의 하는 데 사용될 수 있습니다.