오늘은 T-SNE 분석에 대해 알아보고 개인 과제가 있어서 해당 분석에 대해서 더 알아보고 정의부터 적용하는 방법에 대해서 공부했다.
이전에 했던 PCA(주성분분석)와는 다르게 T-SNE는 시각화 분석에 더 특화된 것이였다.
PCA는 기존 데이터들의 차원을 축소시켜서 2차원의 산점도 그래프에 표현하는 것이었다면 T-SNE는 똑같이 차원 축소의 개념은 같지만 PCA보다 더 군집이 잘 되어 있어 있는 듯 했다.
과제는 chat-gpt의 힘을 좀 빌리긴 했지만, T-SNE가 적용되는 원리를 파악하려 노력했고, TSNE 모델에 축소할 차원의 값을 지정하고 3차원 시각화까지 적용이 되는걸 확인했다.
import numpy as np
import pandas as pd
import plotly.graph_objs as go
from sklearn.manifold import TSNE
from sklearn import datasets
# 데이터 로드, 데이터프레임 생성
data_digits = datasets.load_digits()
df_digits = pd.DataFrame(data = data_digits["data"], columns = data_digits["feature_names"])
# 데이터 TSNE 모델 생성 및 학습
tsne = TSNE(n_components=3)
tsne_res = tsne.fit_transform(df_digits)
label_digits = data_digits["target"]
# 표면 Mesh3d 객체 생성
scatter = go.Scatter3d(x=tsne_res[:,0], y=tsne_res[:,1], z=tsne_res[:,2],
mode='markers',
marker=dict(
size=3,
color=label_digits,
colorscale='Viridis',
opacity=0.8)
)
# 레이아웃
layout = go.Layout(
scene=dict(
xaxis=dict(title='col1 Label'),
yaxis=dict(title='col2 Label'),
zaxis=dict(title='col3 Label')
)
)
# 그래프 생성
fig = go.Figure(data=[scatter], layout=layout)
# 그래프 출력
fig.show()
해당 데이터는 사이킷런에 digits 데이터를 활용한 것이다.
데이터와 차원 이름을 가져와 데이터 프레임을 만들었고
TSNE 모델을 생성하고 학습시켜서 3개의 차원으로 축소된 데이터를 plotly로 x, y, z값을 넣어 go.scatter3d 함수와 레이아웃을 만들어 3차원 시각화를 표현했다.
사실 이 과정에서 범례를 만들고 싶었으나, 실패했고 이 과정은 더 알아보고 추가해볼 생각이다.
구현하는건 어찌해보겠는데 해당 작업에서의 의미를 도출하는데에 좀 어려움이 있는 것 같긴하다..(튜터님도 해석하는데에 어려움이 있다고 했다.)
PCA나 TSNE나 데이터 기저의 정제를 하는 과정이라고 느껴지고, 이것을 다시 클러스터링 군집에 활용하거나 해야할 것 같긴하다.
모델학습이 들어가는 순간 이전의 데이터 피쳐들의 해석이 어려워진다고 했는데, 실습과정을 통해서 이전 데이터가 학습으로 다 사라지니 어떤 해석점이 생기는지는 TSNE 분석시각화 다음에 특징을 찾아가며 다시 봐야한다고 생각이 들었다.