튜토리얼
08. Dimensionality Reduction

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. 알고리즘 비교

특성PCAt-SNEUMAP
유형선형비선형비선형
목표분산 최대화이웃 구조 보존이웃 구조 보존
속도빠름느림중간
전역 구조보존X보존
TransformOXO
역변환OXX
해석 가능성높음 (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 사용 가이드

  1. 전처리 필수: StandardScaler 적용 (스케일 영향 제거)
  2. 주성분 개수 선택: Elbow/Scree plot 확인, 누적 분산 90~95% 기준
  3. 해석: Loading matrix 분석, Biplot 시각화
  4. 용도: 시각화 (2~3D), 전처리 (노이즈 제거), 다중공선성 해결

t-SNE 사용 가이드

  1. 전처리: 스케일링 권장, 고차원이면 먼저 PCA로 50D 정도로 축소
  2. 하이퍼파라미터: perplexity 5~50, max_iter 최소 1000 (수렴 확인)
  3. 주의: 클러스터 간 거리/크기는 의미 없음
  4. 용도: 시각화 전용 (전처리로는 부적합)

선택 가이드

상황권장
전처리/특성 추출PCA
시각화 (소규모)t-SNE
시각화 (대규모)UMAP
새 데이터 변환 필요PCA or UMAP
해석이 필요한 경우PCA

면접 질문 맛보기

  1. PCA의 원리와 주성분 선택 방법은?
  2. t-SNE와 UMAP의 차이점은?
  3. 차원 축소를 전처리로 사용할 때 주의점은?
  4. PCA에서 스케일링이 필요한 이유는?
  5. 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