UMAPの結果をクラスタリングするべきか
2024-11-08
UMAPの結果のデータをDBSCANでクラスタリングすることを試していたら、そもそもクラスタリングにおける「データポイントがどこか単一のクラスタに所属しているはずである」という決めつけが好ましくないのではという気持ちになった話
- UMAPの時点ですでに高次元データは2次元に次元削減されて可視化されている
- それを解説する上でクラスタリングをするとしても「データ点すべてをk個のクラスタのいずれかに所属させる」ことは必要ないのではないか
- 必要ない制約を入れることで問題を難しくしているのではないか
- 無理のあるクラスタリングをすることで下流のAIによるクラスタ解説の質を下げているのではないか
- かわりに「密度の高い塊」をいくつか抽出して、それに対してAI解説をした方が理解容易さやユーザの満足度が高まるのではないか
作業過程の思考メモ
Density-based spatial clustering of applications with noise (DBSCAN)
元データは下記、これをどうクラスタリングするのがよいか
DBSCANには、どのくらい近い点を近接しているとみなすかのパラメータepsと、どれくらいの個数まで外れ値として捨てていいかのパラメータmin_samplesがある
なのでどういうパラメータの時にどうなるのかを観察した

- 元データは3970件あり、min_samplesを5とか10とかで決めるのはアドホックすぎる気がしたので元データに対するratioにした
- このユースケースでは元データに独立性があるため、半分の人数の時にはランダムに半分間引いたデータになり、その場合は全てのクラスタのメンバが半分になるわけなので妥当
- 外れ値と判断されたものは薄い灰色にした
- 結果を可視化するのは大事だなぁ、「5つのクラスタにわかれました!」と言ってこれを出してきたら「やりなおせ!」と言いたくなるね

- これはepsが小さすぎてほとんどのものがバラバラになって外れ値とみなされている
- 「外れ値として捨てられたデータの割合」を見るといいかもね
- データを捨てすぎないでほしいという観点から、僕はこの15通りの中ではこれがいいと思う

- 一方で中身の大きいクラスタに関してはもう少し分けてほしい
Largest cluster label: 0, Size: 3313
中央クラスタ

- ううーん、この2つの間の斜めのラインが主観的には好ましく感じるが、それにしても外れ値が多い


- 外れ値を減らすためにepsを増やすと、クラスタは併合されてしまう
- うーん、これはDBSCANの「外れ値」を「離れている異常値だから捨てたデータ」と解釈することの方に問題があって「二つのクラスターの狭間にあってどちら側とは言いづらいデータ」という解釈にした方がいいのだろうか

- 「AとBはわけたい」「ではどこに境界線を引くのが適切か?」
- この問がそもそも間違ってるのでは?という話
- 境界線を引くということは太さのない線によって分割可能であるという前提を入れている
- 実際には世の中の多くのものは明瞭な境界線を持たず、幅のある「どちらともいいづらいゾーン」を挟んで分かれている
- このとさかの部分が分かれることが最初は意外だった

- なぜそうなったのかはeps少なめ、ratio高めのを見るとわかる
- (当初「外れ値多すぎだな」でスルーしてたが、実はこれが大事)

- 二次元の図を目視しただけでは人間の僕は気づけていなかったのだが、とさかの先端部に濃度の高いゾーンがある
- この密度の高いゾーンからepsの範囲で地続きとみなして領土を拡大している
KDEを見て思ったけどむしろバンド幅広目でKDEしたらいいのか

- まずは大雑把にみると、こういう「明確に境界の引きづらい意見分布」がある
- まずこういうものがあるんだ、という世界認識を前提にする
- その中で、特に密度の高いゾーンの意見分布はこう

- で、これらの「濃いクラスタ」に対してAIで解説をつける
- という説明の仕方でいいのではないか
この気づきに関してページトップにまとめておいた
その他の方法
- 中央クラスタに関して「最初に全データに対してUMAPしたもの」を元にクラスタリングしようとしているが、元データに戻ってもう一度UMAPする手はある
- 今回の元データに関しては各軸が賛成反対データなので、クラスタリングせずに賛成反対密度表示にする手もある
- 自然言語のembeddingをUMAPする場合には使えない
- この場合はいっそクラスタ自体をLLMに発見させるアプローチ?
この記事にフィードバックをもらった