본문 바로가기
파이썬 라이브러리를 활용한 머신러닝

t-distributed Stochastic Neighbor Embedding

by 지식광부키우기 2019. 11. 19.

 

차원의 저주 (The Curse of Dimensionality)

 

고차원의 데이터셋은 매우 희박한 상태일 수 있습니다. 

 

즉, 대부분의 훈련 데이터가 서로 멀리 떨어져 있습니다. 

 

차원의 저주를 해결하는 해결책 하나는 훈련 샘플의 밀도가 충분히 높아질 때까지 훈련 세트의 크기를 키우는 것입니다. 

 

그림1

 

 

머신 러닝을 위한 차원 축소

 

많은 경우 머신러닝 문제는 훈련 샘플 각각이 수천 심지어 수백만 개의 특성을 가지고 있습니다. 

 

이는 훈련을 느리게 하고 좋은 솔루션을 찾기 어렵게 만듭니다.

 

더 많은 훈련 데이터가 요구됩니다.

 

 

실전 문제에서는 특성 수를 줄여서 불가능한 문제를 가능한 범위로 변경할 수 있는 경우가 많습니다. 

 

예를 들어 MNIST 이미지의 경우 이미지 경계에 있는 픽셀은 항상 흰색이므로 훈련 세트에서 이런 픽셀을 완전히 제거해도 많은 정보를 잃지 않습니다. 

 

인접한 두 픽셀은 종종 많이 연관되어 있습니다. 두 픽셀을 하나의 픽셀로 합치더라도 잃는 정보가 많지 않을 것입니다. 

 

 

시각화를 위한 차원 축소

 

차원 축소는 데이터 시각화에도 아주 유용합니다.

 

차원 수를 둘 또는 셋으로 줄이면 고차원 훈련 세트를 하나의 그래프로 그릴 수 있습니다.

 

군집 같은 시각적인 패턴을 감지해 중요한 통찰을 얻는 경우도 있습니다. 

 

그림2

 

 

차원 축소를 위한 접근 방법

 

차원을 감소시키는 두 가지 주요한 접근법이 있습니다.

 

 

투영 (Projection) 

 

가정 : 모든 훈련 샘플이 사실 고차원 공간 안의 저차원 부분 공간에 (또는 가까이) 놓여 있습니다.

 

훈련 샘플이 모든 차원에 걸쳐 균일하게 퍼져 있지 않습니다. 

 

많은 특성은 거의 변화가 없는 반면, 다른 특성들은 서로 강하게 연관되어 있습니다. 

 

 

매니폴드 학습 (Manifold Learning) 

 

가정 : 대부분 실제 고차원 데이터셋이 더 낮은 저차원 매니폴드에 가깝게 놓여 있습니다.

 

매니폴드 학습 알고리즘은 훈련 샘플이 놓여 있는 매니폴드를 모델링하는 식으로 작동합니다.

 

훨씬 복잡한 매핑을 만들어 더 나은 시각화를 제공합니다. 

 

 

스위스 롤 테이터셋 예시

 

부분 공간이 뒤틀리거나 휘어 있는 경우 투영 알고리즘이 언제나 최선의 방법은 아닙니다. 

 

스위스 롤은 2D 매니폴드의 한 예입니다. 국부적으로는 2D 평면으로 보이지만 3차원으로 말려 있습니다. 

 

그림3

 

 

매니폴드 학습

 

매니폴드 학습 알고리즘은 그 목적이 시각화라 3개 이상의 특성을 뽑는 경우는 거의 없습니다.

 

매니폴드 학습은 탐색적 데이터 분석에 유용하지만 지도 학습용으로는 거의 사용하지 않습니다. 

 

매니폴드 학습은 클래스 레이블 정보를 사용하지 않으므로 완전한 비지도 학습입니다. 

 

 

t-Distributed Stochastic Neighbor Embedding

 

t-Distributed Stochastic Neighbor Embedding (t-SNE)는 멀리 떨어진 포인트와 거리를 보존하는 것보다 가까이 있는 포인트에 더 많은 비중을 둡니다.

 

즉, 이웃 데이터 포인트에 대한 정보를 보존하려 노력합니다. 

 

t-SNE의 아이디어는 데이터 포인트 사이의 거리를 가장 잘 보존하는 2차원 표현을 찾는 것입니다. 

 

t-SNE는 각 데이터 포인트를 2차원에 무작위로 표현한 후 원 본 특성 공간에서 가까운 포인트는 가깝게, 멀리 떨어진 포인트는 멀어지게 만듭니다. 

 

t-SNE는 주로 시각화에 많이 사용됩니다. 특히 고차원 공간에 있는 샘플을 군집을 시각화할 때 사용됩니다. 새로운 데이터에 적용하지 못합니다. 

 

 

Digits 데이터셋

 

데이터셋은 1797 데이터 포인트를 가지고 있습니다. 

 

이 데이터셋의 각 포인트는 0에서 9사이의 손글자 숫자를 표현한 8 x 8 크기의 흑백 이미지입니다. 

 

그림3

 

 

Digits 데이터셋 - PCA

 

# build a PCA model
pca = PCA(n_components=2)
pca.fit(digits.data)
# transform the digits data onto the first two principal components
digits_pca = pca.transform(digits.data)
colors = ["#476A2A", "#7851B8", "#BD3430", "#4A2D4E", "#875525",
          "#A83683", "#4E655E", "#853541", "#3A3120", "#535D8E"]
plt.figure(figsize=(10, 10))
plt.xlim(digits_pca[:, 0].min(), digits_pca[:, 0].max())
plt.ylim(digits_pca[:, 1].min(), digits_pca[:, 1].max())
for i in range(len(digits.data)):
    # actually plot the digits as text instead of using scatter
    plt.text(digits_pca[i, 0], digits_pca[i, 1], str(digits.target[i]),
             color = colors[digits.target[i]],
             fontdict={'weight': 'bold', 'size': 9})
plt.xlabel("First principal component")
plt.ylabel("Second principal component")

그림4

 

PCA를 사용해 데이터를 2차원으로 축소해 시각화하겠습니다.

 

처음 두 개의 주성분을 이용해 그래프를 그리고 각 샘플을 해당하는 클래스의 숫자로 나타냈습니다.

 

숫자 0, 6, 4는 두 개의 주성분만으로 비교적 잘 분리된 것 같습니다만, 아직 중첩된 부분이 있고

 

다른 숫자들은 대부분 많은 부분이 겹쳐 있습니다. 

 

 

Digits 데이터셋 - TSNE

 

from sklearn.manifold import TSNE
tsne = TSNE(random_state=42)
# use fit_transform instead of fit, as TSNE has no transform method
digits_tsne = tsne.fit_transform(digits.data)
plt.figure(figsize=(10, 10))
plt.xlim(digits_tsne[:, 0].min(), digits_tsne[:, 0].max() + 1)
plt.ylim(digits_tsne[:, 1].min(), digits_tsne[:, 1].max() + 1)
for i in range(len(digits.data)):
    # actually plot the digits as text instead of using scatter
    plt.text(digits_tsne[i, 0], digits_tsne[i, 1], str(digits.target[i]),
             color = colors[digits.target[i]],
             fontdict={'weight': 'bold', 'size': 9})
plt.xlabel("t-SNE feature 0")
plt.ylabel("t-SNE feature 1")

그림5

 

위의 그림은 t-SNE로 찾은 두 개의 성분을 사용한 숫자 데이터셋의 산점도입니다.

 

모든 클래스가 확실히 잘 구분되었습니다. 

 

 

다른 차원 축소 기법

 

사이킷런은 다양한 차원 축소 기법을 제공합니다. 다음은 그중에서 가장 널리 사용되는 것들입니다.

 

다차원 스케일링 (Multidimensional Scaling, MDS) : 샘플 간의 거리를 보존하면서 차원을 축소합니다. 

 

Isomap : 각 샘플을 가장 가까운 이웃과 연결하는 식으로 그래프를 만듭니다. 그런 다음 샘플 간의 지오데식 거리를 유지하면서 차원을 축소합니다. 

 

지역 선형 임베딩 (Locally Linear Embedding, LLE) : 각 훈련 샘플이 가장 가까운 이웃에 얼마나 선형적으로 연관되어 있는지 측정합니다. 

 

그림6

 

공짜 점심은 없다를 생각하길 바랍니다.

 

 

파이썬 라이브러리를 활용한 머신러닝 책과 성균관대학교 강석호 교수님 수업 내용을 바탕으로 요약 작성되었습니다.

댓글