logo

[머신러닝] 차원 축소


 

들어가며: 차원의 저주와 차원 축소의 필요성

머신러닝과 데이터 과학에서, 우리는 소위 "차원의 저주(curse of dimensionality)"라는 문제에 직면합니다. 이 현상은 고차원 데이터를 다룰 때 발생하는 다양한 문제점들을 말합니다. 고차원 공간에서 데이터를 분석하거나 모델링하려고 할 때, 데이터의 양이 제한적이라면 공간이 매우 희박해지고(sparsity), 각 차원 간의 거리가 기하급수적으로 증가하기 시작합니다. 이로 인해 데이터 분석이나 모델 훈련에서 여러가지 어려움을 겪게 되며, 이를 해결하기 위해 차원 축소 기법이 필수적으로 사용됩니다.

 

차원의 저주(curse of dimensionality)란 무엇인가?

차원의 저주는 주로 고차원 데이터를 처리할 때 데이터의 양이 충분히 많지 않을 경우 발생합니다. 고차원에서는 데이터 포인트들 사이의 거리가 매우 멀어져서, 같은 양의 데이터라도 저차원일 때보다 훨씬 더 많은 정보를 필요로 합니다. 이는 데이터의 밀집도가 감소하고, 이로 인해 데이터 분석이나 머신러닝 모델의 정확도가 저하될 수 있음을 의미합니다. 예를 들어, 머신러닝 알고리즘은 주변의 가까운 이웃(nearest neighbors)을 찾는 것에 의존하는데, 차원이 증가함에 따라 이들 간의 거리가 심하게 증가하여 이런 알고리즘의 효율성이 크게 떨어집니다.

 

차원 축소가 머신러닝에서 중요한 이유

차원 축소는 이러한 문제를 해결하는 중요한 방법 중 하나입니다. 고차원 데이터를 가능한 정보 손실을 최소화하면서 저차원으로 변환함으로써, 데이터의 밀집도를 증가시키고, 계산 복잡성을 줄이며, 결과적으로 머신러닝 모델의 성능을 향상시킵니다. 또한 차원 축소는 데이터의 시각화에도 중요한 역할을 합니다. 고차원 데이터는 시각적으로 표현하기 어려운데, 차원 축소를 통해 2차원 또는 3차원 공간에 데이터를 표현함으로써 데이터의 패턴을 더 쉽게 이해하고 해석할 수 있습니다.

이런 이유로 차원 축소는 머신러닝과 데이터 과학 프로젝트에서 매우 중요한 단계입니다. 차원 축소를 통해 불필요한 정보를 제거하고 데이터의 핵심 구조를 파악함으로써 보다 효과적인 데이터 분석과 모델링이 가능해집니다.

결론적으로, 차원의 저주는 데이터 과학과 머신러닝에서 큰 도전 과제이며, 차원 축소는 이러한 문제에 대한 핵심적인 해결책 중 하나로 자리잡고 있습니다. 다양한 차원 축소 기법을 이해하고 적절히 적용하는 것은 복잡한 데이터 세트를 효과적으로 분석하고, 높은 성능의 머신러닝 모델을 구축하는 데 있어 필수적인 기술입니다.



 

차원 축소 기법의 개요

차원 축소는 고차원 데이터의 복잡성을 줄이고, 더 낮은 차원의 데이터 표현을 찾아내는 프로세스입니다. 데이터의 차원을 축소하는 것은 계산 복잡도를 줄이고, 데이터를 시각화하며, 때로는 데이터 내의 잡음을 제거하는 데 도움을 줍니다. 이를 통해 더 간결하고, 이해하기 쉬우며, 처리하기 쉬운 데이터 형식을 얻을 수 있습니다.

 

차원 축소의 목적

  • 계산 효율성 증가: 데이터의 차원이 줄어들면, 알고리즘의 연산 비용도 감소합니다.
  • 잡음 제거: 불필요한 노이즈를 제거하여 데이터의 주요 특성을 보다 명확하게 드러낼 수 있습니다.
  • 데이터 시각화: 고차원 데이터를 2D 또는 3D로 축소하면 시각화와 해석이 용이해집니다.
  • 차원의 저주 완화: 차원이 증가함에 따라 필요한 데이터 양이 기하급수적으로 증가하는 '차원의 저주' 현상을 완화합니다.
 

주요 차원 축소 기법 소개

차원 축소 기법은 크게 두 가지 범주로 나눌 수 있습니다: 선형 기법과 비선형 기법입니다. 선형 기법의 대표적인 예로는 PCA(주성분 분석)가 있으며, 비선형 기법의 예로는 t-SNE, LLE(지역 선형 임베딩) 등이 있습니다.

PCA(주성분 분석)

  • PCA는 고차원 데이터의 분산이 최대가 되는 방향을 찾아, 데이터를 새로운 축으로 재표현하는 방법입니다. 이 새로운 축들은 서로 직교합니다.
  • 수학적으로 PCA는 공분산 행렬의 고유벡터를 찾는 문제로 설명할 수 있습니다. 각 고유벡터는 주성분을 나타내며, 상응하는 고유값은 그 방향의 중요도를 나타냅니다.
# Python을 사용한 PCA 예제
from sklearn.decomposition import PCA
import numpy as np

# 가상의 데이터 생성
X = np.random.rand(100, 5)  # 100개의 샘플과 5차원

# PCA 객체 생성 및 학습
pca = PCA(n_components=2)  # 2차원으로 축소
X_reduced = pca.fit_transform(X)

print("Reduced shape:", X_reduced.shape)

t-SNE

  • t-SNE(t-distributed Stochastic Neighbor Embedding)는 고차원 데이터의 구조를 보존하면서 저차원으로 매핑하는 비선형 기법입니다. 주로 고차원 데이터의 시각화에 이용됩니다.
  • t-SNE는 고차원에서의 인접 데이터 포인트 간의 거리와 저차원에서의 데이터 포인트 간의 거리를 비슷하게 유지하려는 목표를 가집니다.
# Python을 사용한 t-SNE 예제
from sklearn.manifold import TSNE
import numpy as np

# 가상의 데이터 생성
X = np.random.rand(100, 5)  # 100개의 샘플과 5차원

# t-SNE 모델 생성 및 변환
tsne = TSNE(n_components=2, random_state=42)
X_embedded = tsne.fit_transform(X)

print("Reduced shape:", X_embedded.shape)

PCA vs t-SNE

PCA는 선형 차원 축소에 효과적이며, 계산 비용이 상대적으로 낮습니다. 반면, t-SNE는 비선형 구조를 가진 데이터에 더 적합하며, 특히 데이터 시각화에 유용합니다. 그러나, t-SNE는 PCA보다 계산 비용이 더 높습니다.

 

마치며

적절한 차원 축소 기법을 선택하기 위해서는 데이터의 특성과 최종적으로 달성하고자하는 목표를 고려해야 합니다. 계산 비용, 축소 후의 차원 수, 및 데이터의 본질적인 구조는 모두 고려해야 할 중요한 요소입니다.


 

PCA(주성분 분석)

 

PCA란 무엇인가?

PCA(Principal Component Analysis, 주성분 분석)는 고차원 데이터의 차원을 축소하는 가장 대표적인 선형 차원 축소 기법 중 하나입니다. PCA는 데이터 내 변동성이 가장 큰 방향(주성분)을 찾아, 그 방향으로 데이터를 투영함으로써 차원을 축소합니다. 이 과정에서 고차원 데이터의 주요 특성을 유지할 수 있어, 시각화, 노이즈 필터링, 특성 압축 등 다양한 분야에서 널리 사용됩니다.

 

PCA의 원리

공분산 행렬과 고유값 분해

PCA를 이해하는 핵심은 공분산 행렬의 고유값 분해입니다. 고차원 데이터에서 각 변수간의 공분산을 요소로 하는 공분산 행렬을 생성하고, 이를 고유값 분해합니다. 고유값 분해는 공분산 행렬을 고유값과 이에 해당하는 고유벡터로 분리하는 과정을 의미합니다. 고유벡터는 데이터의 변동성이 큰 방향을 나타내고, 고유값은 그 방향의 변동성의 크기를 나타냅니다.

주성분의 선정

주성분은 고유값이 가장 큰 고유벡터로부터 순서대로 선택됩니다. 첫 번째 주성분은 가장 큰 고유값에 해당하는 고유벡터 방향으로, 가장 많은 정보(분산)을 담고 있습니다. 두 번째 주성분은 첫 번째 주성분과 직교(orthogonal)하면서, 남은 정보 중 가장 큰 정보를 담고 있는 방향입니다. 이런 식으로 원하는 차원 수만큼 주성분을 선택합니다.

 

PCA의 단계별 실행 과정

데이터 표준화

차원 축소 전 데이터를 표준화하여 각 변수의 평균을 0, 분산을 1로 조정합니다. 이는 변수들이 서로 다른 단위를 가진 경우, 불필요한 왜곡을 방지하기 위함입니다.

공분산 행렬 계산

표준화된 데이터에 대해 공분산 행렬을 계산합니다. 이는 데이터의 각 변수 간의 변동성을 측정합니다.

고유값과 고유벡터 찾기

공분산 행렬을 고유값 분해하여 고유값과 고유벡터를 구합니다. 이 과정은 PCA의 핵심으로, 데이터의 주요 변동 방향을 찾는 과정입니다.

주성분으로 데이터 투영

선택된 주성분(고유벡터)에 데이터를 투영하여 새로운 저차원 공간으로 변환합니다. 이는 원래 데이터에 비해 훨씬 적은 차원을 가지면서도 데이터의 주요 변동성을 유지하게 됩니다.

 

PCA 활용 사례

시각화

고차원 데이터를 2차원 또는 3차원으로 축소하여 시각화하는 데 사용됩니다. 이를 통해 데이터의 구조나 패턴을 이해하기 쉽게 만들 수 있습니다.

노이즈 필터링

데이터의 변동성이 큰 방향(주성분)을 유지하면서 노이즈가 포함된 부분을 제거할 수 있습니다. 이는 고유값이 작은 주성분을 제거함으로써 달성됩니다.

특성압축 및 데이터 압축

대량의 데이터를 처리할 때 메모리 사용량을 줄이거나 계산 효율을 향상시키기 위해 사용됩니다. 데이터의 주요 특성을 유지하면서도 데이터의 크기를 줄일 수 있습니다.

 

Python 코드 예시

PCA를 구현하는 Python 코드 예시는 다음과 같습니다.

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np

# 가상의 데이터 생성
X = np.random.rand(100, 5)  # 100개의 데이터와 5개의 특성

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

# PCA 모델 생성 및 학습 (2차원으로 차원 축소)
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print("원본 데이터의 차원: ", X.shape)
print("차원 축소 후 데이터의 차원: ", X_pca.shape)

이 코드는 5차원 데이터를 2차원으로 차원 축소하는 과정을 보여줍니다. 데이터를 표준화한 후, 2개의 주성분으로 구성된 새로운 공간으로 변환합니다.


t-SNE

 

t-SNE란 무엇인가?

t-SNE(t-distributed Stochastic Neighbor Embedding)는 고차원 데이터를 저차원(주로 2차원 또는 3차원)으로 매핑하여 시각화하기 위한 기계학습 기법입니다. 기존의 SNE(Stochastic Neighbor Embedding) 방법을 개선하여, 고차원 데이터 내의 구조를 보존하면서 이를 저차원으로 효율적으로 표현할 수 있게 해줍니다. 데이터의 유사성을 기반으로 하여, 비슷한 데이터는 저차원 공간에서 가까이, 비슷하지 않은 데이터는 멀리 배치되는 방식으로 작동합니다.

 

t-SNE의 원리

고차원 데이터의 유사도와 저차원 데이터의 유사도

t-SNE는 각 데이터 포인트들 간의 유사도를 확률로 표현합니다. 고차원 공간에서는 가우시안 분포를 사용해 각 점 i에 대해 다른 모든 점 j와의 조건부 확률 p(j|i)를 계산합니다. 이 확률은 점 i를 주변 점 j에 대한 이웃으로 생각할 확률로 해석됩니다. 저차원에서도 동일하게 각 점들 간의 유사도를 확률로 변환하지만, t-분포를 사용하여 더 넓은 공간에 데이터를 분산시키는 방식으로 작동합니다.

SNE 방법론에서 t-SNE로의 발전

SNE는 고차원 데이터를 저차원에 효과적으로 매핑하는 기법이었으나, 몇 가지 문제점(특히 최적화 과정의 어려움)이 있었습니다. t-SNE는 이러한 문제점을 개선하기 위해 t-분포를 도입하고 최적화 과정을 간소화했습니다. 이로 인해, 특히 고차원 공간에서의 군집이 저차원에서도 잘 보존되도록 하는 뛰어난 기능을 제공합니다.

 

t-SNE의 실행 과정

가우시안 분포와 t-분포의 사용

고차원 공간에서 각 점에 대하여 가우시안 분포를 사용하여 다른 점들과의 유사도를 확률로 변환합니다. 저차원에서는 t-분포를 사용하는데, 이는 꼬리가 더 두터운 분포로, 점들이 서로 멀어져 있게 함으로써 군집 간의 거리를 더 잘 보존할 수 있게 합니다.

t-SNE를 통한 시각화 과정

t-SNE는 먼저 무작위로 저차원 공간에 데이터 포인트를 배치한 다음, 고차원 공간의 유사도와 저차원 공간의 유사도가 최대한 비슷해지도록 점들을 조금씩 이동시키는 방식으로 작동합니다. 이 과정은 점들이 점점 클러스터를 형성하면서 저차원 공간에서도 고차원 데이터의 구조가 유지되도록 합니다.

 

t-SNE 활용 사례

고차원 데이터의 시각화

t-SNE는 특히 고차원 데이터의 시각화에 유용한 도구입니다. 예를 들어, 이미지 데이터, 텍스트 데이터, 유전자 데이터와 같이 원래 매우 많은 특성을 가진 데이터를 2차원 또는 3차원 공간에 매핑하여, 데이터 간의 관계를 직관적으로 파악할 수 있게 해줍니다.

데이터 클러스터링 및 가시성 향상

데이터가 어떻게 군집을 형성하는지를 시각적으로 보여줌으로써, 데이터 내에 숨겨진 패턴이나 구조를 발견할 수 있게 해줍니다. 이를 통해 데이터의 성질을 더 잘 이해할 수 있으며, 더 나은 분석과 모델링을 가능하게 합니다.

t-SNE는 고차원 데이터를 저차원으로 효과적으로 시각화하는 강력한 도구이지만, 실행 시간이 오래 걸릴 수 있고, 사용자가 설정하는 파라미터(예: perplexity)에 따라 결과가 크게 달라질 수 있으므로 주의 깊게 사용해야 합니다.


 

PCA vs t-SNE

 

각각의 장단점 분석

PCA (주성분 분석):

  • 장점:
    • 계산 효율성이 높고, 대규모 데이터셋에 쉽게 적용할 수 있습니다.
    • 결과의 변동성이 큰 주성분 순서로 설명되어, 결과 해석이 비교적 명확합니다.
    • 선형적인 데이터 구조를 잘 추출합니다.
  • 단점:
    • 비선형 구조를 갖는 데이터에 대해서는 효과적인 차원 축소를 수행하기 어렵습니다.
    • 모든 주성분들이 동등하게 중요하다고 가정, 실제 데이터 분포의 중요한 비선형 특성을 놓칠 수 있습니다.

t-SNE (t-distributed Stochastic Neighbor Embedding):

  • 장점:
    • 고차원 데이터에서도 데이터 포인트 간의 관계를 잘 보존하는 훌륭한 시각화 결과를 제공합니다.
    • 비선형 구조를 갖는 데이터에 매우 효과적입니다.
    • 클러스터링이나 데이터 분포의 패턴을 직관적으로 확인할 수 있습니다.
  • 단점:
    • 계산 복잡도가 높으며, 대규모 데이터셋에는 적용하기 어렵습니다.
    • 결과의 재현성이 낮을 수 있으며, 초모수(hyperparameter) 선택에 따라 결과가 크게 달라집니다.
    • 직관적인 해석이 PCA에 비해 어렵습니다.
 

언제 PCA를 사용하고, 언제 t-SNE를 사용하는가?

  • PCA 사용 시기:

    • 데이터셋이 선형 구조를 가지고 있을 때 유용합니다.
    • 계산 비용을 줄이고 싶거나 빠른 처리가 필요할 때 적합합니다.
    • 데이터의 주요 분산 축을 이해하고자 할 때 사용합니다.
  • t-SNE 사용 시기:

    • 데이터 포인트 사이의 로컬 구조와 클러스터 패턴을 시각적으로 파악하고자 할 때 주로 사용됩니다.
    • 비선형 구조의 데이터에서 복잡한 패턴을 파악하고 싶을 때 유용합니다.
    • 데이터 탐색 단계에서, 특히 고차원 데이터의 구조를 이해하고자 할 때 사용됩니다.
 

실제 데이터에 적용된 사례 비교

PCA 예시: 대규모 소비자 설문 데이터에 PCA를 적용하여, 소비자들의 선호도나 행동 패턴에 영향을 미치는 주요 요인들을 식별할 수 있습니다. 이는 마케팅 전략 수립에 중요한 정보를 제공할 수 있습니다.

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 가상의 데이터셋
X = # 데이터셋 로드

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

plt.scatter(X_pca[:, 0], X_pca[:, 1])
plt.xlabel('PCA1')
plt.ylabel('PCA2')
plt.title('PCA of Consumer Survey Data')
plt.show()

t-SNE 예시: 생물학적 데이터, 예를 들면 유전자 발현 데이터에 t-SNE를 적용하여, 다양한 세포 유형간의 관계를 시각적으로 분류하고 이해할 수 있습니다. 이는 새로운 생물학적 메커니즘을 발견하는 데에 기여할 수 있습니다.

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

X = # 데이터셋 로드

tsne = TSNE(n_components=2, perplexity=40, n_iter=300)
X_tsne = tsne.fit_transform(X)

plt.scatter(X_tsne[:, 0], X_tsne[:, 1])
plt.xlabel('t-SNE1')
plt.ylabel('t-SNE2')
plt.title('t-SNE of Gene Expression Data')
plt.show()

결론적으로, PCA와 t-SNE의 선택은 데이터의 특성과 목적에 따라 달라집니다. 빠른 처리와 선형 구조 해석이 필요할 때는 PCA가, 비선형 구조의 복잡한 데이터 패턴을 파악하고자 할 때는 t-SNE가 더 적합할 수 있습니다.


 

마치며: 적절한 차원 축소 기법 선택하기

차원 축소는 데이터의 복잡성을 줄이고, 계산 비용을 감소시키며, 때로는 모델의 성능을 향상시키기도 합니다. 그러나 어떤 차원 축소 기법이 데이터셋에 가장 적합한지 결정하기 위해서는 여러 요소를 고려해야 합니다.

차원 축소 기법을 선택할 때 고려해야 할 요소들

  • 데이터의 특성과 구조: 데이터가 선형적으로 분리 가능한지, 아니면 복잡한 비선형 구조를 가지고 있는지에 따라 선택 기법이 달라질 수 있습니다. 예를 들어, 선형 구조의 데이터에는 PCA가 적합할 수 있으나, 비선형 구조에서는 t-SNE나 UMAP 같은 기법이 더 좋은 성능을 보일 수 있습니다.

  • 목표의 성격: 데이터 탐색을 위한 목적인지, 아니면 예측 모델링을 위해 차원을 축소하려는 목적인지에 따라 선택할 수 있는 기법이 달라집니다. 데이터 시각화나 탐색을 목적으로 한다면 t-SNE 같은 기법이 유리할 수 있으나, 예측 성능을 최적화하려면 PCA가 더 나을 수 있습니다.

  • 데이터의 크기: 차원 축소 기법 중 일부는 계산 비용이 매우 높습니다. 대규모 데이터셋에서 t-SNE 같은 기법을 직접 적용하기 전에 데이터를 사전에 축소하거나 PCA를 먼저 적용하는 등의 전략이 필요할 수 있습니다.

과적합 방지 및 모델 성능 향상을 위한 전략

  • 정확한 검증 방법: 데이터를 훈련 세트와 테스트 세트로 나누어 교차 검증 같은 기법을 적용함으로써 차원 축소 모델의 성능을 객관적으로 평가해야 합니다. 이는 과적합을 방지하는 데 중요한 역할을 합니다.

  • 적절한 차원의 선택: 차원 축소를 너무 많이 하면 중요한 정보가 손실될 위험이 있고, 너무 적게 하면 축소의 효과가 미미할 수 있습니다. 적절한 차원의 수를 선택하는 것이 중요하며, 이를 위해 누적 기여율 같은 지표를 사용할 수 있습니다.

차원 축소 기법을 사용하며 자주 발생할 수 있는 문제점과 해결 방안

  • 정보의 손실: 차원을 축소하는 과정에서 중요한 정보가 손실될 수 있습니다. 이를 최소화하기 위해, 데이터의 본질적인 특성을 잘 반영할 수 있는 기법을 섬세하게 선택해야 합니다. 또한, 설명 가능한 차원 축소 방법을 사용하여 어떤 특성이 중요한지 이해할 수 있도록 해야 합니다.

  • 해석의 어려움: 특히 t-SNE와 같은 기법들은 결과의 해석을 어렵게 만들 수 있습니다. 결과를 해석하고, 데이터 내 숨겨진 구조를 이해하기 위해서는 주의 깊은 분석과 전문 지식이 필요합니다.

  • 고차원 데이터의 계산 비용: 일부 차원 축소 기법은 고차원 데이터에 대한 계산 비용이 매우 높습니다. 이를 해결하기 위해, 대규모 데이터셋에 적합한 차원 축소 기법을 선택하거나, 계산 효율이 높은 알고리즘을 사용해야 합니다.

차원 축소는 데이터 과학의 핵심 단계 중 하나로, 데이터의 복잡성을 줄이고 모델의 성능을 향상시키는 데 큰 역할을 할 수 있습니다. 그러나 적합한 기법을 신중하게 선택하고, 그 결정의 결과를 면밀히 평가하는 것이 중요합니다.

Previous
이상치 탐지