t-SNE


t-SNEとは?

t-SNE(t-distributed Stochastic Neighbor Embedding)は、高次元データの視覚化に特に有効な機械学習の手法の一つです。特に、多次元のデータを2次元や3次元に簡潔に表現して、データの構造を可視化するために用いられます。

同じような手法としてはPCAというものがあります。

この記事では、t-SNEを用いたデータの視覚化を行ってみます。
環境はGoogle Corabです。

データセット

データセットは下記を利用します。

このデータセットは、キノコが食用か有毒かを識別するための特徴が含まれているデータセットです。約8124個のキノコのサンプルがあり、それぞれのキノコが食用(edible)または有毒(poisonous)のいずれかとしてラベル付けされています。

キノコの各サンプルには以下のような特徴が含まれます:

  1. キャップ(cap): 形状(bell, conical, convexなど)、表面(smooth, scalyなど)、色(brown, pink, whiteなど)

  2. ひだ(gills): 配置(close, crowdedなど)、色(black, brownなど)

  3. 柄(stalk): 形状、根元の形状(bulbous, rootedなど)、表面の質感(silky, smoothなど)

  4. 匂い: almond, anise, creosoteなど

  5. 生息環境: grasses, leaves, urbanなど

  6. その他: ひだの下に輪やベールの有無など

データセットの読み込み

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df= pd.read_csv('./mushrooms.csv')
df.head(5)

データの前処理

X = df.drop('class', axis=1)

y = df['class']
y = y.map({'p': '有毒', 'e': '食用'})

目的変数の設定をしています。また分かりやすいように有毒と食用でラベルを変更しました。

cat_cols = X.select_dtypes(include='object').columns.tolist()
for col in cat_cols:
    X[col] = X[col].astype('category')
    X[col] = X[col].cat.codes

カテゴリカルデータに対する前処理を行っています。

t-SNEアルゴリズムの適用

それではt-SNEアルゴリズムを適用していきます。
t-SNEアルゴリズムはscikit-learnに実装されているため、そちらを利用します。

from sklearn.preprocessing import StandardScaler
from sklearn.manifold import TSNE

X_std = StandardScaler().fit_transform(X)
X_embedded= TSNE(n_components=2).fit_transform(X_std)
X_embedded_data = np.vstack((X_embedded.T, y)).T

df_tsne = pd.DataFrame(X_embedded_data, columns=['Dim1', 'Dim2', 'class'])
df_tsne.head()

t-SNEの可視化

import plotly.express as px

fig = px.scatter(df_tsne, x='Dim1', y='Dim2', color='class',
                 title='t-SNE Results',
                 labels={'Dim1': 'Dimension 1', 'Dim2': 'Dimension 2'}, 
                 width=800, height=800)
fig.show()