pca+kmeansについての雑実験

はじめに

列数が多いデータセットに対してクラスタリングを行う場合にPCAで列数を次元削減してからクラスタリングをするという手法があるらしいです。 確かにPCA等で列の次元削減を行うことでノイズ成分を落とせるので、うまくいけば重要となる特徴だけを用いたクラスタリングができそうです。 近い考え方で言語処理系のデータを扱うときにBag of Words+TFIDFで作った特徴量をSVDで次元削減したデータを学習器への入力とするという手法はありますね。

下記文献の実験では上記の手法は有効となっていますが、ちょっと中身理解しきれていない部分もあるので実験ベースで確認をしていきたいと思います。 http://ranger.uta.edu/~chqding/papers/KmeansPCA1.pdf

実験

MovieLens 1M Datasetを用いて実験を行いました。 このデータセットは約6000のユーザが約4000の映画に対して5段階評価をつけたデータセットになります。

6000のユーザを映画の嗜好性が近いグループでまとめるために クラスタリングで10のグループに分割するというタスクを考えます。

異なる特徴量を用いた場合のクラスタリングの評価をどう比較しようかという問題があります。 同じ特徴量であればエルボー法で使うような残差平方和が使えますが、今回は比較したい対象同士で特徴量の数が異なります。 なので今回は映画の嗜好でクラスタリングをした場合、年齢や性別もそれなりに別れるはずだという仮定のもと、 クラスタリングには用いていないユーザに紐づく変数の性別(2カテゴリ)と年代(7カテゴリ)をダミー化した特徴の残差平方和で評価を行うことにします。

列方向の次元削減を全く行わない場合と、PCAで削減する特徴量数を変化させた場合の試行を行った結果、それぞれの残差平方和と所要時間は以下のようになりました。

手法 特徴量数 残差平方和 所要時間(s)
kmeans 3706 7002 32.1
PCA+kmeans 1000 7003 18.5
PCA+kmeans 500 6972 10.1
PCA+kmeans 100 7021 4.1
PCA+kmeans 50 6986 2.6
PCA+kmeans 10 6978 2.1

実験コードは下記になります。

github.com

考察

今回の結果だとPCAで次元を削減してもしなくても残差平方和はあまり変わりませんでした。 評価指標があまりよくなかったのかもしれませんが、このへんはデータ依存性が強い気がしています。 ただ、処理時間は削減した次元数に応じて小さくなるので、データ量が巨大で処理時間を気にする必要がある場合には有効に働く可能性がありそうです。