반응형
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의 경우 이곳저곳 난잡하게 데이터들이 퍼져있는 것을 확인할 수 있다.
자세한 코드는 여기를 참고하길 바란다.
'Python > Visualization' 카테고리의 다른 글
[Python] matplotlib 시작하기 (0) | 2022.02.25 |
---|---|
[Python] Monte Carlo algorithm (0) | 2022.01.14 |
[Python] matplotlib으로 스타벅스 데이터 시각화 하기 (0) | 2021.09.22 |