PCA·t-SNE·UMAP으로 차원 축소 기법 선택하기
PCA, t-SNE, UMAP의 차원 축소 원리와 구조 보존 특성을 비교하고, 전처리·재현성·대규모 운영 조건에 따른 선택 기준을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
고차원 데이터에서 무엇을 남길 것인가
차원 축소는 고차원 공간의 정보를 가능한 한 덜 잃으면서 저차원 공간으로 옮기는 절차다. 시각화가 쉬워지고, 노이즈와 계산·메모리 비용을 줄일 수 있으며, 데이터의 인접성이나 구조를 보존하는 데도 쓴다.
PCA는 선형 투영 방식이고, t-SNE와 UMAP은 비선형 매니폴드 학습 기법에 속한다. 같은 데이터를 줄이더라도 각 기법이 우선하는 구조와 운영 방식은 다르다.
PCA는 분산을 설명 가능한 축으로 바꾼다
PCA는 공분산 행렬의 고유분해 또는 SVD를 사용해 주성분 축을 찾는다. 설명분산 비율을 기준으로 유지할 차원 수를 정할 수 있다.
주성분을 해석하기 쉽고 선형 변환 경로를 제공한다는 점이 장점이다. 반면 선형성 가정과 스케일·공분산 구조의 영향을 받는다. 대규모 데이터에서는 Incremental PCA로 확장할 수 있다.
t-SNE와 UMAP이 보존하는 구조의 차이
t-SNE는 고차원에서의 국소 확률 분포와 저차원 분포 사이의 KL 발산을 최소화해 임베딩을 만든다. 군집 분리를 시각적으로 확인하는 데 강하지만, 전역 거리는 왜곡될 수 있다. 비매개변수적 특성 때문에 새 샘플의 변환도 지원하지 않는다.
UMAP은 근접 그래프와 잠재 공간의 퍼지 단체 복합체를 구성한 뒤 저차원 임베딩을 최적화한다. 대규모 데이터에 적용하기 좋고 전역·국지 구조의 균형을 노릴 수 있다. 새 샘플에 대한 transform도 지원한다.
전처리와 운영 조건이 결과를 바꾼다
표준화는 분산 편향을 줄이며, PCA에는 평균 0 중심화가 필요하다. t-SNE와 UMAP처럼 거리 기반으로 동작하는 기법은 Euclidean, cosine 등의 metric 선택에 크게 영향을 받는다. 이상치와 중복 데이터는 최근접 그래프를 왜곡할 수 있다.
재현성을 확보하려면 random_state, 라이브러리 버전, 데이터 스냅샷을 고정하고 파이프라인을 캐싱해야 한다. 대용량 환경에서는 ANN, 배치 처리, 메모리 지표 모니터링도 필요하다.
| 지표 | PCA | t-SNE | UMAP |
|---|---|---|---|
| 성능(시간복잡도) | O(min(nd², dn²)) SVD 기반 | O(n²), Barnes-Hut/FFT로 O(n log n) 근사 | O(n log n) 근사 NN + 최적화 |
| 확장성 | Incremental/Randomized PCA 지원 | 수십만 샘플 시 메모리 부담 큼 | 수백만 샘플까지 실무 적용 사례 다수 |
| 일관성(재현성) | 높음, 결정적 변환 지원 | 중간, 랜덤 초기화·매개변수 민감 | 중간~높음, random_state로 안정화 |
| 안정성(노이즈/스케일) | 스케일·공분산 가정 민감 | 매개변수 민감, 전역 왜곡 가능 | 상대적으로 안정, 전역·국지 균형 |
| 운영 편의 | 새로운 샘플 변환 용이 | 새로운 샘플 변환 미지원 | transform 지원, 실시간 추론 가능 |
| 해석 가능성 | 높음(주성분 해석 가능) | 낮음 | 중간 |
목적과 제약에서 시작하는 선택 경로
임베딩을 시각화와 운영 경로에 연결하기
문서나 이미지처럼 고차원인 임베딩은 2D/3D로 투영해 군집과 이상치 패턴을 확인할 수 있다. 이때 perplexity, n_neighbors를 스윕하고 Trustworthiness와 KNN 보존율로 결과를 선택한다.
PCA는 차원을 줄인 뒤 선형·트리 기반 모델의 학습 시간과 과적합 위험을 낮추는 데 활용할 수 있다. UMAP으로 10~64차원 임베딩을 만들면 최근접 검색과 추천 인덱스의 효율을 높일 수 있다.
품질 관리에서는 PCA 잔차(Q-통계)와 Hotelling’s T²로 공정 편차를 감지할 수 있다. UMAP 임베딩 공간에서는 DBSCAN, HDBSCAN과 연계한 밀도 기반 이상치 탐지도 가능하다. 검색과 추천에서는 UMAP 임베딩에 ANN(HNSW, FAISS)을 결합해 실시간 근접 검색을 구성하고, PCA 전처리로 코사인 유사도 색인의 메모리 풋프린트를 줄일 수 있다.
메모리와 성능에서 확인할 수 있는 변화
1,000,000×2,048 float32 데이터를 1,000,000×2로 바꾸는 경우 변환 전 크기는 1e6 × 2048 × 4B = 8,192,000,000B ≈ 7.63 GiB이고, 변환 후에는 1e6 × 2 × 4B = 8,000,000B ≈ 7.63 MiB다.
차원 축약 뒤 모델 훈련이 210배 가속된 사례가 있으며, 노이즈 축소로 검증 성능이 13%p 개선된 사례도 있다. t-SNE와 UMAP은 군집 분리도와 신뢰도(trustworthiness) 지표를 높이는 데 활용된다.
파라미터와 변환 경로를 분리해 관리한다
PCA 전에는 표준화와 스케일 관리를 적용한다. 거리 기반 기법은 스케일 불균형에 민감하다. 대규모 처리에서는 Incremental PCA 또는 UMAP+ANN을 사용하고, 배치 크기와 메모리 상한을 정한다.
t-SNE에서는 perplexity 5~50, learning_rate ~ 200~1000 범위를, UMAP에서는 n_neighbors 5~100, min_dist 0.0~0.8 범위를 스윕할 수 있다. PCA와 UMAP은 transform 경로를 운영에 포함할 수 있지만, t-SNE는 재학습 또는 매개변수적 변형(별도 모델)을 고려해야 한다.
선택 결과는 설명분산(PCA), Trustworthiness/Continuity(t-SNE/UMAP), KNN 유지율, 다운스트림 성능을 함께 비교해 판단한다.
재현 가능한 최소 예제
전제조건: Python 3.10+, scikit-learn 1.4+, umap-learn 0.5+, numpy 1.26+
최신 버전 상이 시 파라미터 명세 확인 필요
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA, IncrementalPCA
from sklearn.manifold import TSNE
from sklearn.metrics import trustworthiness
import umap
# 데이터 가정
X = np.load("features.npy") # shape (n_samples, n_features)
# 1) 공통 전처리
scaler = StandardScaler(with_mean=True, with_std=True)
X_std = scaler.fit_transform(X)
# 2) PCA: 선형 축약 + 해석 가능성
pca = PCA(n_components=0.95, svd_solver="full", random_state=42)
X_pca = pca.fit_transform(X_std)
print("PCA 차원 수:", X_pca.shape[1], "설명분산합:", pca.explained_variance_ratio_.sum())
# 대용량 시 Incremental PCA
# ipca = IncrementalPCA(n_components=256, batch_size=8192)
# X_pca_inc = ipca.fit_transform(X_std)
# 3) t-SNE: 시각화 특화 (새 샘플 transform 미지원)
tsne = TSNE(n_components=2, perplexity=30, learning_rate="auto",
init="pca", early_exaggeration=12, random_state=42, n_iter=1000)
X_tsne = tsne.fit_transform(X_pca) # 선행 PCA(50~100차) 후 t-SNE 권장
# 4) UMAP: 빠른 임베딩 + transform 지원
umap_model = umap.UMAP(n_components=10, n_neighbors=30, min_dist=0.1,
metric="cosine", random_state=42)
X_umap = umap_model.fit_transform(X_std)
# 새 샘플 변환(UMAP/PCA 가능)
# X_new_std = scaler.transform(X_new)
# X_new_pca = pca.transform(X_new_std)
# X_new_umap = umap_model.transform(X_new_std)
# 5) 품질 지표 예시
tw_umap = trustworthiness(X_std, X_umap, n_neighbors=10)
print("UMAP Trustworthiness@10:", round(tw_umap, 4))
t-SNE에는 perplexity < n_samples/3 검증과 O(n²) 메모리 사용량 확인이 필요하다. UMAP에서는 n_neighbors ∈ [2, n-1]와 metric=cosine/Euclidean를 검증한다. random_state, 라이브러리 버전, 데이터 스냅샷은 함께 고정한다.