UMAPとは?次元削減の仕組みとt-SNEとの違い、Pythonでの使い方を分かりやすく解説!

目次
ウマたん当サイト【スタビジ】の本記事では、次元削減の手法「UMAP(ユーマップ)」について分かりやすく解説していきます!仕組みから、t-SNEとの違い、使うときのコツと注意点、Pythonでの使い方まで見ていきましょう!
こんにちは!ウマたんです!
たくさんの特徴を持つデータを、2次元の地図にして眺める。
データ分析では、そんな場面がよくあります。
たとえば、何百もの項目があるデータでも、2次元の散布図にできれば「どんなグループがありそうか」がひと目で分かりますよね。
この「たくさんの次元を、少ない次元に縮める」ことを次元削減と呼びます。
今回解説する「UMAP(ユーマップ)」は、その次元削減の手法のひとつです。
次元削減って、主成分分析とかt-SNEとかいろいろあるけど、UMAPは何が違うの?
UMAPの地図って、どうやって読めばいいのか知りたい!
本記事では、次の4つを順番に解説していきます。
以下のYouTube動画でも解説していますので、あわせてチェックしてみてください!
UMAPとは?
UMAPとは、たくさんの次元を持つデータを、2次元や3次元に縮めて、目に見える形にする次元削減の手法です。
正式な名前は「Uniform Manifold Approximation and Projection」。2018年に、リーランド・マッキネス(Leland McInnes)らが発表しました。

手書きの数字が「島」に分かれる
たとえば、手書きの数字の画像を考えてみましょう。
機械学習でよく使われる手書き数字のデータ「MNIST」では、1枚の画像が28×28=784個のピクセルでできています。
つまり、画像1枚が、784個もの数字の集まり。784次元のデータというわけです。
これでは、データがどう並んでいるのか、人の目ではまったく見えません。
ところが、UMAPで2次元に縮めると、「0」は0どうし、「1」は1どうし、似たものが集まった地図ができるんです!

元のデータには「これは0」「これは1」という答えを教えていないのに、似た画像どうしが自然と集まって、数字ごとの「島」に分かれる。
これがUMAPの面白いところです。
どんな分野で使われている?
いまでは、UMAPはいろいろな分野で使われています。
| 分野 | 使い方 |
|---|---|
| 生物学 | 細胞1つ1つの遺伝子のはたらき方のデータを2次元にして、細胞の種類ごとのまとまりを見る |
| 自然言語処理 | 文章をベクトルにしたもの(埋め込み)を2次元にして、似た内容の文章のまとまりを見る |
| 画像 | 画像の特徴を2次元にして、似た画像がどう集まっているかを見る |
| ビジネスのデータ | お客さんの購買データなどを2次元にして、どんなタイプのお客さんがいそうかを眺める |
特に、文章や画像をAIでベクトルにしたものは、数百〜数千次元になることもよくあります。
そんなデータの全体像をつかむのに、UMAPはとても便利なんです。
文章をベクトルにする方法については、以下の記事で解説しています。
OpenAIのEmbeddings APIを使って文章の類似度算出をPythonで実装!当サイト【スタビジ】の本記事では、OpenAIのEmbedding APIについての解説と実際にPythonでEmbeddingAPIを使ってテキストの類似度を測るデモを実装していきます。Embedding APIを使うことで非常に安価に高精度の自然言語処理プログラムが作れるのでぜひ理解しておきましょう!
ちなみに、次元が多すぎると分析がうまくいかなくなる問題は「次元の呪い」と呼ばれます。こちらもあわせて読んでみてください。
次元の呪いとは!?対策/対処法と共にわかりやすく解説!当サイト【スタビジ】の本記事では次元の呪いについて解説してきます。次元の呪いとは、高次元になればなるほど機械学習による回帰・分類が上手くいかない現象を指します。今回は次元の呪いとその解決方法について解説していきます。
UMAPの仕組み
それでは、UMAPがどうやって地図を作っているのかを見ていきましょう!
UMAPは、大きく2つのステップで動きます。
ステップ1:近所づきあいを調べる
1つ目は、元のデータで「近所づきあい」を調べることです。
それぞれのデータについて、近くにいるデータを探して、近いものどうしを線でつなぎます。
そうしてできるのが、網目のような「つながりの地図」です。

このように、近くにいる何個かのデータとつないだ網目は「k近傍グラフ」と呼ばれます。
ここでの「近い」は、元の高い次元の世界での近さです。
784次元の手書き数字なら、784個のピクセルの値が似ている画像ほど「近い」と考えます。
ステップ2:つながりを保って2次元に並べ直す
2つ目は、そのつながりを、なるべく保ったまま、2次元に並べ直すことです。
元の世界で仲が良かったデータは、2次元でも近くに。
そうでないデータは、離れた場所に。
少しずつ位置を調整して、元のつながりにいちばん近い並べ方を探すんです!

たとえるなら、クラスの席替えのようなイメージです。
教室は平らなので、全員の人間関係を完璧に再現することはできません。
それでも、仲良しグループがまとまって座れるような、いちばん良い座席表を探す。
UMAPがやっているのは、まさにそういうことなんです!
t-SNEとの違い
UMAPとよく比べられるのが、同じ次元削減の手法「t-SNE(ティースニー)」です。
t-SNEも、似たものどうしを近くに並べる、人気の手法です。2008年に発表され、UMAPが出てくる前から、データの可視化によく使われてきました。
UMAPとt-SNEの違いは、大きく3つあります。
| t-SNE | UMAP | |
|---|---|---|
| 速さ | 大きなデータでは時間がかかりやすい | 計算が速く、大きなデータでも扱いやすい |
| 全体の形 | 近所の関係を重視するぶん、グループどうしの位置関係が崩れやすい | 全体の配置も比較的よく残せる |
| 新しいデータ | 一度作った地図に、あとから当てはめにくい | 一度作った地図に、あとから来たデータを当てはめられる |
1つ目:速さ
1つ目は、速さです。
UMAPは計算が速く、大きなデータでも扱いやすいんです。
数万件、数十万件といったデータを地図にしたいときには、この差が大きく効いてきます。
2つ目:全体の形
2つ目は、全体の形です。
t-SNEは近所の関係を重視するぶん、グループどうしの位置関係が崩れやすいんです。
UMAPは、全体の配置も比較的よく残せます。

たとえば手書きの数字なら、t-SNEでも「0の島」「1の島」はきれいに分かれます。
でも、「どの島とどの島が近いか」という全体の並びは、UMAPのほうが元のデータの関係を残しやすい、というわけです。
3つ目:新しいデータ
3つ目は、新しいデータです。
UMAPは、一度作った地図に、あとから来たデータを当てはめることができます。

たとえば、先月のデータで地図を作っておけば、今月の新しいデータを、同じ地図のどこに来るかで見比べられます。
Pythonでよく使われるscikit-learnのt-SNE(TSNE)には、このように新しいデータを当てはめる機能がありません。
主成分分析(PCA)ともくらべてみよう
次元削減の定番といえば、主成分分析(PCA)もありますよね。
3つの手法をくらべると、こんな特徴があります。
| 主成分分析(PCA) | t-SNE | UMAP | |
|---|---|---|---|
| 縮め方 | 直線的(線形) | 曲がった関係も扱える(非線形) | 曲がった関係も扱える(非線形) |
| 得意なこと | データのばらつきが大きい方向をとらえる | 近所のまとまりをはっきり見せる | 近所のまとまりと全体の配置をバランスよく見せる |
| 速さ | とても速い | 遅め | 速い |
| 新しいデータの当てはめ | できる | できない(scikit-learnの場合) | できる |
| 軸の意味 | 読み取れる(第1主成分など) | 意味はない | 意味はない |
主成分分析は、軸の意味が読み取れるのが強みです。
一方、UMAPやt-SNEの地図の縦軸・横軸には、意味がありません。
「何が効いているか」を知りたいなら主成分分析、「どんなまとまりがあるか」を眺めたいならUMAP、と使い分けるのがおすすめです!
主成分分析については、以下の記事で詳しく解説しています。
主成分分析とは?簡単な説明とPythonでの実装!当サイト【スタビジ】の本記事では、実務の基礎分析にて使われることの多い主成分分析について詳しく見ていきます。最後にはカンタンなPythonでの実装も載せていますのでぜひ参考にしてみてください!
使うときのコツと注意点
それでは最後に、UMAPを使うときのコツと注意点です。
大事な設定は「n_neighbors」と「min_dist」
UMAPで特に大事な設定は、2つあります。

1つ目の「n_neighbors(エヌ・ネイバーズ)」は、何個先の近所まで見るか。
小さくすると細かい違いが、大きくすると全体の形が見えやすくなります。
2つ目の「min_dist(ミン・ディスト)」は、点どうしをどれだけ詰めて並べるか。
小さいほど、ぎゅっと固まった島になります。
| 設定 | 小さくすると | 大きくすると | 初期値 |
|---|---|---|---|
| n_neighbors(何個先の近所まで見るか) | 細かい違いが見えやすい(小さな島がたくさん) | 全体の形が見えやすい(大きなまとまり) | 15 |
| min_dist(どれだけ詰めて並べるか) | ぎゅっと固まった島になる | ふんわり散らばる | 0.1 |
※初期値は、Pythonのライブラリ「umap-learn」のものです。
まずは初期値で試してみて、細かいまとまりを見たいならn_neighborsを小さく、全体をつかみたいなら大きく、というように調整していくのがおすすめです。
地図の読み方に注意
注意したいのは、地図の読み方です。

たとえば、「Aの島がBの島の2倍大きいから、Aのほうがばらつきが2倍大きい」とは言えないんです。
また、地図の上で島に分かれて見えても、それがそのままデータのグループ分けの正解とは限りません。
グループ分けをきちんとしたいときは、クラスター分析の手法も組み合わせて考えましょう。
【5分で分かる】クラスター分析のPythonとRでの実装方法を見ていこう!当サイト【スタビジ】の本記事では、クラスター分析についてまとめていきます。クラスター分析は教師なし学習の定番手法で、データの構造や傾向を把握するのに非常に役立ちます。クラスター分析を利用してデータを可視化してみましょう!
UMAPの地図は、データの全体像をつかむための「下見」として使うのがおすすめなんです!
Pythonで試してみよう
Pythonでは「umap-learn」というライブラリで、手軽に試せます。

インストールは次のとおりです。
pip install umap-learn
scikit-learnに入っている手書き数字のデータ(8×8ピクセル=64次元、1,797枚)を、2次元の地図にしてみましょう。
import umap
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
# 8×8ピクセル(64次元)の手書き数字の画像 1,797枚
digits = load_digits()
X, y = digits.data, digits.target
# UMAPで2次元に縮める
reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, random_state=42)
embedding = reducer.fit_transform(X) # 形は (1797, 2)
# 数字ごとに色を分けて描く
plt.scatter(embedding[:, 0], embedding[:, 1], c=y, cmap="tab10", s=5)
plt.colorbar()
plt.show()
実行すると、0〜9の数字ごとに、色の分かれた島が並んだ地図が描かれます。
ここで y(正解の数字)は、色をつけるためだけに使っていて、UMAPには渡していません。
それでも数字ごとにまとまるのは、似た画像どうしが近くに並べられているからなんです!
random_state を決めておくと、何度実行しても同じ地図になります(そのかわり、並列での計算が使われなくなるので、少し遅くなります)。
また、一度作った地図に新しいデータを当てはめるときは、transform を使います。
# 1,500枚で地図を作り、残りの297枚をあとから当てはめる
X_train, X_new = X[:1500], X[1500:]
reducer = umap.UMAP(random_state=42).fit(X_train)
new_embedding = reducer.transform(X_new) # 形は (297, 2)
なお、身長(cm)と体重(kg)のように、項目ごとに単位や大きさがばらばらなデータでは、先に標準化(scikit-learnの StandardScaler など)をしておくと、距離がかたよらずにすみます。
UMAPのまとめ
最後に、今回のポイントをおさらいしましょう!
ウマたん要は、UMAPは、大きなデータの全体像を、すばやく見渡せる「地図づくり」の道具なんです!ぜひ、手元のデータで試してみてください!
UMAPのような次元削減や機械学習、データサイエンスを体系的に学びたいのであれば、当メディアが運営するスクール「スタアカ」がオススメです!
読んだ内容を、スタアカの「Python基礎」コースで身につける
データサイエンス・AIを、動画と課題で体系的に学べるオンラインスクール。最初のレッスンは無料で見られます。



