[機械学習のはじめ方] Part29: t-SNE・UMAPの違いと使い分け

はじめに:なぜ次元削減が必要なの?

機械学習で扱うデータは、たくさんの特徴量(=次元)を持つことがあります。例えば、顧客データなら年齢、性別、購入履歴、Webサイトの閲覧履歴など、数十、数百の特徴量があることも珍しくありません。このような高次元データは、そのままでは人間が直感的に理解したり、データの中に隠れたパターンを見つけたりするのが難しいです。

そこで登場するのが次元削減というテクニックです!これは、データの持つ重要な情報をなるべく失わずに、次元数を減らす(例えば2次元や3次元に圧縮する)手法です。次元削減によって、データをグラフにプロットして可視化したり、計算コストを削減したりできるようになります。

このステップでは、特に非線形な次元削減手法として有名な t-SNE と、その改良版とも言える比較的新しい手法 UMAP について、それぞれの特徴、違い、そしてどのように使い分けるべきかを学んでいきましょう!

t-SNE (t-distributed Stochastic Neighbor Embedding) とは?

t-SNE(ティースニーと読みます)は、2008年に提案された次元削減アルゴリズムで、特に高次元データの可視化によく使われます。基本的な考え方は、「元の高次元空間で近かったデータ点は、次元削減後の低次元空間でも近くに配置されるべき」というものです。

具体的には、データ点間の「類似度」を確率分布として表現し、高次元空間での確率分布と低次元空間での確率分布が可能な限り似るように、低次元空間でのデータ点の位置を最適化します。この際、低次元空間での類似度の表現にはスチューデントのt分布を使っているのが名前の由来です。

  • 局所的な構造の保持に優れる: 近くにあるデータ点の塊(クラスター)を、低次元空間でもうまく分離して表現するのが得意です。
  • 大域的な構造は必ずしも保持されない: クラスター間の距離や、全体のデータの広がり具合は、元のデータと異なる場合があります。t-SNEの結果におけるクラスター間の距離にはあまり意味がないことが多いです。
  • 計算コストが高い: データ数が増えると計算時間が非常に長くなる傾向があります。大規模なデータセットへの適用は難しい場合があります。
  • パラメータに敏感: いくつかのパラメータ(特に `perplexity`)の設定によって結果が大きく変わることがあります。
  • `perplexity`: 各データ点が考慮する近傍点の数を調整します。通常は5〜50の間の値が使われます。局所的な構造と大域的な構造のバランスに影響します。
  • `n_iter`: 最適化の繰り返し回数です。少なくとも250、通常は1000以上が推奨されます。
  • `learning_rate`: 学習率です。最適化のステップ幅を調整します。

データに含まれるクラスター構造を2次元や3次元で綺麗に可視化したい場合に特に有効です。ただし、計算コストやパラメータ設定の難しさから、探索的なデータ分析の初期段階や、比較的小規模なデータセットでの利用に向いています。

ポイント: t-SNEは可視化に特化した手法であり、次元削減後の結果をそのまま他の機械学習モデルの入力として使うことは一般的ではありません。また、実行するたびに結果が微妙に変わる(再現性の問題)ことがある点にも注意が必要です。

UMAP (Uniform Manifold Approximation and Projection) とは?

UMAP(ユーマップと読みます)は、2018年に提案された比較的新しい次元削減アルゴリズムです。t-SNEと同様に非線形次元削減手法ですが、数学的な理論(多様体学習とトポロジー)に基づいており、いくつかの点でt-SNEよりも優れているとされています。

UMAPも「高次元空間でのデータの構造(特に近傍関係)を、低次元空間でも保持する」ことを目指しますが、t-SNEよりも大域的な構造(データ全体の広がりやクラスター間の関係)の保持計算速度の点で改善が見られます。

  • 計算速度が速い: t-SNEと比較して大幅に高速であり、大規模なデータセットにも適用可能です。
  • 大域的な構造の保持: 局所的な構造だけでなく、データ全体の大まかな構造もt-SNEよりもうまく捉える傾向があります。ただし、UMAPでもクラスター間の距離が元のデータの距離を正確に反映するとは限りません。
  • 柔軟な利用: 可視化だけでなく、次元削減後の特徴量を他の機械学習モデル(クラスタリングなど)の入力として使うこともt-SNEより適しています。
  • パラメータ設定: t-SNEと同様にパラメータがありますが、デフォルト設定でもある程度良好な結果が得られることが多いです。
  • `n_neighbors`: 各データ点が考慮する近傍点の数です。局所的な構造と大域的な構造のバランスを調整します。小さい値(例: 5)は局所構造を、大きい値(例: 50)は大域構造を重視します。t-SNEの`perplexity`に似ていますが、より直感的に理解しやすいかもしれません。
  • `min_dist`: 低次元空間でのデータ点の密集度を制御します。小さい値(例: 0.0)は点をより密集させ、大きい値(例: 0.5)は点をより分散させます。可視化の見た目に大きく影響します。
  • `n_components`: 削減後の次元数です(通常は2か3)。
  • `metric`: データ点間の距離計算方法を指定します(’euclidean’, ‘manhattan’ など)。

高次元データの可視化はもちろん、クラスタリングの前処理特徴量エンジニアリングの一環としても有効です。特に、大規模なデータセットを扱う場合や、計算速度が重要な場合には、t-SNEよりもUMAPが有力な選択肢となります。

ポイント: UMAPは比較的新しい手法ですが、多くの機械学習ライブラリで利用可能になっており、t-SNEに代わるスタンダードな非線形次元削減手法として注目されています。

t-SNE と UMAP の比較まとめ

ここで、t-SNEとUMAPの主な違いを表にまとめてみましょう。

特徴 t-SNE UMAP
提案年 2008年 2018年
理論的背景 確率的近傍埋め込み + t分布 多様体学習 + トポロジー
計算速度 遅い (特に大規模データ) 速い
局所構造の保持 得意 得意
大域構造の保持 不得意な場合がある t-SNEより得意な傾向
主な目的 可視化 可視化、次元削減、特徴量生成
パラメータ感受性 高い (特に perplexity) 比較的低い (デフォルトでも良好な場合が多い)
次元削減後の利用 主に可視化のみ 他のモデル入力にも利用しやすい
再現性 実行ごとに結果が変わりうる パラメータを固定すれば再現可能 (実装による)

どちらをいつ使う? 使い分けのヒント

t-SNEとUMAP、どちらも強力なツールですが、状況に応じて使い分けるのが賢明です。

  • とにかく局所的なクラスタ構造を鮮明に可視化したい。
  • データセットが比較的小規模で、計算時間に余裕がある。
  • パラメータチューニングを試行錯誤する時間がある。
  • 大規模なデータセットを扱いたい。
  • 計算速度が重要。
  • 局所構造だけでなく、大域的な構造も考慮したい。
  • 次元削減後の結果を、クラスタリングなど他の分析にも使いたい
  • 手早く結果を得たい(デフォルトパラメータでもある程度うまくいくことが多い)。
注意点: どちらの手法も、得られた2次元(または3次元)のプロットにおけるクラスター間の距離やクラスターのサイズが、必ずしも元のデータの構造を正確に反映しているとは限りません。特にUMAPでは、min_dist パラメータがクラスターの見た目の密集度に大きく影響します。結果の解釈には注意が必要です。

どちらの手法が良いかはデータや目的に依存するため、両方を試してみて、結果を比較検討するのが最も確実なアプローチと言えるでしょう。

Pythonでの実装例

Pythonのライブラリを使えば、t-SNEもUMAPも簡単に実装できます。

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import numpy as np

# サンプルデータ生成 (例: 100個の50次元データ)
X = np.random.rand(100, 50)
# 対応するラベル (例: 3クラス)
y = np.random.randint(0, 3, 100)

# t-SNEモデルの初期化と実行
tsne = TSNE(n_components=2, perplexity=30, n_iter=1000, random_state=42)
X_tsne = tsne.fit_transform(X)

# 結果のプロット
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=y, cmap='viridis')
plt.title('t-SNE visualization')
plt.xlabel('t-SNE Component 1')
plt.ylabel('t-SNE Component 2')
plt.legend(handles=scatter.legend_elements()[0], labels=['Class 0', 'Class 1', 'Class 2'])
plt.show()

UMAPを使うには、まずライブラリのインストールが必要です:

pip install umap-learn

そして、以下のように実装します。

import umap
import matplotlib.pyplot as plt
import numpy as np

# サンプルデータ生成 (t-SNEと同じデータを使用)
X = np.random.rand(100, 50)
y = np.random.randint(0, 3, 100)

# UMAPモデルの初期化と実行
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42)
X_umap = reducer.fit_transform(X)

# 結果のプロット
plt.figure(figsize=(8, 6))
scatter = plt.scatter(X_umap[:, 0], X_umap[:, 1], c=y, cmap='viridis')
plt.title('UMAP visualization')
plt.xlabel('UMAP Component 1')
plt.ylabel('UMAP Component 2')
plt.legend(handles=scatter.legend_elements()[0], labels=['Class 0', 'Class 1', 'Class 2'])
plt.show()

これらのコードを実行することで、高次元データが2次元に削減され、散布図として可視化される様子を確認できます。ぜひ自分のデータで試してみてください!

まとめ

今回は、高次元データを低次元に圧縮して可視化するための強力な非線形次元削減手法である t-SNEUMAP について学びました。

  • t-SNE は局所構造の可視化に優れていますが、計算コストが高く、大域構造の保持は苦手です。
  • UMAP は t-SNE より高速で、大域構造も比較的よく保持し、可視化以外の用途にも使いやすいです。

どちらの手法も一長一短があり、データの特性や分析の目的に合わせて適切に選択し、パラメータを調整することが重要です。場合によっては両方を試して比較検討するのが良いでしょう。これらのテクニックを駆使して、複雑なデータの中に隠された洞察を見つけ出すスキルを身につけていきましょう!

これで Step 5「教師なし学習と次元削減」は完了です!次の Step 6 では、いよいよニューラルネットワークと深層学習の世界に足を踏み入れます。お楽しみに!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です