UMAPの結果をクラスタリングするべきか
2024-11-08
UMAPの結果のデータをDBSCANでクラスタリングすることを試していたら、そもそもクラスタリングにおける「データポイントがどこか単一のクラスタに所属しているはずである」という決めつけが好ましくないのではという気持ちになった話 UMAPの時点ですでに高次元データは2次元に次元削減されて可視化されている
それを解説する上でクラスタリングをするとしても「データ点すべてをk個のクラスタのいずれかに所属させる」ことは必要ないのではないか
必要ない制約を入れることで問題を難しくしているのではないか
かわりに「密度の高い塊」をいくつか抽出して、それに対してAI解説をした方が理解容易さやユーザの満足度が高まるのではないか
作業過程の思考メモ
Density-based spatial clustering of applications with noise (DBSCAN)
元データは下記、これをどうクラスタリングするのがよいか
DBSCANには、どのくらい近い点を近接しているとみなすかのパラメータepsと、どれくらいの個数まで外れ値として捨てていいかのパラメータmin_samplesがある
なのでどういうパラメータの時にどうなるのかを観察した
https://gyazo.com/d6e9a06a53a2bf02680914a2f18fddb4
元データは3970件あり、min_samplesを5とか10とかで決めるのはアドホックすぎる気がしたので元データに対するratioにした
このユースケースでは元データに独立性があるため、半分の人数の時にはランダムに半分間引いたデータになり、その場合は全てのクラスタのメンバが半分になるわけなので妥当
外れ値と判断されたものは薄い灰色にした
結果を可視化するのは大事だなぁ、「5つのクラスタにわかれました!」と言ってこれを出してきたら「やりなおせ!」と言いたくなるね
https://gyazo.com/74f7654f8031ac018d3849e295b535ac
これはepsが小さすぎてほとんどのものがバラバラになって外れ値とみなされている
「外れ値として捨てられたデータの割合」を見るといいかもね
データを捨てすぎないでほしいという観点から、僕はこの15通りの中ではこれがいいと思う
https://gyazo.com/8a4dc6a47ddfa51005fbc8fd787bb830
一方で中身の大きいクラスタに関してはもう少し分けてほしい
Largest cluster label: 0, Size: 3313
中央クラスタ
https://gyazo.com/ca78ba9feeb5beabee68258e4128cdc9
https://gyazo.com/2ede642899c3f91ba27476630daa82f7
ううーん、この2つの間の斜めのラインが主観的には好ましく感じるが、それにしても外れ値が多い
https://gyazo.com/868a75c921455b846d041acd1ca2a45chttps://gyazo.com/8f47923a4850a422f8cd1d6b127b5db3
外れ値を減らすためにepsを増やすと、クラスタは併合されてしまう
うーん、これはDBSCANの「外れ値」を「離れている異常値だから捨てたデータ」と解釈することの方に問題があって「二つのクラスターの狭間にあってどちら側とは言いづらいデータ」という解釈にした方がいいのだろうか
https://gyazo.com/a7b9acd91aa50cf79544b11fff78fde0
「AとBはわけたい」「ではどこに境界線を引くのが適切か?」
この問がそもそも間違ってるのでは?という話
境界線を引くということは太さのない線によって分割可能であるという前提を入れている
実際には世の中の多くのものは明瞭な境界線を持たず、幅のある「どちらともいいづらいゾーン」を挟んで分かれている
このとさかの部分が分かれることが最初は意外だった
https://gyazo.com/1868854c22611da841d329133a1d4e76
なぜそうなったのかはeps少なめ、ratio高めのを見るとわかる
(当初「外れ値多すぎだな」でスルーしてたが、実はこれが大事)
https://gyazo.com/a2298c62327fa77c07790025c226b0c0
二次元の図を目視しただけでは人間の僕は気づけていなかったのだが、とさかの先端部に濃度の高いゾーンがある
https://gyazo.com/4e9837dedb502ad1e9f52e4f334e0258
この密度の高いゾーンからepsの範囲で地続きとみなして領土を拡大している
KDEを見て思ったけどむしろバンド幅広目でKDEしたらいいのか
https://gyazo.com/fb307a29abb597198aff6c47bdc4034f
まずは大雑把にみると、こういう「明確に境界の引きづらい意見分布」がある まずこういうものがあるんだ、という世界認識を前提にする
その中で、特に密度の高いゾーンの意見分布はこう
https://gyazo.com/5eb99e21a33cd7a7e65d68bfb98457aa
で、これらの「濃いクラスタ」に対してAIで解説をつける
という説明の仕方でいいのではないか
この気づきに関してページトップにまとめておいた
その他の方法
中央クラスタに関して「最初に全データに対してUMAPしたもの」を元にクラスタリングしようとしているが、元データに戻ってもう一度UMAPする手はある
が、一般人向け説明が難しすぎる気はするな
今回の元データに関しては各軸が賛成反対データなので、クラスタリングせずに賛成反対密度表示にする手もある 自然言語のembeddingをUMAPする場合には使えない
この場合はいっそクラスタ自体をLLMに発見させるアプローチ?
この記事にフィードバックをもらった