들어가며: 왜 차원 축소가 필요한가?
현실 세계의 데이터는 수백, 수천 개의 feature를 갖는 경우가 흔합니다. 이미지 데이터는 픽셀 수만큼, 유전체 데이터는 수만 개의 유전자 발현값을 갖죠. 이런 고차원 데이터를 사람이 이해할 수 있는 2D·3D로 압축하는 것이 차원 축소(Dimensionality Reduction)의 핵심입니다.
그중에서도 t-SNE와 UMAP은 비선형 차원 축소의 양대 산맥입니다. 이 글에서는 두 알고리즘의 원리, 성능, 실무 활용법을 코드와 함께 비교합니다.
핵심 질문: “내 데이터에는 t-SNE와 UMAP 중 어떤 것이 더 적합할까?”
t-SNE란?
t-SNE(t-distributed Stochastic Neighbor Embedding)는 2008년 Laurens van der Maaten이 제안한 알고리즘입니다.
작동 원리
- 고차원 공간에서 각 데이터 포인트 간 조건부 확률(가우시안 분포)을 계산
- 저차원 공간에서 t-분포 기반 확률을 계산
- 두 확률 분포 간 KL divergence를 최소화하도록 반복 최적화
t-분포를 사용하는 이유는 저차원에서 발생하는 crowding problem을 완화하기 위해서입니다. 가우시안보다 꼬리가 두꺼운 t-분포 덕분에 멀리 있는 점들이 더 잘 분리됩니다.
주요 하이퍼파라미터
- perplexity (5~50): 이웃 수의 유효 크기. 데이터 크기에 따라 조절
- learning_rate (10~1000): 너무 작으면 수렴 실패, 너무 크면 발산
- n_iter (≥1000): 충분한 반복 횟수가 필요
UMAP이란?
UMAP(Uniform Manifold Approximation and Projection)은 2018년 Leland McInnes가 제안했으며, 리만 기하학과 대수적 위상수학에 기반합니다.
작동 원리
- 고차원 데이터의 k-최근접 이웃 그래프를 구성
- 이 그래프를 fuzzy simplicial set으로 표현
- 저차원에서 유사한 위상 구조를 갖도록 cross-entropy를 최소화
주요 하이퍼파라미터
- n_neighbors (5~200): 지역 vs 전역 구조 균형 조절
- min_dist (0.0~1.0): 저차원에서 포인트 간 최소 거리
- metric: 거리 측정 방식 (euclidean, cosine, manhattan 등)
t-SNE vs UMAP 핵심 비교
| 비교 항목 | t-SNE | UMAP |
|---|---|---|
| 속도 | 느림 (O(n²) ~ O(n log n)) | 빠름 (대규모 데이터에 강점) |
| 확장성 | 수만 건까지 실용적 | 수십만~수백만 건도 가능 |
| 전역 구조 보존 | 약함 (지역 구조에 집중) | 상대적으로 우수 |
| 지역 구조 보존 | 우수 | 우수 |
| 재현성 | 실행마다 결과 변동 | random_state 고정 시 안정적 |
| 새 데이터 변환 | 불가 (재학습 필요) | 가능 (transform 메서드) |
| 이론적 기반 | 확률 분포 매칭 | 위상수학·리만 기하학 |
| 하이퍼파라미터 민감도 | 높음 (perplexity 영향 큼) | 상대적으로 낮음 |
UMAP은 속도와 확장성에서 t-SNE를 압도하며, 전역 구조 보존에서도 앞서는 경우가 많습니다. 다만 t-SNE는 작은 데이터셋의 클러스터 분리를 시각적으로 더 뚜렷하게 보여주는 경향이 있습니다.
Python 실전 코드: MNIST 데이터셋 비교
환경 설정
pip install umap-learn scikit-learn matplotlib
데이터 준비 및 PCA 전처리
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap
import time
# MNIST 로드 (70,000장의 손글씨 숫자, 784차원)
mnist = fetch_openml('mnist_784', version=1, as_frame=False)
X, y = mnist.data[:10000], mnist.target[:10000].astype(int)
# PCA로 50차원으로 사전 축소 (t-SNE 속도 개선용)
pca = PCA(n_components=50, random_state=42)
X_pca = pca.fit_transform(X)
print(f"PCA 설명 분산: {pca.explained_variance_ratio_.sum():.2%}")
t-SNE 실행
start = time.time()
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200,
n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X_pca)
print(f"t-SNE 소요 시간: {time.time() - start:.1f}초")
UMAP 실행
start = time.time()
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1,
n_components=2, random_state=42)
X_umap = reducer.fit_transform(X_pca)
print(f"UMAP 소요 시간: {time.time() - start:.1f}초")
시각화 비교
fig, axes = plt.subplots(1, 2, figsize=(16, 7))
for ax, data, title in zip(axes, [X_tsne, X_umap], ['t-SNE', 'UMAP']):
scatter = ax.scatter(data[:, 0], data[:, 1], c=y, cmap='tab10',
s=1, alpha=0.7)
ax.set_title(title, fontsize=16, fontweight='bold')
ax.set_xticks([])
ax.set_yticks([])
plt.colorbar(scatter, ax=axes, label='Digit', shrink=0.8)
plt.tight_layout()
plt.savefig('tsne_vs_umap.png', dpi=150, bbox_inches='tight')
plt.show()
실무에서의 선택 가이드
UMAP을 선택하는 경우
- 데이터가 10만 건 이상으로 대규모일 때
- 학습된 모델로 새로운 데이터를 변환해야 할 때
- 전역 구조(클러스터 간 거리 관계)가 중요할 때
- ML 파이프라인에 차원 축소를 전처리 단계로 포함할 때
t-SNE를 선택하는 경우
- 데이터가 수천~수만 건으로 비교적 작을 때
- 클러스터 분리를 명확하게 시각화하고 싶을 때
- 탐색적 분석(EDA) 목적으로 한 번만 시각화할 때
- 논문이나 발표에서 시각적으로 뚜렷한 군집을 보여줘야 할 때
하이퍼파라미터 튜닝 팁
| 상황 | t-SNE 권장값 | UMAP 권장값 |
|---|---|---|
| 작은 데이터 (<1K) | perplexity=5~15 | n_neighbors=5~15 |
| 중간 데이터 (1K~50K) | perplexity=30~50 | n_neighbors=15~30 |
| 큰 데이터 (>50K) | 사용 비권장 | n_neighbors=30~200 |
| 밀집 클러스터 강조 | — | min_dist=0.0~0.05 |
| 전역 구조 강조 | — | n_neighbors ↑, min_dist ↑ |
자주 하는 실수와 주의점
- 클러스터 간 거리를 해석하지 마세요 — t-SNE에서 클러스터 간 거리는 의미가 없습니다. UMAP은 상대적으로 낫지만 여전히 주의가 필요합니다.
- PCA 전처리를 빼먹지 마세요 — 고차원 데이터를 50~100차원으로 먼저 축소하면 속도와 품질 모두 향상됩니다.
- 하이퍼파라미터 하나로 판단하지 마세요 — perplexity나 n_neighbors를 여러 값으로 실험하고 결과를 비교하세요.
- 클러스터 크기를 비교하지 마세요 — 두 알고리즘 모두 클러스터의 상대적 크기를 보존하지 않습니다.
실무 팁: 결과 해석 시에는 반드시 원본 feature space에서의 통계량(거리, 밀도 등)을 함께 확인하세요. 시각화는 탐색의 출발점이지, 결론이 아닙니다.
마무리
- t-SNE는 작은 데이터의 지역 구조 시각화에 탁월하며, 클러스터를 시각적으로 뚜렷하게 분리합니다.
- UMAP은 속도, 확장성, 전역 구조 보존 모든 면에서 실무에 유리하며,
transform()메서드로 새 데이터 변환이 가능합니다. - 2024년 이후 대부분의 실무 프로젝트에서는 UMAP이 기본 선택지로 자리잡고 있습니다.
- 어떤 알고리즘을 쓰든 하이퍼파라미터 실험과 PCA 전처리는 필수입니다.
- 시각화 결과만으로 결론 내리지 말고, 정량적 분석과 함께 활용하세요.
이 글이 도움이 되셨나요?
Buy me a coffee
답글 남기기