목표
- 차원 축소의 필요성
- 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. 고려 사항
- 데이터 전처리
- 스케일링, 이상치 제거 등 작업을 먼저 수행
- 하이퍼 파라미터 튜닝
- PCA: 주성분 개수 얼마나 선택할 지(설명 분산 비율 확인)
- t-SNE: perplexity, learning rate, iteration 수
- UMAP: n_neighbors, min_dist 등
- 결과 해석
- PCA는 주성분 방향이 어떤 피처 조합과 관련이 있는지 해석 가능
- t-SNE/UMAP 결과는 시각화를 통해 군집 형태나 분포를 확인하되, 지나친 해석은 지양 (거리 의미 왜곡 가능성)
- 성능 측정 및 검증
- 최종 목적(군집 분석, 노이즈 제거, 시각화 등)에 따라 적절한 지표 사용해 성능 평가 (별도 지표는 없음)
실습
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_(주성분 벡터)를 살펴보면 각 피처가 주성분에 기여하는 정도를 확인 가능
- 이를 통해 주성분이 어떤 피처들의 조합으로 형성되었는지 파악 가능
'AI > 머신러닝' 카테고리의 다른 글
센서 데이터와 이상 탐지 5일차 (AutoEncoder, DBSCAN ..) (0) | 2025.03.27 |
---|---|
실무에 쓰는 머신러닝 기초 1주차 (이상 탐지) (0) | 2025.03.24 |
센서 데이터와 이상 탐지 (주파수, FFT) (1) | 2025.03.20 |
실무에 쓰는 머신러닝 기초 1주차 (비지도 학습 & 클러스터링) (0) | 2025.03.19 |
센서 데이터와 이상 탐지 2일차 (이상치 탐지 유형, 감지 시스템, 이상치 모델) (0) | 2025.03.18 |