AI/ML

[ML] 비지도학습 - 차원축소 (t-SNE)

죵욜이 2024. 12. 29. 02:59

t-SNE 란?

t-SNE (t-Distributed Stochastic Neighbor Embedding)

  • 고차원 데이터를 저차원으로 변환하여 시각화하는 차원 축소 기법
  • 데이터 포인트 간의 유사성을 보존하면서, 고차원 데이터를 2차원  또는 3차원 공간으로 변환
  • 데이터의 구조와 패턴을 시각적으로 이해할 수 있다

주요 개념

1. 고차원 공간에서의 데이터 관계 유지:

  • 데이터 포인트 간의 유사도를 고차원 공간과 저차원 공간 모두에서 확률로 정의하고,
    이를 최대한 일치시키도록 저차원 임베딩을 생성

2. 확률적 유사도 정의:

  • 고차원 공간 : 각 데이터 포인트 i 와 j 사이의 유사도를 조건부 확률 p 로 정의

 

    • 저차원 공간 :

  • 여기서 t-분포를 사용하여 거리 계산의 민감도를 줄입니다.

3. 목적 함수 : 

  • 두 확률 분포 P 와 Q 간의 Kullback-Leibler 발산(KL Divergence)을 최소화 합니다.


작동 원리

  1. 고차원 데이터에서 유사도 계산:
    • 데이터 포인트 간의 조건부 확률을 계산하여 고차원 공간에서의 관계를 정의합니다.
  2. 저차원 공간 초기화:
    • 일반적으로 무작위로 저차원 임베딩을 초기화합니다.
  3. 저차원 임베딩 업데이트:
    • 유사도 분포 P의 차이를 줄이기 위해 저차원 임베딩을 점진적으로 최적화합니다.
  4. 최적화 종료:
    • KL 발산이 충분히 작아지거나 정해진 반복 횟수에 도달하면 종료합니다.

장점

  1. 시각화 용이성:
    • 고차원 데이터의 패턴과 군집을 2D 또는 3D로 효과적으로 시각화.
  2. 비선형 데이터 처리:
    • 데이터의 비선형 구조를 잘 포착하여 복잡한 관계를 표현.
  3. 지역 구조 보존:
    • 데이터의 지역적 관계(가까운 이웃)를 잘 유지.

단점

  1. 해석 어려움:
    • 저차원 공간에서의 위치는 고차원 공간에서의 정확한 거리 관계를 반영하지 않음.
    • 전역적 구조(Global Structure)가 왜곡될 수 있음.
  2. 비용이 높음:
    • 계산 복잡도가 높아 대규모 데이터셋에서는 느리게 동작.
  3. 결과 재현 어려움:
    • 초기화와 하이퍼파라미터에 따라 결과가 달라질 수 있음.

주요 하이퍼파라미터

  1. perplexity:
    • 데이터 포인트가 고려하는 이웃의 수를 결정하는 하이퍼파라미터.
    • 일반적으로 5에서 50 사이의 값을 사용.
  2. learning_rate:
    • 임베딩을 학습하는 속도. 값이 너무 작으면 수렴이 느려지고, 너무 크면 최적화가 불안정해질 수 있음.
  3. n_iter:
    • 최적화를 반복하는 횟수.

예시

- 데이터 로드

from sklearn.datasets import fetch_openml
import pandas as pd

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

# 데이터와 레이블 분리
X = mnist.data
y = mnist.target

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

 

- 데이터 표준화

from sklearn.preprocessing import StandardScaler

# 데이터 표준화
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

 

- t-SNE 수행

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import seaborn as sns

# t-SNE 모델 생성
tsne = TSNE(n_components=2, random_state=42)

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

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

 

- t-SNE 결과 시각화

# 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()