Python/Visualization

[t-SNE] manifold 데이터 시각화하기

언킴 2022. 3. 19. 19:20
반응형

t-SNE는 차원축소 기법 중 하나다. 차원 축소 기법 중 대표적인 기법은 PCA가 있을텐데, PCA는 데이터의 형태가 선형이라는 가정하에 분석을 수행하게 된다. 그렇기 때문에 manifold 형태를 가지는 데이터에서는 성능을 발휘하기가 어렵다. 이때 사용하는 것이 바로 t-SNE이다. 

 

sklearn에서는 t-SNE와 PCA를 지원해주기에 본 글에서는 sklearn 패키지를 활용해서 시각화한다. 

from sklearn.manifold import TSNE 
from sklearn.feature_extraction.text import TfidfVectorizer

newsgroups_train = fetch_20newsgroups(subset='train',
                                      remove=('headers', 'footers', 'quotes'),
                                      categories=categories)

newsgroups_test = fetch_20newsgroups(subset='test',
                                      remove=('headers', 'footers', 'quotes'),
                                      categories=categories)
                                      
X_train = newsgroups_train.data 
y_train = newsgroups_train.target 

X_test = newsgroups_test.data 
y_test = newsgroups_test.target 

--------------------------------------------------------------------------------

tsne = TSNE(n_components=3, random_state=7)
tsne_tfidf = tsne.fit_transform(x_train_tfidf)

def tsne_graph(tsne_2, label):
    colors = {0:'blue', 1:'red', 2:'green', 3:'purple'}
    x = tsne_2[:,0]
    y = tsne_2[:,1]
    z = tsne_2[:,2]
    
    fig = plt.figure(figsize=(15, 10))
    ax = fig.add_subplot(111, projection = '3d')

    ax.set_xlim(min(x), max(x))
    ax.set_ylim(min(y), max(y))
    ax.set_zlim(min(z), max(z))
    
    for i in range(len(x)):
        if (min(x) < x[i] < max(x)) and (min(y) < y[i] < max(y)) and (min(z) < z[i] < max(z)):
            ax.text(x[i], y[i], z[i], label[i], color = colors[label[i]])
    plt.show()

tsne_graph(tsne_tfidf, y_train)

위 코드는 일부 생략된 코드이며, 자세한 코드를 확인하고 싶으면 여기를 참고하길 바란다. 본 글에서는 t-SNE와 PCA를 비교하는 내용을 다루기 때문에 단어를 전처리하는 방법이나 인코딩하는 방법에 대해서는 다루지 않는다. 데이터를 3차원으로 시각화하기 위해 3차원으로 차원을 축소하여 시각화해주었다. 

 

좌측 : t-SNE, 우측 : PCA

t-SNE의 경우 다차원 데이터의 특성을 제대로 파악하여 오밀조밀하게 시각화해주는 것을 확인할 수 있지만, PCA의 경우 이곳저곳 난잡하게 데이터들이 퍼져있는 것을 확인할 수 있다. 

 

자세한 코드는 여기를 참고하길 바란다.