AI/머신러닝

실무에 쓰는 머신러닝 기초 1주차 (차원 축소)

edcrfv458 2025. 3. 21. 11:27

목표

  • 차원 축소의 필요성
  • PCA 개념과 절차
  • 비선형 차원 축소(t-SNE, UMAP)

 

1. 차원 축소의 필요성

 

고차원 데이터

  • 데이터의 피처(변수)가 매우 많은 상황
  • 예컨대 이미지 데이터의 경우, 한 장의 이미를 구성하는 픽셀 수만큼 피처가 존재할 수 있음

 

문제 상황

  • 모델 학습 시 연산 복잡도가 급증하여 시간이 오래 걸림
  • 많은 피처들 중 일부는 실제로 중요한 정보를 주지 못하는 노이즈 일 수 있음
  • 차원이 너무 높아지면 데이터를 시각화하기 어려워 패턴 파악이 힘듦

 

차원 축소의 장점

  • 노이즈 제거로 모델 성능 및 일반화 능력이 개선
  • 2차원이나 3차원으로 축소하면 시각적으로 직관적인 분석이 가능
  • 데이터의 핵심 구조나 패턴을 더 쉽게 발견 가능

 

2. 차원 축소 기본 개념

 

선형 차원 축소 vs 비선형 차원 축소

  • 선형 차원 축소(PCA가 대표적인 기법)
    • 데이터를 특정 선형 변환(선형 곱)으로 투영해 차원을 줄이는 기법
    • 선형 변환이라는 간단 계산만으로 차원 축소를 하게 되는 경우
  • 비선형 차원 축소(t-SNE, UMAP 기법 등)
    • 데이터가 복잡한 기하학적 구조 가질 때 선형 변환만으로 충분하지 않을 수 있으므로 비선형 맵핑 이용
      • 예를 들면 종이 한 장이 있고 그 종이에 그림이 복잡하게 그러져있다고 가정
      • 이 종이는 실제로 2차원이지만 종이가 구겨져서 3차원 공간 속에서 복잡한 형태를 띄고 있음
      • 우리가 종이를 펼쳐 다시 평평한 2차원 상태로 만들면 그 원래의 그림을 쉽게 2D에서 볼 수 있음
    • 즉, 구겨져 있는 형태(복잡한 형태)를 펴서 차원 축소를 하는 경우

 

차원 축소와 노이즈 제거

  • 대부분의 데이터에는 잡음이 포함
  • 차원 축소 시 중요한 변동을 잘 설명하지 못하는 데이터는 줄여버림으로써 불필요한 정보를 걸러냄

 

3. PCA (주성분 분석)

 

핵심 아이디어

  • 데이터에서 가장 분산이 큰 방향(주성분)을 찾아 그 방향으로 데이터를 투영하면 그 축이 데이터의 중요한 변동(variance)을 많이 설명할 수 있다.
    • 주성분(Principal Component): 가장 큰 분산을 갖는 방향을 1주성분, 그 다음으로 큰 분산을 갖는 서로 직교하는 방향 2주성분
    • 설명 분산(Explained Variance) 비율: 몇 개의 주성분만으로 전체 분산의 몇 퍼센트를 설명할 수 있는지 나타냄

 

장단점

  • 장점
    • 계산이 비교적 간단(선형 연산)
    • 결과 해석이 용이(주성분 방향 해석)
    • 노이즈 제거 효과
  • 단점
    • 데이터가 선형이 아닌 패턴일 경우 정보 손실 발생
    • 매우 복잡한 구조를 충분히 반영하기 어려움

 

4. t-SNE와 UMAP

 

t-SNE (t-Distributed Stochastic Neighbor Embedding)

  • 고차원 공간에서 서로 가까운 데이터 포인트는 가까이, 먼 데이터 포인트는 멀리 배치하려고 하는 비선형 기법
  • 동작 원리
    • 고차원에서 데이터 간 지역적 확률 분포를 추정(주변 데이터와의 거리 기반)
    • 2차원 혹은 3차원에서 비슷한 확률 분포가 되도록 데이터들을 배치
    • 고차원에서 A가 B와 가까울 확률을 구하고, 2D에서는 그 확률을 최대한 비슷하게 만들도록 위치를 조정
  • 장점
    • 데이터의 군집이 자연스럽게 시각화되어, 군집별 패턴 인지에 용이
  • 단점
    • 계산 비용이 큰 편(대규모 데이터에는 시간이 오래 걸림)
    • 하이퍼 파라미터(learning rate, perplexity) 선택에 따라 결과가 달라짐
    • 시각화 결과 해석이 직관적이지만, 실제 거리 척도의 왜곡 가능성

 

UMAP (Uniform Manifold Approximation and Projection)

  • t-SNE와 유사하게 고차원 데이터의 구조를 2D/3D로 매핑하는 비선형 차원 축소 기법
  • 근접 그래프(nearest neighbor graph)와 Riemannian manifold 이론에 기반
  •  예시
    • 종이가 구겨진 상태는 매니폴드(Manifold)라고 부르는 비선형적으로 휘어진 공간
    • UMAP은 이 종이가 구겨져 있는 구조에서 가까운 점들은 여전히 가깝게, 먼 점들을 멀리 놓이도록 매니폴드를 펼쳐 2D로 맵핑
  • 장점
    • t-SNE 보다 빠르며 대규모 데이터에도 비교적 효율적
    • 지역적/글로벌 구조를 함께 잘 반영
    • 매개변수(n_neighbors, min_dist)를 통해 클러스터의 응집도나 분산 정도를 조절
  • 단점
    • 알고리즘의 개념이 비교적 복잡
    • 하이퍼 파라미터 튜닝 필요
    • t-SNE 만큼은 아니지만 축소 과정에서 정보 왜곡 발생 가능성 존재

 

정리

  • t-SNE와 UMAP 모두 시각화 목적에서 많이 쓰이며 비슷한 방식으로 "서로 비슷한 포인트끼리 가까이 두는" 방식
  • 데이터를 2D로 프로젝트해서 한 눈에 군집 패턴을 볼 수 있다는 점이 가장 큰 장점

 

코드

import numpy as np
import matplotlib.pyplot as plt

# 1. 데이터 로드 (Iris 예시)
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data   # (150, 4) 형태: 꽃받침, 꽃잎 길이·너비
y = iris.target # (150,)  : 품종 라벨(0, 1, 2)

# 2. PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 3. t-SNE
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)

# 4. UMAP
# (umap-learn 설치 필요할 수 있습니다 : pip install umap-learn)
from umap import UMAP
umap = UMAP(n_components=2, n_neighbors=15, random_state=42)
X_umap = umap.fit_transform(X)

# 5. 시각화 (PCA, t-SNE, UMAP 결과 비교)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y)
axes[0].set_title("PCA (2D)")

axes[1].scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
axes[1].set_title("t-SNE (2D)")

axes[2].scatter(X_umap[:, 0], X_umap[:, 1], c=y)
axes[2].set_title("UMAP (2D)")

plt.tight_layout()
plt.show()

 

5. 고려 사항

  1. 데이터 전처리
    1. 스케일링, 이상치 제거 등 작업을 먼저 수행
  2. 하이퍼 파라미터 튜닝
    1. PCA: 주성분 개수 얼마나 선택할 지(설명 분산 비율 확인)
    2. t-SNE: perplexity, learning rate, iteration 수
    3. UMAP: n_neighbors, min_dist 등
  3. 결과 해석
    1. PCA는 주성분 방향이 어떤 피처 조합과 관련이 있는지 해석 가능
    2. t-SNE/UMAP 결과는 시각화를 통해 군집 형태나 분포를 확인하되, 지나친 해석은 지양 (거리 의미 왜곡 가능성)
  4. 성능 측정 및 검증
    1. 최종 목적(군집 분석, 노이즈 제거, 시각화 등)에 따라 적절한 지표 사용해 성능 평가 (별도 지표는 없음)

 

실습

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from umap import UMAP

# 1. 데이터셋
wine = load_wine()
X = wine.data
y = wine.target  # 3가지 와인 품종(0, 1, 2)

# 2. PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 3. t-SNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)

# 4. UMAP
umap = UMAP(n_components=2, n_neighbors=15, random_state=42)
X_umap = umap.fit_transform(X)

# 5. 시각화 (PCA, t-SNE, UMAP 결과 비교)
fig, axes = plt.subplots(1, 3, figsize=(15, 4))

axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y)
axes[0].set_title("PCA (2D)")

axes[1].scatter(X_tsne[:, 0], X_tsne[:, 1], c=y)
axes[1].set_title("t-SNE (2D)")

axes[2].scatter(X_umap[:, 0], X_umap[:, 1], c=y)
axes[2].set_title("UMAP (2D)")

plt.tight_layout()
plt.show()

 

  • 차원 축소 시 주성분의 개수 설정
    • 설명 분산 비율을 확인해 원하는 수준(ex. 80% 이상)을 만족하도록 주성분 수를 결정
    • 업무 목적에 맞춰 시각적으로 해석 가능한 범위를 기준으로 선택
  • PCA 결과에서 주성분 해석 방법
    • PCA 변환 후 components_(주성분 벡터)를 살펴보면 각 피처가 주성분에 기여하는 정도를 확인 가능
    • 이를 통해 주성분이 어떤 피처들의 조합으로 형성되었는지 파악 가능