クラスタリング＋二次元マッピングによる可視化を定量評価する

機械学習エンジニア・データサイエンティストの[muraokaz](https://qiita.com/muraokaz)です。[VISITS Advent Calendar 2019](https://qiita.com/advent-calendar/2019/visits)の9日目の記事となります。

データ分析をしていると、

- インプットデータをベクトルに変換してクラスタリング
- 可視化のために二次元マッピングしてアウトプットする

というようなシチュエーションに多く遭遇すると思います。

可視化されたマップはデータの直感的な理解に役立ちますが、**クラスタリング＋二次元マッピングの性能はどのように検証すれば良いのでしょうか**。最終的なアウトプットを見て妥当かどうかをえいやっと判断するということも考えられます（？）が、データから何かインサイトを得たいような未知のインプットだった場合や、クラスタリングや次元削減のチューニングをする場合には定性的な判断が難しいことも多く、定量的に性能を評価する手段が必要です。

今回は、弊社でデータ分析をした際に行った、定量評価手法の調査、検証について書いてみたいと思います。

# 問題設定

最初に、想定するシステム、定量評価したいポイントについての問題設定を行います。下記にその手順とフロー図を示します。

1. システムはデータ集合を入力とし、そのデータを何らかの方法でベクトル化（場合によってはベクトル化を飛ばして直接データ間の距離・類似度計測を行うこともある）
2. 左側のフローでは、データに対してクラスタリングをかけ、生成されたクラスタにラベルを付与
3. もう一方ではデータの次元削減を行い、高次元（例えばドキュメントを単語集合の平均ベクトル化として考えるとword2vecの300次元）ベクトルをマッピング表現可能な二次元まで落とす
4. これらの結果を組み合わせて二次元マッピング（散布図）のアウトプットを描画

![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528021/fb969389-3371-7835-87af-ef3203a166ed.png)

ここでクラスタリングの結果、次元削減の結果をそれぞれ定量評価することで、システム全体を性能評価することを考えます。

# クラスタリングの性能評価

クラスタリングの結果はどのように定量評価すれば良いのでしょうか。注意したい点として、このような評価が想定するシチュエーションは、一般的な機械学習の結果評価を行う場合と比べてやや異なる場合があります。具体的には以下のようなケースであることが考えられます。

- 正解クラスの付与された教師データが十分なケースで存在しない（＝「教師あり多クラス分類＋正解率計測」のような定量評価はできない）
- ある（２、３の）ケースのデータについては人手による正解クラスが付与されていて（社内外の専門家がプロジェクトの過程で付けた）、これらを使ってクラスタリング手法の性能評価をしたい

このようなシチュエーションでは、**教師なしクラスタリングで振り分けた予想クラスタがどの正解クラスに対応するかは明示的には分からず（一般に正解クラス数≠予想クラスタ数）、正解と予想の互いの分布同士を比較する精度指標を考える必要があります。**

このような状況下で用いられる評価指標についていくつか見ていきましょう。

## Purity-Inverse Purity F-Value

PurityとInverse Purityを組み合わせたF値。調査した中では最もポピュラーな指標で、Purityが「予想クラスタのそれぞれに、異なる正解クラスが存在しないか」を測っています（純度）。これと逆指標となるのがInverse Purityで、「正解クラスが異なる予想クラスタに分かれていないか」を計測する指標。Purityがクラスタを最もバラバラにしたときに最大化される指標で、Inverse Purityが1クラスタのときに最大化される指標なのでこれの調和平均をとっています。が、両者の値域が異なりうまくバランスされないことから、手元のデータで検証したところでは偏ったクラスタ分布で評価値が最大化されてしまいました。

https://stackoverflow.com/questions/34047540/python-clustering-purity-metric

## Entropy, Normalized Mutual Information

PurityやInverse Purityより理論的な指標として論文等で推奨されていましたが、手元での検証結果としては上記F-Valueと同様の動きをしてしまうようです。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.entropy.html
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.normalized_mutual_info_score.html

## Adjusted Rand Index

Rand Indexは、「データ集合のペア全組み合わせのうち、1.ペアが異なる正解クラスにいて予測クラスタでも別々、2.ペアが同一の正解クラスにいて予測クラスタでも一致、のいずれかを満たすものの割合」と定義されます。Adjusted Rand Indexは、予測クラスタが正解クラスと相関しなかった場合の指数が0になるように調整された値です。データのペアの一致、不一致を評価することで、クラス・クラスタのサイズが全体指標に与える影響（大きなクラス・クラスタの正解・不正解が優先される）を軽減しているようで、私たちが検証したデータにおいてはこの指標を最大化したクラスタリング結果が（比較した指標の中では）最も妥当なように感じられました。

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.adjusted_rand_score.html

# 次元削減の性能評価

クラスタリングの性能評価と比較すると、次元削減の性能評価は直感的に説明がつきやすいものです。つまり、**次元削減前後で、近かったデータ点同士は近く、遠かったデータ点同士は遠い関係が保存されているか**を評価すれば良いと考えられます。私たちが調査して用いた指標は以下の二つですが、その挙動に大きな違いはないように感じられました。

- Spearman Rank-order Correlation
- Co-Ranking Value

ただし、これらの手法は同一の次元削減手法の中での評価を行うときに適しているようです。次元削減の過程で全てのデータ同士の距離関係を保存することはできないため、手法によっては遠い距離関係を重要視しないなどの方法で結果の視認性を高めているようですが、このような工夫まで定量指標では追えないからです。アウトプットのための次元削減の評価としては、手法の選定レベルではアウトプットを視認して確認し、その中のチューニングや特徴量追加などの前後比較でこれらの定量指標を用いるのが良さそうです。

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html
https://qiita.com/ZoneTsuyoshi/items/1c532a3a7bfaf5393e55

# まとめ

クラスタリング＋二次元マッピングでデータ可視化する場合の、性能定量化指標について調査、検証した結果をまとめました。正解が存在する教師あり学習のようなシチュエーションでの精度評価と異なり、クラスタリング、次元削減の評価指標にはそれぞれ癖のようなものがあるようですが、部分的にも指標を定量化することによってシステムの性能改善サイクルを早めることができるようになります。

指摘や他の手法の紹介等ありましたらよろしくお願いします。