08. Dimensionality Reduction (차원 축소)
PCA, t-SNE, UMAP
학습 목표
이 튜토리얼을 완료하면 다음을 할 수 있습니다:
- PCA의 수학적 원리와 직관적 이해
- 주성분 선택 기준 (Explained Variance) 활용
- t-SNE의 원리와 하이퍼파라미터 튜닝
- 실전 데이터 시각화 및 해석
- 상황에 맞는 알고리즘 선택 능력
핵심 개념
1. 차원 축소란?
고차원 데이터를 저차원으로 변환하면서 중요한 정보를 보존하는 기법입니다.
| 목적 | 효과 |
|---|---|
| 시각화 | 2D/3D로 데이터 탐색 |
| 노이즈 제거 | 불필요한 정보 제거 |
| 계산 효율 | 학습 속도 향상 |
| 과적합 방지 | 차원의 저주 해결 |
차원의 저주(Curse of Dimensionality): 차원이 증가할수록 데이터 포인트 간 거리가 비슷해지고, 학습에 필요한 데이터 양이 기하급수적으로 증가하는 현상입니다.
2. PCA (Principal Component Analysis)
PCA는 데이터의 분산을 최대화하는 방향으로 투영하는 선형 차원 축소 기법입니다.
핵심 아이디어:
- 데이터의 분산을 최대한 보존하는 새로운 축(주성분)을 찾음
- 첫 번째 주성분: 분산이 가장 큰 방향
- 두 번째 주성분: 첫 번째와 직교하면서 분산이 가장 큰 방향
X → X_pca (선형 변환)특징
- 선형 변환
- 직교하는 주성분
- 분산 설명력 순서로 정렬
- 역변환 가능 (복원)
스케일링 필수! PCA 적용 전에 반드시 StandardScaler를 사용하세요. 스케일이 다른 특성이 있으면 분산이 큰 특성에 주성분이 편향됩니다.
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# 스케일링 (PCA 전 필수!)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 2D로 축소
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 설명된 분산 비율
print(f"Explained Variance Ratio: {pca.explained_variance_ratio_}")
print(f"Total: {pca.explained_variance_ratio_.sum():.2%}")최적 n_components 찾기
누적 분산 그래프(Scree Plot)를 통해 최적의 주성분 개수를 결정합니다.
pca_full = PCA()
pca_full.fit(X_scaled)
# 누적 분산 플롯
cumsum = np.cumsum(pca_full.explained_variance_ratio_)
plt.plot(cumsum, 'o-')
plt.axhline(0.95, color='r', linestyle='--') # 95% 기준
plt.axhline(0.90, color='orange', linestyle='--') # 90% 기준
plt.xlabel('Number of Components')
plt.ylabel('Cumulative Explained Variance')
plt.title('Scree Plot')경험적 기준: 일반적으로 누적 분산이 90~95%에 도달하는 주성분 개수를 선택합니다. 위 코드를 실행하여 데이터셋에 맞는 최적 개수를 직접 확인하세요.
주성분 해석 (Loading Analysis)
Loading Matrix를 통해 각 주성분이 어떤 원본 특성과 관련있는지 분석합니다.
import pandas as pd
# Loading Matrix (주성분과 원본 특성의 관계)
loadings = pd.DataFrame(
pca.components_.T,
columns=[f'PC{i+1}' for i in range(pca.n_components_)],
index=feature_names
)
print(loadings.round(3))3. t-SNE
**t-SNE (t-distributed Stochastic Neighbor Embedding)**는 비선형 차원 축소 기법으로, 시각화에 특화되어 있습니다.
핵심 아이디어:
- 고차원에서의 점들 간 유사도를 저차원에서도 보존
- 비선형 관계 캡처 가능
| 파라미터 | 설명 | 권장 범위 |
|---|---|---|
perplexity | 지역 이웃 수 | 5-50 |
n_iter | 반복 횟수 | 최소 1000 |
learning_rate | 학습률 | 10-1000 |
from sklearn.manifold import TSNE
tsne = TSNE(
n_components=2,
perplexity=30,
n_iter=1000,
random_state=42
)
X_tsne = tsne.fit_transform(X_scaled)Perplexity의 영향
Perplexity는 각 점이 고려하는 이웃의 수를 결정합니다:
- 작은 값 (5-10): 지역 구조 강조, 클러스터가 더 분리됨
- 큰 값 (30-50): 전역 구조 강조, 더 연속적인 분포
t-SNE 주의사항
- 클러스터 간 거리는 의미 없음 (상대적 위치만 의미)
- 클러스터 크기도 의미 없음
- 전역 구조 보존 어려움
- 파라미터에 민감
transform()없음 (fit_transform()만 가능)- 계산이 느림 (대규모 데이터에 부적합)
- 매 실행마다 결과가 다름 (
random_state고정 필요)
고차원 데이터 팁: t-SNE 적용 전 PCA로 먼저 50차원 정도로 축소하면 속도가 크게 향상됩니다.
4. UMAP
t-SNE보다 빠르고 전역 구조를 더 잘 보존하는 최신 기법입니다.
import umap
reducer = umap.UMAP(
n_components=2,
n_neighbors=15,
min_dist=0.1,
random_state=42
)
X_umap = reducer.fit_transform(X_scaled)
# 새 데이터 변환 가능 (t-SNE와 다른 점!)
X_new_umap = reducer.transform(X_new)5. 알고리즘 비교
| 특성 | PCA | t-SNE | UMAP |
|---|---|---|---|
| 유형 | 선형 | 비선형 | 비선형 |
| 목표 | 분산 최대화 | 이웃 구조 보존 | 이웃 구조 보존 |
| 속도 | 빠름 | 느림 | 중간 |
| 전역 구조 | 보존 | X | 보존 |
| Transform | O | X | O |
| 역변환 | O | X | X |
| 해석 가능성 | 높음 (loading) | 낮음 | 낮음 |
| 용도 | 전처리/시각화 | 시각화 | 시각화/전처리 |
코드 요약
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap
from sklearn.preprocessing import StandardScaler
# 스케일링 (필수!)
X_scaled = StandardScaler().fit_transform(X)
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f'설명 분산: {sum(pca.explained_variance_ratio_)*100:.1f}%')
# t-SNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_scaled)
# UMAP
reducer = umap.UMAP(n_components=2, random_state=42)
X_umap = reducer.fit_transform(X_scaled)
# 시각화
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for ax, X_reduced, title in zip(axes, [X_pca, X_tsne, X_umap], ['PCA', 't-SNE', 'UMAP']):
scatter = ax.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='tab10', alpha=0.7)
ax.set_title(title)실전 팁 & Best Practices
PCA 사용 가이드
- 전처리 필수: StandardScaler 적용 (스케일 영향 제거)
- 주성분 개수 선택: Elbow/Scree plot 확인, 누적 분산 90~95% 기준
- 해석: Loading matrix 분석, Biplot 시각화
- 용도: 시각화 (2~3D), 전처리 (노이즈 제거), 다중공선성 해결
t-SNE 사용 가이드
- 전처리: 스케일링 권장, 고차원이면 먼저 PCA로 50D 정도로 축소
- 하이퍼파라미터: perplexity 5~50, max_iter 최소 1000 (수렴 확인)
- 주의: 클러스터 간 거리/크기는 의미 없음
- 용도: 시각화 전용 (전처리로는 부적합)
선택 가이드
| 상황 | 권장 |
|---|---|
| 전처리/특성 추출 | PCA |
| 시각화 (소규모) | t-SNE |
| 시각화 (대규모) | UMAP |
| 새 데이터 변환 필요 | PCA or UMAP |
| 해석이 필요한 경우 | PCA |
면접 질문 맛보기
- PCA의 원리와 주성분 선택 방법은?
- t-SNE와 UMAP의 차이점은?
- 차원 축소를 전처리로 사용할 때 주의점은?
- PCA에서 스케일링이 필요한 이유는?
- t-SNE 결과에서 클러스터 간 거리를 해석할 수 있는가?
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
실습 노트북
노트북에서 추가로 다루는 내용:
- 2D 데이터로 PCA 직관 이해하기
- Iris, Digits 데이터셋 실습
- Eigenfaces (얼굴 인식 데이터) 시각화
- PCA를 이용한 이미지 압축 및 복원
- Perplexity 변화에 따른 t-SNE 결과 비교
- 연습 문제 (Wine, MNIST 데이터셋)
이전: 07. Clustering | 다음: 09. Anomaly Detection