t-SNEによる次元削減
t-SNEとは?
t-SNE(t-distributed Stochastic Neighbor Embedding)は、高次元データの視覚化に特に有効な機械学習の手法の一つです。特に、多次元のデータを2次元や3次元に簡潔に表現して、データの構造を可視化するために用いられます。
同じような手法としてはPCAというものがあります。
この記事では、t-SNEを用いたデータの視覚化を行ってみます。
環境はGoogle Corabです。
データセット
データセットは下記を利用します。
このデータセットは、キノコが食用か有毒かを識別するための特徴が含まれているデータセットです。約8124個のキノコのサンプルがあり、それぞれのキノコが食用(edible)または有毒(poisonous)のいずれかとしてラベル付けされています。
キノコの各サンプルには以下のような特徴が含まれます:
キャップ(cap): 形状(bell, conical, convexなど)、表面(smooth, scalyなど)、色(brown, pink, whiteなど)
ひだ(gills): 配置(close, crowdedなど)、色(black, brownなど)
柄(stalk): 形状、根元の形状(bulbous, rootedなど)、表面の質感(silky, smoothなど)
匂い: almond, anise, creosoteなど
生息環境: grasses, leaves, urbanなど
その他: ひだの下に輪やベールの有無など
データセットの読み込み
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()