#はじめに
言語処理のための機械学習入門の3.6「クラスタリングの問題点や注意点」を読んで、備忘録としてクラスタリングを扱う自身の研究メモも交えてまとめる。
#クラスタリングとは
似ているもの同士を同じグループにまとめる処理。
与えられたデータから何らかのモデルや処理手段を導き出す教師なし学習の一種。
データからどんなグループができるかはわからず、できあがったクラスタをみて初めて、クラスタについての類推をすることができる。
はじめから目的のグループがあり、各データをどのグループに属するかを分ける「分類」とは異なる。
#クラスタリングにおける問題点、注意点
##問題点
###クラスタ数
クラスタリングは分類と違い、似ているものをグループ化する目的であるため、どの程度まで似ているものを一つのグループにするかにする基準やクラスタ数をいくつにするか、についての一般的な解が存在するわけではない。
クラスタ数を決定する方法として
最小記述原理などに基づいた方法が例としてあげられていたが、応用に最適なクラスタ数を常に決定してくれるとは限らない。
実際のところ、タスクやデータに合わせ交差検定などの地道な方法で決めることが多い。
###結果が初期値に依存する
k-meansやEMアルゴリズムのような繰り返しに基づくクラスタリング手法では、結果が初期値に大きく依存する。
このような手法では初期値は乱数で決定されることが多く、いくつかの初期値で実験する必要がある。
自身の研究で利用する手法もEMアルゴリズムを用いたk-meansであるが初期値によっては稀に想像もしないクラスタが出力されてしまったりすることがある。
###計算時間
クラスタリングはアルゴリズム中であらゆる組み合わせを検討したり、繰り返し計算をおこなったりするため計算に時間がかかることが多い。
したがって、当然のことながらアルゴリズム中でできる限り計算数を減らすべきである。
繰り返し計算する必要のない式は最初に1回だけ計算をしたり、必要以上に繰り返さないことである。
また、上述の初期値も計算時間に大きく関わってくる。最初に与えられた初期クラスタが収束に近い状態であったら繰り返し行うことなくすぐに計算が終わるが、適度にバラバラな初期値が与えられた場合、適切なクラスタを作るのには多くの繰り返しの計算が必要になる。
##注意点
###小さな値を扱うときにアンダーフローを起こしやすい
確立値の掛け合わせをするようなときなど、非常に小さな値を扱う場合アンダーフローを起こしやすいので、それらの値を対数にとった値に変換する。
対数として利用するので掛け合わせるときは足し算でよいが、掛け合わせるときにはlogsumexpなどというアルゴリズムを用いるなどの工夫が必要になる。
どうやらpythonのライブラリで直接利用できるみたい。
logsumexp
scipy.misc.logsumexp
###評価が難しい
クラスタリングは総じて精度の評価が難しい。
評価の一つとして正解クラスタデータを用意し、実験によるクラスタリングによりどれだけ再現できているかという指標を用いることもある。これは分類の評価指標に近い。
ただし、これらの指標が自分があらかじめ正解データを用意するため、結局自分が期待するクラスタになっているかという側面的な評価になる。
自身の研究ではNMI(Normalize Mutual Information)を用いてクラスタリング評価をした。日本語では正規化相互情報量と訳され、正解データを用意して結果データとの相互情報量を用いて情報論的に評価する手段である。
実装ではPythonの機械学習ライブラリscikit-learnのnormalized_mutual_info_scoreを利用した。
この指標が悪くても、別の側面から見れば非常に良いクラスタを作れているかもしれない。
これは,クラスタリングを研究する上で非常に大事な心構えかもしれない。
実験による指標が良くなくても失敗と断定してしまわず、一度観点を変えて考えてみることが大事。
クラスタリングを直接評価するのではなく、獲得したクラスタが別のタスクに役立つことを示すことで間接的にクラスタリングを評価するというのも有効な手段である。
定性的な評価としてこちらも重要。結果としてもわかりやすい。
#まとめ
クラスタリングを扱うにあたり、さまざまな点に敏感に考える必要がある。
特に最も一般的なクラスタリング手法k-means においては愚直に計算を行うと計算量はO(N^2)となる。
スケールさせるためには工夫が必要である。(古典的な改善手法では初期値決定にも計算処理を行うk-means++などがある)