【Python×データ分析】今更ながらt-SNEについて調べてみた。PCAとの比較も。

こんにちは。久々にKaggleを再開したら、まだ知らなかった技術に沢山遭遇しましたので、一つずつ勉強する毎日です。。

今日は、t-SNEについて調べてみました。過去のKaggle優勝テクニックを調べているときに、このt-SNEをアンサンブルに組み込んでうまくいった例を見つけたので興味を持ちました。

それでは参ります。

t-SNEとは?

T-distributed Stochastic Neighbor Embeddingの略。t分布型確率的近傍埋め込み法と呼ばれる、高次元のデータ可視化のための手法の1つ。

論文によると、従来の可視化よりも良い可視化を実現できる手法、とのこと。確かに、論文のサンプルを見ると、他の手法ではうまく分離できていない特徴も、分かりやすくなっているように見えますね。

論文より

どうやってこんな可視化を実現できたのか。その理論についてはこちらのQiitaの記事にまとめられていました。

https://qiita.com/sakami/items/bb466161489771f7d2e9

https://qiita.com/g-k/items/120f1cf85ff2ceae4aba

t-SNE登場の背景

論文の原文はこちら。2008年に発表されています。AbstractとIntroductionの内容を箇条書きでメモ。(解釈間違っていたらごめんなさい)

https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf

  • 2002年に発表されたStochastic Neighbor Embeddingの派生。
  • 複数のデータセットに対して、既存の他の手法であるSammon mapping, Isomap, and Locally Linear Embeddingなどとも比較して、良い可視化のパフォーマンスを発揮した。
  • 高次元データの可視化は長年課題であった。
  • これまでにも種々の方法が開発されていたが、数千の次元を持つような近年の現実世界のデータには十分なパフォーマンスを発揮できていなかった。
  • データ可視化とは異なる、次元削減を目的とした手法もある。
  • 次元削減は、高次元の情報を可能な限り保存しながら低次元で表現することを目指している。
  • このための方法には主成分分析(PCA, 1933)、MDS(1952)があるが、これらは非類似のデータを最も遠くに配置するために、線形手法を使っていた。
  • さらに効果的な次元削減のために非線形手法が必要となり研究が進められた。以下の7つが有名。(1) Sammon mapping (1969),(2) curvilinear components analysis (CCA,1997), (3) Stochastic Neighbor Embedding (SNE, 2002), (4) Isomap (2000), (5) Maximum Variance Unfolding (MVU, 2004), (6) Locally Linear Embedding (LLE, 2000), (7) Laplacian Eigenmaps (2002).
  • しかしながら、現実世界のデータのような高次元の場合、これらでも十分な可視化を実現できなかった。これはこれらの手法が局所・大局の両方を同時に表現できないため。
  • ここでt-SNEが登場。

t-SNEの実装 & PCAとの比較

t-SNEはscikit-learnに含まれていて、すぐに実装することができます。今回は、超簡単にですが、MNISTのデータセットを使って試してみました。

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.manifold import TSNE
from sklearn.decomposition import PCA
%matplotlib inline

from sklearn.datasets import load_digits

## load data
mnist = load_digits()
X = mnist.data
y = mnist.target

## t-SNE
tsne = TSNE(n_components=2, random_state=1)
tsne_reduced = tsne.fit_transform(X)

## PCA
pca = PCA(n_components=2, random_state=1)
pca_reduced = pca.fit_transform(X)

## Visualization
plt.figure(figsize = (30,12))
plt.subplot(121)
plt.scatter(pca_reduced[:,0],pca_reduced[:,1], c = y, 
            edgecolor = "None", alpha=0.5)
plt.colorbar()
plt.title('PCA Scatter Plot')

plt.subplot(122)
plt.scatter(tsne_reduced[:,0],tsne_reduced[:,1],  c = y, 
            cmap = "coolwarm", edgecolor = "None", alpha=0.35)
plt.colorbar()
plt.title('TSNE Scatter Plot')
plt.show()

結果は以下の通り!特に何ら特別なことはしていないですが、既にPCAよりもより分別よく可視化されていることが分かります。スゴイ・・。

さて、確かにこの手法を使うと良い可視化が実現できることが分かったので、今後はこれをどう活用していくか、考えていきたいと思いますが、今日は一旦ここまで。

参考になりましたら幸いです。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。