⊢MachineLearning

비지도학습 : 차원축소 - t-SNE(t-Distributed Stochastic Neighbor Embedding)

최 수빈 2025. 3. 17. 17:54

 

t-SNE(t-Distributed Stochastic Neighbor Embedding)

 

고차원 데이터를 저차원(2D 또는 3D)으로 변환하여 시각화하는 차원 축소 기법

 

데이터 간 유사성을 보존하면서 고차원 데이터를 저차원으로 변환하여 데이터의 패턴을 효과적으로 시각화하는 데 활용

주로 비지도 학습에서 데이터의 구조를 이해하는 데 사용

 

  • 비선형 구조 탐지 가능 → 데이터의 복잡한 구조도 효과적으로 표현
  • 클러스터 시각화 → 데이터 내 잠지적 그룹(클러스터)을 명확히 구별할 수 있음
  • 고차원 데이터  시각화 → 2차원 또는 3차원으로 변환하여 인간이 직관적으로 이해할 수 있도록 함

 

  • 시간 복잡도가 높음 → 대규모 데이터셋에서는 계산이 느릴 수 있음
  • 매번 다른 결과를 생성 → 초깃값(random_state)에 따라 결과가 달라질 수 있음
  • 해석이 어려울 수 있음 → 거리 크기가 의미를 갖지 않으며 상대적 관계만 중요

 

 

작동원리

  1. 고차원 공간에서의 유사성 계산
    데이터  포인트 간 거리를 기반으로 확률 분포 생성
    비슷한 데이터 포인트일수록 높은 확률을 갖도록 설정
  2. 저차원 공간에서의 유사성 계산
    고차원 데이터의 분포를 유지하기 위해 t-분포(t-distribution)를 활용하여 저차원 공간에서 유사성을 계산
  3. KL 발산(KL Divergence) 최소화
    고차원과 저차원에서 계산한 유사성 확률 분포가 최대한 같아지도록 Kullback-Leibler발산(KL Divergence)을 최소화하는 방향으로 학습
  4. 반복적 최적화
    데이터 포인트의 위치를 점진적으로 업데이트하며 최적의 저차원 표현을 찾음

 

t-SNE 실습

MNIST 데이터셋을 활용한 t-SNE 적용

 

 

데이터 로드

from sklearn.datasets import fetch_openml
import pandas as pd

# MNIST 데이터셋 불러오기
mnist = fetch_openml('mnist_784', version=1)

# 데이터와 레이블 분리
X = mnist.data  # 이미지 데이터 (784개의 픽셀 값)
y = mnist.target  # 숫자 라벨

# 데이터 프레임의 첫 5행 출력
print(X.head())
print(y.head())

"""
   pixel1  pixel2  pixel3  pixel4  pixel5  pixel6  pixel7  pixel8  pixel9  \
0       0       0       0       0       0       0       0       0       0   
1       0       0       0       0       0       0       0       0       0   
2       0       0       0       0       0       0       0       0       0   
3       0       0       0       0       0       0       0       0       0   
4       0       0       0       0       0       0       0       0       0   

   pixel10  ...  pixel775  pixel776  pixel777  pixel778  pixel779  pixel780  \
0        0  ...         0         0         0         0         0         0   
1        0  ...         0         0         0         0         0         0   
2        0  ...         0         0         0         0         0         0   
3        0  ...         0         0         0         0         0         0   
4        0  ...         0         0         0         0         0         0   

   pixel781  pixel782  pixel783  pixel784  
0         0         0         0         0  
1         0         0         0         0  
2         0         0         0         0  
3         0         0         0         0  
4         0         0         0         0  

[5 rows x 784 columns]
0    5
1    0
2    4
3    1
4    9
Name: class, dtype: category
Categories (10, object): ['0', '1', '2', '3', ..., '6', '7', '8', '9']
"""

 

데이터 표준화

t-SNE는 거리 기반 학습 기법이므로, 데이터의 크기 차이를 줄이기 위해 표준화(Standardization) 과정이 필요

from sklearn.preprocessing import StandardScaler

# 데이터 표준화 (평균 0, 분산 1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

 

t-SNE 수행

Scikit-learn의 TSNE를 사용하여 2차원 공간으로 차원 축소

from sklearn.manifold import TSNE

# t-SNE 모델 생성 (2차원으로 변환)
tsne = TSNE(n_components=2, random_state=42)

# t-SNE 학습 및 변환
X_tsne = tsne.fit_transform(X_scaled)

# 변환된 데이터의 크기 확인
print(X_tsne.shape)  

"""
(70000, 2)
"""

 

 t-SNE 결과 시각화

변환된 데이터를 2차원 그래프에서 시각화

데이터의 라벨(숫자 값)을 기반으로 색상을 구분

import matplotlib.pyplot as plt
import seaborn as sns

# 2차원 시각화
plt.figure(figsize=(10, 7))
sns.scatterplot(x=X_tsne[:, 0], y=X_tsne[:, 1], hue=y, palette='viridis', legend=None)
plt.title('t-SNE of MNIST Dataset (2D)')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.show()

t-SNE of MNIST Dataset (2D)

 

  • 결과 그래프에서 비슷한 숫자들이 클러스터를 형성하는 것을 확인 가능
  • t-SNE는 절대적인 거리 정보보다는 상대적 유사성만을 보존하기 때문에, 거리 크기 자체는 큰 의미가 없음
  • 같은 숫자들은 가깝게 모여 있지만, 다른 숫자와의 경계가 완벽히 구분되지는 않을 수 있음
  • 초기 조건(random_state)에 따라 결과가 달라질 수 있음 → 여러 번 실행하면서 최적의 결과를 찾는 것이 중요

 

 

t-SNE는 강력한 시각화 도구이지만, 해석이 중요함

클러스터가 형성되는 데이터라면 효과적으로 군집 구조 파악 가능

대규모 데이터에서는 시간이 오래 걸릴 수 있으므로, PCA로 미리 차원 축소 후 t-SNE를 적용하는 것도 고려 가능

결과는 매 실행마다 달라질 수 있으므로, 여러 번 수행하여 패턴을 확인하는 것이 중요