AIPython

python 次元削減の比較 umap,t-SNE,PCA,SVD

AI

Pythonで次元削減をの精度と処理速度を比較したのでまとめます。

次元削減とは高次元空間から低次元空間へのデータの変換です。

次元削減は、オリジナルの次元に近い、元のデータの特徴量を低次元においても保持することが理想です。高次元空間での作業は、多くの理由で望ましくない場合があります。例えば、可視化するときです。高次元では、グラフなどに可視化できないので、次元削減して可視化します。

この記事のゴール

  • 次元削減処理の種類を知ることができます
  • 次元削減処理毎の処理速度と性能を知ることができます
  • データセット毎に最適な次元削減処理を知ることができます

次元圧縮の種類

  • umap
  • t-SNE
  • PCA
  • SVD

umap

arXivに2018年2月9日に掲載された最新の次元削減手法です。
Uniform Manifold Approximation and Projection for Dimension Reduction

均一多様体近似および射影(UMAP)は、t-SNEと同様に視覚化に使用できる次元削減手法ですが、一般的な非線形次元削減にも使用できます。アルゴリズムは、データに関する3つの仮定に基づいています

  1. データはリーマン多様体に均一に分布
  2. リーマン計量は局所的に一定。
  3. マニホールドはローカルに接続

これらの仮定から、ファジートポロジー構造を持つ多様体をモデル化することが可能です。埋め込みは、可能な限り最も近い同等のファジートポロジ構造を持つデータの低次元投影を検索することによって検出されます。

t-SNE

t分布型確率的近傍埋め込み法(T-distributed Stochastic Neighbor Embedding, t-SNE)は、Laurens van der Maatenとジェフリー・ヒントンにより開発された可視化のための機械学習アルゴリズムである。[1]これは、高次元データの可視化のため2次元または3次元の低次元空間へ埋め込みに最適な非線形次元削減手法である。具体的には、高次元のデータ集合を2次元または3次元へ配置する際に、高い確率で類似した集合が近傍に、異なる集合が遠方となるように対応付ける。

参照元:wikipedia

t-SNEは以下の記事で解説しているので、参考にしてみてください。

PCA

ばらつきが大きい方向とそれと直交する方向の2変数で表現する次元削減方法です。

主成分分析(しゅせいぶんぶんせき、英: principal component analysis; PCA)は、相関のある多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法。データの次元を削減するために用いられる。

参照元:wikipedia

SVD

特異値分解(とくいちぶんかい、英: singular value decomposition; SVD)とは線形代数学における複素数あるいは実数を成分とする行列に対する行列分解の一手法であり、Autonneによって導入された。悪条件方程式の数値解法で重宝するほか、信号処理や統計学の分野で用いられる。特異値分解は、行列に対するスペクトル定理の一般化とも考えられ、正方行列に限らず任意の形の行列を分解できる

参照元;WIkipedia

使用するデータセット

sklearn.datasetsの代表的な分類データを使用して、各分析手法の精度とその分析速度を計測します。代表的な分類データは、以下の四種類です。

  • digits
  • iris
  • wine
  • breast_cancer

計測結果

  • 判定精度は、データセットによって最適な手法が変わる。
  • 処理速度は、umapが早い傾向を示している。
マーク判定基準
非常によく分類できている
分類できている
そこそこ分類できている
×分類できていない

digits

umapが圧勝です。

分析手法分析精度処理速度[秒]
umap6.8
t-SNE14.2
PCA×21.6
SVD×21.9

umap

t-SNE

PCA

SVD

iris

PCAとSVDが良い結果となった。

分析手法分析精度処理速度[秒]
umap2.7
t-SNE1.2
PCA4.4
SVD4.7

umap

t-SNE

PCA

SVD

wine

うーん。笑

分析手法分析精度処理速度[秒]
umap2.5
t-SNE1.1
PCA4.3
SVD4.5

umap

t-SNE

PCA

SVD

breast_cancer

umapでいいかな。

分析手法分析精度処理速度[秒]
umap2.8
t-SNE3.6
PCA6.9
SVD7.3

umap

t-SNE

PCA

SVD

コード

import umap
from sklearn.decomposition import PCA  
from sklearn.decomposition import TruncatedSVD
from scipy.sparse.csgraph import connected_components
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from sklearn.manifold import TSNE
import time

def dimensionality_reduction_test(data,target,name):
    
    # UMAP
    start_time = time.time()
    embedding = umap.UMAP().fit_transform(data)
    interval = time.time() - start_time
    plt.scatter(embedding[:,0],embedding[:,1],c=target,cmap=cm.tab10)
    plt.colorbar()
    plt.savefig(name+'_umap.png')

    # t-SNE
    plt.clf()
    start_time2 = time.time()
    tsne_model = TSNE(n_components=2)
    tsne = tsne_model.fit_transform(data)
    interval2 = time.time() - start_time2
    plt.scatter(tsne[:,0],tsne[:,1],c=target,cmap=cm.tab10)
    plt.colorbar()
    plt.savefig(name+'_tsne.png')
    
     # PCA
    plt.clf()
    start_time3 = time.time()
    pca = PCA(n_components=2)  
    pca  = pca.fit_transform(data) 
    interval3 = time.time() - start_time
    plt.scatter(pca[:,0],pca[:,1],c=target,cmap=cm.tab10)
    plt.colorbar()
    plt.savefig(name+'_pca.png')
    
    #SVD
    plt.clf()
    start_time4 = time.time()
    svd = TruncatedSVD(n_components=2)
    svd = svd.fit_transform(data)
    interval4 = time.time() - start_time
    plt.scatter(svd [:,0],svd [:,1],c=target,cmap=cm.tab10)
    plt.colorbar()
    plt.savefig(name+'_svd.png')

    print('umap : {}s'.format(interval))
    print('tsne : {}s'.format(interval2))
    print('pca : {}s'.format(interval3))
    print('svd : {}s'.format(interval4))

#digits
from sklearn.datasets import load_digits
digits = load_digits()
dimensionality_reduction_test(digits.data,digits.target,"digits")

#iris
from sklearn.datasets import load_iris
ayame = load_iris()
dimensionality_reduction_test(ayame.data,ayame.target,"ayame")

#wine
from sklearn.datasets import load_wine
wine = load_wine()
dimensionality_reduction_test(wine.data,wine.target,"wine")

#cancer
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
dimensionality_reduction_test(cancer.data,cancer.target,"cancer")

まとめ

一概に最新だからといいumapが良いわけではなさそう。ただ聞いた話によると、umapはハイパーパラメータの調整が大切らしい。
とにかく、いろんな手法を試して、一番良いものを選ぶと良さそう。

処理速度は、比較的umapが早いので、umapでとりあえず試すで問題なさそうですね。

Pythonの習得方法に関しては、こちらの記事を参考にしてみてください。

今回の記事は、以上です。
お読みいただきありがとうございました。

コメント

  1. […] python 次元削減の比較 umap,t-SNE,PCA,SVDPythonで次元削減をの精度と処理速度を比較したので、まとめます。 次元削減とは高次元空間から低次元空間へのデータの変換です。低次元化は、オ […]

  2. […] python 次元削減の比較 umap,t-SNE,PCA,SVDPythonで次元削減をの精度と処理速度を比較したので、まとめます。 次元削減とは高次元空間から低次元空間へのデータの変換です。低次元化は、オ […]

タイトルとURLをコピーしました