(python) spotlight로 시각화 feature vector
회사에서 CNN task를 하면서, 각 image data의 feature vector를 추출하는 업무들이 있다.
data를 분석하면서, 회의 등에서 시각화하고 싶은 상황들이 생겼는데,
CNN에서 feature를 추출하는 layer를 통해 vector를 추출할 수 있다.
복잡한 model을 구현하면 feature vector의 차원이 높기 때문에, 2D 또는 3D에서 feature vector를 visualization 하기 힘들어진다.
따라서 차원 축소 알고리즘을 통해, 차원 축소를 진행해야 한다.
차원 축소 알고리즘은 고차원 데이터를 저차원 공간으로 변환하여 데이터의 핵심 정보를 유지하면서 처리와 분석을 용이하게 만드는 기법입니다. 이를 통해 데이터의 복잡성을 줄이고, 시각화 가능성을 높이며, 계산 효율성을 향상시킬 수 있습니다. 주요 차원 축소 알고리즘은 다음과 같습니다.
차원 축소의 종류는 여러가지가 있지만, 대표적으로 PCA, t-SNE, UMAP이 있다.
PCA는 데이터의 분산을 최대한 보존하면서 차원을 축소하므로, 데이터 구조의 전반적인 이해에 도움이 됩니다. 반면에 t-SNE나 UMAP은 데이터의 국소적인 구조를 유지하므로, 군집 분석이나 시각화에 더 적합합니다.
그 중에서 t-sne를 직접 구현했다.
T-SNE 구현
T-SNE는 scikit-learn을 활용하여 사용할 수 있다.
from sklearn.manifold import TSNEimport matplotlib.pyplot as plt
# 데이터 로드 예시 (여기서는 iris 데이터셋 사용)
from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target
# t-SNE 적용
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_embedded = tsne.fit_transform(X)
# 결과 시각화
plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=y)
plt.title("t-SNE 결과")
plt.show()T-SNE를 직접 구현하면서 feature vector를 확인하면서 아쉬운 점이 있었는데, image랑 함께 feature vector를 확인하기 어려웠다는 것이었다.
따라서 조금 더 시각화하기 쉬운 방법에 대해서 고민하던 중에, spotlight라는 라이브러리를 알게 되었다.
Spotlight
Renumics Spotlight는 데이터 프레임에서 비정형 데이터를 상호작용적으로 탐색할 수 있는 도구이다. 이미지, 오디오, 텍스트, 비디오, 시계열 및 기하학적 데이터와 같은 대부분의 비정형 데이터 유형을 지원하고 있다. Spotlight를 사용하면 데이터 시각화를 빠르게 생성하고 데이터 강화(예: 임베딩, 예측, 불확실성)를 활용하여 데이터의 중요한 클러스터를 식별할 수 있다.
https://github.com/Renumics/spotlight
의 README.md를 참고하면서, 실제로 사용할 수 있다.
uv pip install renumics-spotlight위와 같이 설치를 한 후에,
Load a Hugging Face audio dataset with embeddings and a pre-defined layout
import datasets
from renumics import spotlight
ds = datasets.load_dataset('renumics/emodb-enriched', split='all')
layout= spotlight.layouts.debug_classification(label='gender', prediction='m1_gender_prediction', embedding='m1_embedding', features=['age', 'emotion'])
spotlight.show(ds, layout=layout)기본 예제로 다음과 같이 사용할 수 있다.
실제로 사용하는 model의 custom dataset을 사용하고 싶을 때는 아래와 같이 pandas를 사용하여 csv file에 image 경로 및 라벨 정보를 embedding과 매칭 되게 저장해둔 형태로 df를 정의하고 호출한 다음에 사용하면 된다.
from renumics import spotlight
spotlight.show(
df,
dtype={"image": spotlight.Image, "embedding": spotlight.Embedding},
no_browser=True, # When using remote server
host="0.0.0.0",
port=1234
)embedding 같은 경우에는 사용하는 model의 embedding model을 사용하면 되고, 또한 spotlight를 사용하면서 embedding을 돌리는데 시간이 오래 걸리기 때문에, embedding을 python pickle file로 저장해두면, 이후에 쉽게 호출 할 수 있다.
물론 차원 축소 과정에서 정확하게 feature vector 간의 거리를 반영해주는 것은 아니지만 실제로 spotlight를 사용하면서, 어느 정도 경향성을 이해하는데 도움이 되었다.
References
https://kwonkai.tistory.com/65
https://arize.com/blog-course/reduction-of-dimensionality-top-techniques/


