차원 축소 (Dimensionality Reduction)¶
난이도: 중급~고급
선수 지식: 선형대수 (고유값 분해, SVD), 확률/통계 기초
관련 문서: k-NN | 클러스터링 | 선형 모델 | SVM
개요¶
차원 축소(Dimensionality Reduction)는 데이터의 특성(차원) 수를 줄이면서 가능한 한 많은 정보를 보존하는 기법이다. 다음과 같은 목적으로 사용된다:
- 시각화: 고차원 데이터를 2D/3D로 표현
- 차원의 저주 완화: 고차원에서 모델 성능 저하 방지
- 노이즈 제거: 불필요한 변동 제거
- 전처리: 후속 모델의 성능/속도 개선
- 특성 추출: 의미 있는 잠재 변수 발견
핵심 개념¶
1. PCA (Principal Component Analysis, 주성분 분석)¶
목표¶
최대 분산 방향의 직교(orthogonal) 축을 찾는다.
알고리즘¶
- 데이터 중심화 (평균 빼기)
- 공분산 행렬 계산: \(\mathbf{C} = \frac{1}{n-1}\mathbf{X}^T\mathbf{X}\)
- 고유값 분해: \(\mathbf{C}\mathbf{v}_i = \lambda_i\mathbf{v}_i\)
- 고유값 크기 순으로 상위 \(k\)개 고유벡터 선택
- 투영: \(\mathbf{Z} = \mathbf{X}\mathbf{V}_k\)
SVD와의 관계¶
PCA의 주성분은 \(\mathbf{V}\)의 열이며, 분산은 \(\frac{\sigma_i^2}{n-1}\)이다. 실제 구현에서는 SVD를 직접 사용한다 (공분산 행렬을 명시적으로 계산하지 않아도 됨).
설명된 분산 비율 (Explained Variance Ratio)¶
누적 EVR 그래프(scree plot)에서 원하는 임계값(예: 95%)에 해당하는 \(k\) 선택.
가정과 한계¶
| 가정 | 한계 |
|---|---|
| 선형 관계 | 비선형 구조를 포착하지 못함 |
| 분산 = 정보 | 분산이 작지만 중요한 정보 놓칠 수 있음 |
| 비교 가능한 스케일 | 반드시 스케일링 필요 |
변형¶
- Kernel PCA: 커널 트릭을 적용한 비선형 PCA
- Incremental PCA: 대규모 데이터를 배치로 처리
- Sparse PCA: 희소한 주성분 (해석 가능성 향상)
- Robust PCA: 이상치에 강건한 PCA
2. t-SNE (t-distributed Stochastic Neighbor Embedding)¶
목표¶
고차원의 지역 이웃 구조(local neighborhood structure)를 저차원에서 보존하여 시각화한다.
알고리즘¶
-
고차원: 가우시안으로 쌍별 유사도 계산 $\(p_{j|i} = \frac{\exp(-\|x_i-x_j\|^2/2\sigma_i^2)}{\sum_{k\neq i}\exp(-\|x_i-x_k\|^2/2\sigma_i^2)}\)$
-
대칭화: \(p_{ij} = \frac{p_{j|i} + p_{i|j}}{2n}\)
-
저차원: Student t-분포(자유도 1)로 유사도 계산 $\(q_{ij} = \frac{(1+\|y_i-y_j\|^2)^{-1}}{\sum_{k\neq l}(1+\|y_k-y_l\|^2)^{-1}}\)$
-
KL 발산 최소화: \(KL(P\|Q) = \sum_{i \neq j} p_{ij}\log\frac{p_{ij}}{q_{ij}}\)
왜 t-분포인가?¶
고차원의 거리를 저차원에 표현하면 군집 문제(crowding problem)가 발생한다. t-분포의 무거운 꼬리(heavy tail)가 이 문제를 완화: 멀리 있는 점들이 저차원에서 더 멀리 배치될 수 있다.
Perplexity (혼란도)¶
- 효과적인 이웃 수를 결정 (~5-50)
- 가우시안의 대역폭 \(\sigma_i\)를 제어
- 결과에 매우 민감: 항상 여러 값으로 시도해야 함
핵심 주의사항¶
| 주의점 | 설명 |
|---|---|
| 클러스터 크기 무의미 | 같은 클러스터라도 크기가 다를 수 있음 |
| 클러스터 간 거리 무의미 | 먼 클러스터가 실제로 가까울 수 있음 |
| 비결정론적 | 매 실행마다 다른 결과 |
| 새 데이터에 적용 불가 | 파라메트릭 매핑 없음 |
| \(O(n^2)\) 복잡도 | Barnes-Hut 근사로 \(O(n\log n)\) 가능 |
3. UMAP (Uniform Manifold Approximation and Projection)¶
이론적 기반¶
리만 기하학(Riemannian geometry)과 대수적 위상수학(algebraic topology)에 기반한다.
알고리즘 (간략화)¶
- 고차원에서 퍼지 단순 복합체(fuzzy simplicial complex) 구성 (가중 k-NN 그래프)
- 저차원에서 이 위상 구조를 최대한 보존하는 표현 탐색
- 고차원과 저차원 퍼지 집합 간의 교차 엔트로피 최적화
t-SNE와의 비교¶
| 속성 | t-SNE | UMAP |
|---|---|---|
| 전역 구조 | 보존 약함 | 더 잘 보존 |
| 속도 | 느림 (\(O(n^2)\)) | 빠름 (준이차) |
| 새 데이터 | 변환 불가 | transform() 가능 |
| 안정성 | 실행마다 다름 | 더 안정적 |
| 이론적 기반 | 약함 | 강함 (위상수학) |
핵심 파라미터¶
| 파라미터 | 효과 |
|---|---|
n_neighbors | 작으면 지역, 크면 전역 구조 반영 |
min_dist | 작으면 조밀, 크면 분산된 클러스터 |
metric | 거리 메트릭 선택 |
4. LDA (Linear Discriminant Analysis, 선형 판별 분석)¶
목표 (지도 학습)¶
클래스 간 분산 / 클래스 내 분산을 최대화하는 방향을 찾는다.
Fisher 기준¶
- \(\mathbf{S}_B\): 클래스 간 산포 행렬 (Between-class scatter)
- \(\mathbf{S}_W\): 클래스 내 산포 행렬 (Within-class scatter)
해¶
일반화 고유값 문제: \(\mathbf{S}_W^{-1}\mathbf{S}_B\mathbf{w} = \lambda\mathbf{w}\)
최대 성분 수¶
\(C\)는 클래스 수이므로, 이진 분류에서는 최대 1개 성분만 가능.
가정¶
- 각 클래스가 가우시안 분포
- 모든 클래스의 공분산 행렬이 동일
- 클래스 간 선형 분리 가능
PCA vs LDA¶
| 속성 | PCA | LDA |
|---|---|---|
| 학습 유형 | 비지도 | 지도 |
| 최적화 대상 | 최대 분산 | 최대 클래스 분리 |
| 최대 성분 수 | \(\min(n, p)\) | \(\min(p, C-1)\) |
| 가정 | 선형 | 가우시안 + 동일 공분산 |
| 역할 | 차원 축소만 | 차원 축소 + 분류기 |
graph LR
subgraph "PCA: 최대 분산"
A1[전체 데이터의 분산이<br/>가장 큰 방향 탐색]
end
subgraph "LDA: 최대 클래스 분리"
A2[클래스를 가장 잘<br/>구분하는 방향 탐색]
end 5. 기타 방법 (간략 소개)¶
| 방법 | 핵심 아이디어 | 주요 사용처 |
|---|---|---|
| ICA (독립 성분 분석) | 통계적으로 독립인 성분 탐색 | 신호 분리 |
| Factor Analysis | 관측 변수 = 잠재 인자 + 잡음 | 사회과학 |
| NMF (비음수 행렬 분해) | \(\mathbf{X} \approx \mathbf{W}\mathbf{H}\), \(W,H \ge 0\) | 해석 가능한 부분 기반 표현 |
| Autoencoder | 인코더-디코더 신경망 | 비선형 차원 축소 |
| Random Projection | Johnson-Lindenstrauss 보조정리 | 빠른 근사 축소 |
상세 비교표¶
| 방법 | 지도 학습 | 선형 | 보존 대상 | 확장성 | 새 데이터 |
|---|---|---|---|---|---|
| PCA | 아니오 | 예 | 전역 분산 | 매우 좋음 | 가능 (투영) |
| t-SNE | 아니오 | 아니오 | 지역 구조 | 나쁨 (\(O(n^2)\)) | 불가 |
| UMAP | 아니오/반지도 | 아니오 | 지역 + 일부 전역 | 좋음 | 가능 |
| LDA | 예 | 예 | 클래스 분리 | 좋음 | 가능 |
언제 사용하는가¶
| 상황 | 추천 방법 |
|---|---|
| 전처리 / 노이즈 제거 | PCA |
| 탐색적 시각화 (2D/3D) | t-SNE, UMAP |
| 분류 성능 향상 + 차원 축소 | LDA |
| 대규모 데이터 시각화 | UMAP |
| 빠른 차원 축소가 필요 | PCA, Random Projection |
| 비선형 구조 탐색 | UMAP, Kernel PCA |
흔한 오해와 함정¶
1. "t-SNE 플롯의 클러스터 간 거리가 의미 있다"¶
- 아니다. t-SNE는 지역 구조만 보존한다. 클러스터 간 거리와 크기는 해석하면 안 된다.
2. "PCA 전에 스케일링이 필요 없다"¶
- 분산 기반이므로 스케일이 큰 특성이 결과를 지배한다. 반드시 스케일링(보통 StandardScaler)해야 한다.
3. "PCA 성분 수는 많을수록 좋다"¶
- 너무 많으면 노이즈까지 보존한다. scree plot으로 적정 수준(예: 95% 분산) 선택.
4. "LDA는 항상 PCA보다 낫다 (분류 목적)"¶
- LDA는 가우시안 + 동일 공분산 가정이 필요. 이 가정이 맞지 않으면 PCA가 더 나을 수 있다.
5. "UMAP이 t-SNE를 완전히 대체한다"¶
- 대부분의 경우 UMAP이 더 낫지만, 특정 데이터에서는 t-SNE가 더 좋은 지역 구조를 보여줄 수 있다. 둘 다 시도하는 것이 좋다.
다른 주제와의 연결¶
- k-NN: 차원의 저주 완화를 위한 전처리
- 클러스터링: 시각화 및 전처리
- 선형 모델: PCA로 다중공선성 해결, Ridge 회귀와의 연결
- SVM: Kernel PCA와 SVM 커널의 관계
자주 묻는 면접 질문¶
- PCA vs LDA: 각각 언제 사용하는가?
-
PCA: 비지도, 전반적 분산 보존. LDA: 지도, 클래스 분리 최대화
-
t-SNE 플롯에서 거리를 신뢰할 수 없는 이유는?
-
KL 발산 최소화는 지역 구조만 보존하도록 설계됨. 전역 거리는 왜곡됨
-
PCA에서 성분 수를 어떻게 결정하는가?
-
누적 설명 분산 비율 (95% 등) 또는 scree plot의 "팔꿈치" 지점
-
PCA를 비선형 데이터에 사용할 수 있는가?
-
Kernel PCA를 사용하면 가능 (커널 트릭으로 고차원 매핑 후 PCA)
-
PCA 전에 데이터를 스케일링하는 이유는?
- PCA가 분산을 최대화하므로, 스케일이 큰 특성이 과도한 영향을 미침
코드 예시¶
from sklearn.decomposition import PCA, KernelPCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
import umap
# PCA (반드시 스케일링 후)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
pca = PCA(n_components=0.95) # 95% 분산 유지
X_pca = pca.fit_transform(X_scaled)
print(f"선택된 성분 수: {pca.n_components_}")
print(f"설명 분산: {pca.explained_variance_ratio_}")
# LDA (지도 학습)
lda = LinearDiscriminantAnalysis(n_components=2)
X_lda = lda.fit_transform(X_scaled, y) # 레이블 필요
# t-SNE (시각화)
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# UMAP (시각화 + 변환 가능)
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
X_umap = reducer.fit_transform(X_scaled)
X_new_umap = reducer.transform(X_new) # 새 데이터 변환 가능
# Kernel PCA
kpca = KernelPCA(n_components=50, kernel='rbf', gamma=0.01)
X_kpca = kpca.fit_transform(X_scaled)
용어 정리¶
| 영어 | 한국어 |
|---|---|
| Dimensionality Reduction | 차원 축소 |
| Principal Component Analysis (PCA) | 주성분 분석 |
| Eigenvalue / Eigenvector | 고유값 / 고유벡터 |
| Explained Variance Ratio | 설명된 분산 비율 |
| Scree Plot | 스크리 플롯 |
| t-SNE | t-분포 확률적 이웃 임베딩 |
| Perplexity | 혼란도 (퍼플렉시티) |
| UMAP | 균일 매니폴드 근사 투영 |
| Linear Discriminant Analysis (LDA) | 선형 판별 분석 |
| Scatter Matrix | 산포 행렬 |
참고 자료¶
- Jolliffe (2002) - Principal Component Analysis
- van der Maaten & Hinton (2008) - "Visualizing Data using t-SNE"
- McInnes, Healy, Melville (2018) - "UMAP: Uniform Manifold Approximation and Projection for Dimension Reduction"
- Fisher (1936) - "The Use of Multiple Measurements in Taxonomic Problems" (LDA)
- Wattenberg, Viegas, Johnson (2016) - "How to Use t-SNE Effectively" (distill.pub)