クラスタリングタスクで機械学習の流れを体験

教師あり学習と教師なし学習の分類タスクの違い

はじめに

おはようございます。こんにちは。こんばんは。
GMOアドマーケティングのY-Kです。

今回は機械学習への足がかりとなるような記事を書きたいと思ったので、クラスタリングタスクを通して機械学習の流れを大雑把に書いていこうと思います。
機械学習における基本的な データ分析 -> 予測 -> 評価の流れを体験しつつ、読んでいる間に気になるところがあればそこを深掘りしていくなど、機械学習への興味/勉強の第一歩としていただければと思います。

クラスタリングとは

クラスタリングは機械学習における教師なし学習の一種で、データの類似度でデータをグループ(クラスタ)分けする手法のことを指します。
データに対して答えが存在する教師あり学習とは異なり、各データに答えがない状態で学習されるので、クラスタリングによってまとめられたデータのグループが何を示しているのかは解釈が必要となります。
しかしその分、クラスタリングは教師あり学習の分類と比べてデータ同士の繋がりに重きをおいて学習することができます。
※上記画像は当社が作成したものです

今回行うタスク

クラスタ数が不明なデータにおいてクラスタリングを行い、結果を評価していくことで、分類に最適なクラスタ数を考えようと思います。

環境

google colaboratory上で、機械学習向けライブラリscikit-learnを用いて行います。

データ作成

まずはscikit-learnのmake_blobs関数で分析対象のデータを生成します。
サンプル数やクラスタの数、特徴量の数を指定することでクラス分類タスク用のデータを生成することができます。
詳しい使い方はドキュメントを参考にしてください。
クラスタの数は3~10個の間でランダム、特徴量は大人の事情で2つに設定します。

分析

百聞は一見にしかずということで、生成したデータを可視化して確認します。
大人の事情で特徴量を2つにしたので、2次元のグラフにプロットすることができます。
大きく分けて3つのデータになっていそうです。 このままクラスタリングの方に移ってもよさそうなのですが、手持ちのデータをそのまま使用してしまうと数字の大きさがそのまま結果に与える影響の大きさになってしまうこともあるので、特徴量間のスケールを統一するためにscikit-learnのStandardScalerを用いて標準化をします。(ついでに標準化後のデータ分布も見てみます)
先ほどとデータの分布は変わらないですが、縦軸と横軸のスケールが揃っていることが確認できます。

特徴量がグラフで表現できない4つ以上の場合は、主成分分析や深層学習でデータを変換することで次元削減し、グラフ描写が可能な次元数まで特徴量を落として分析を行います。
データ量や特徴量が多くなればなるほど分析にかかる時間が膨大になっていきます。
(4次元以上のデータに対して次元削減を行いクラスタリングするタスクについては今度執筆しようと思います。)

予測

クラスタリングの方法は数多くあるのですが、今回はk-means法で行います。
例の如くscikit-learnでモデルが準備されているのでそれを用います。
分類するクラスタ数を設定してデータを渡して学習を行います。
学習後、データの分類推測結果とクラスタの中心をプロットして確認してみます。

アルゴリズム的には図のように分類されました。

なんだか腑に落ちませんね。

ということで、クラスタ数を2~10で指定して力ずくでモデルを作成し、それぞれでクラスタリングしてみます。
lossは後々使います。
力ずくでクラスタリングしたのはいいもののどれが最適なのかわかりません。
4個以上はどれでもうまく分割できているように感じます。

評価

それでは、ここからはいくつのクラスタに分割すれば良いかを数値的に評価していきます。
先程のモデルでどれが一番うまく分割できているかを結論付けます。 評価は以下の手法で行います。
  • エルボー法
  • シルエット分析

エルボー法

エルボー法は、各クラスター内の二乗誤差の総和を用いて最適なクラスタ数を導き出す手法です。
クラスタ数ごとに誤差をプロットし、誤差が急激に減少している部分において誤差が最も小さい点を最適なクラスター数と推測します。
(グラフを腕に見立てた時の肘の部分です)
k-meansでは学習後、.inertia_から取得できます。
先ほどモデルをまとめて作成するときにloss_listに各モデルの誤差を格納していたので、それをプロットしてみます。
クラスタ数4個以上でクラスタリングするのがよさそうです。

シルエット分析

シルエット分析とは以下の観点からモデルのクラスタリング性能を評価する方法です。
  • クラスタ内のサンプルは密であればあるほど=サイズが小さいほど良い(凝集度:α)
  • 異なるクラスタは距離が離れていれば離れているほど良い(乖離度:β)
分析指標であるシルエット係数は以下の式から導出されます。 シルエット係数は-1から1の範囲をとり、以下のように解釈します。
  • 正:そのサンプルが所属外のクラスタから離れている
  • 0 :クラスタの境界付近に存在している
  • 負:誤ったクラスタに所属している可能性が存在する
得られたサンプルごとのシルエット係数を以下のルールでソートし、棒グラフ(シルエット図)を作成します。
  • サンプルの所属クラスタの番号でソート
  • 同じクラスタ内ではシルエット係数でソート
シルエット図にすることでクラスタリング全体の性能、およびクラスタごとの性能を可視化することができます。
クラスタリングに使用したデータと学習したクラスタリングモデルを渡し、シルエット図、クラスタごとのサンプル数、シルエット係数の平均値を表示する関数を作成します。 エルボー法で良さそうだったクラスタ数が4のモデルのシルエット図を確認してみます。
縦軸はクラスタの識別番号、横軸はシルエット係数、赤の点線はシルエット係数の平均となっています。
シルエット図は以下に注目します。
  • シルエット係数が正のサンプルが多いこと
  • 各クラスタの厚さが均等であること
    • 適切にクラスタリングができているとクラスタ数は均等になる
上記を踏まえると、クラスタ数に偏りがあり、クラスタリングが少しうまくいっていないことがわかります。


各モデルのシルエット図を確認していくと、クラスタ数8,9あたりで綺麗なシルエット図ができていました。
どちらもほぼ均等に分割できているので、シルエット係数の平均値が高い方を採用し、今回は8つにクラスタリングするのが適切と結論づけます。
正解を確認してみると、こちらも8つのクラスタからできているデータでした。
(分布は大きく異なりますが・・・・)
ちなみに、最初に可視化して良さそうだと思ったクラスタ数3のシルエット図は以下です。
美しくないです。

最後に

今回は、クラスタ数が不明なデータに対して最適なクラスタ数の推定を行いました。
機械学習への勉強の足がかりとなれば幸いです。

以上、ここまで読んでいただきありがとうございました。