Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

Azure Machine Learning できるとこまでやってみよう Vol.3

過去の記事はこちら↓
Azure Machine Learning できるとこまでやってみよう Vol.1 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.1.5 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.2 - Jack of all trades

此度はそれほど間を空けずに投稿できた…。

ということでVol.3です。今回はクラスタリングのモジュールを使ってモデルを構成します。と言っても、Azure ML(ML Studio)で用意されているクラスタリングのモジュールは「K-Means Clustering」のみ*1なので、こやつの説明に終始する感じです。

ClassificationとClusteringの違い

ClassificationとClusteringって同じじゃないの?と思われそうなので、軽く説明しておきます。平たく言うと、Classificationは既知の分類に対する振り分けを行うのに対して、Clusteringは未知の分類を生成します。
Classificationでは、パラメータと分類ラベルを持ったデータ群を学習データとして学習させます。学習済みの学習器に対して、パラメータのみ持ったデータを与えてやると、パラメータに応じた分類ラベルが出力されるといった寸法です。
一方Clusteringでは、パラメータのみを持ったデータ群(分類ラベルを持たない)を入力すると、そのデータ群をパラメータに応じて分類し、幾つかの塊として出力します。

K-Means Clusteringとは

上述の通り、クラスタリング用のモジュールは1つだけということで、せっかくなのでこのアルゴリズムについて簡単に説明しておきます(その他のモジュール(アルゴリズム)は種類が多すぎてカバーしきれませんが、これ一つぐらいならなんとか…)
K-Means Clusteringは以下の手順で実行されます*2

  • 分類されるグループの数(k)を設定します
  • 与えられたデータ群をランダムに分類します(k個のグループに分類)
  • 各グループごとに重心を算出します
  • 各データと各グループの重心の距離を計算し、最も距離の近いグループにデータを再分類します
  • 上記プロセスを分類に変化がなくなる、もしくは設定された回数繰り返すまで実行します f:id:sadynitro:20150519202708p:plain

例題

今回クラスタリングのモジュールを使ってモデルを構築するにあたって、簡単な例題を作成しました。
ショッピングモールのように、テナントが多数入ってる商業施設の購買データを想定します。 顧客ごとの各テナントに対する購買回数が入ったダミーデータを作成し、それを元に顧客をクラスタリングします。 ここでのポイントは、年代や性別という既知のラベルを一切使用せず、購買データ(購買行動)に基づく新たなグループに分類するということです。 せっかくなので生成したグループを使って、多少の分析もしてみましょう。

学習データの準備

例題に基づいたダミーデータをCSVファイルで準備し、新規DatasetとしてML Studioにアップロードします。
f:id:sadynitro:20150519204018p:plain
f:id:sadynitro:20150519204035p:plain
f:id:sadynitro:20150519204041p:plain

モジュールの配置

ここからモデルを構築していきます。

まずアップロードしたDatasetを配置します。
今回は予測や近似ではなく、クラスタリングなのでSplitで学習データと検証データに分割はしません。
データに接続する学習モジュールはClustering用のTrain Clustering Modelを使用します(普通のTrain Modelでない点に注意)
f:id:sadynitro:20150519204259p:plain

右のプロパティから「Launch column selector」をクリックし、グルーピングされる要素を選択します。
f:id:sadynitro:20150519204859p:plain

Train Clustering ModelにK-Means Clusteringのモジュールを接続します。ここでモジュールの設定について簡単に説明します。

  • Number of Centroids : 分類するグループ数
  • Metric : 距離計算種類
  • Initialization : 初期化手法の選択
  • Iterations : プロセスの繰り返し回数

f:id:sadynitro:20150519205042p:plain

しつこいようですが、今回は予測や近似ではないので、スコアリングや評価モジュールは接続しません。 結果を取得するためのモジュールとして、ここでは「Metadata Editor」と「Convert to CSV」を接続します。
f:id:sadynitro:20150519205808p:plain
f:id:sadynitro:20150519210101p:plain

学習の実行と結果表示

モジュールの配置が完了したら「RUN」をクリックして作成したモデルを実行します。
実行が完了したら結果を確認します。まず「Metadata Editor」の下○をクリックして「Visualize」を選択します。
f:id:sadynitro:20150519210323p:plain

元のデータの右端に分類番号が追加されていることを確認できます。 f:id:sadynitro:20150519210429p:plain

これだけだと「フーン」なので「Convert to CSV」モジュールから結果のCSVファイルをダウンロードして多少の分析を試みます。

アウトプットからさらに分析

「Convert to CSV」モジュールの下○をクリックし「Download」を選択し、CSVファイルをダウンロードします。
f:id:sadynitro:20150519210701p:plain

ダウンロードしたファイルをローカルで加工し、分析してみます。ここではExcelを使用します。
Excelのピボットテーブルを使用して、各グループの各テナントに対する平均購買回数を算出します。
算出した結果をグラフにしてみると、各グループごとに贔屓にしているテナントの傾向に明らかな差異があることが確認できます。
f:id:sadynitro:20150519211357p:plain

グラフの代わりに、グループごとに購買回数の多いテナントTOP3などを抽出しておけば、DM等の販促に利用できるかもしれません。また、視点をテナント側からに変えれば、相性の良いテナントをグルーピングして、テナントの配置や入れ替えに役立つ情報になるかもしれません*3

ちなみにここでは手動でデータ加工を実施していますが、RやPythonスクリプト実行モジュールを用いれば、自動で出力することも可能かと思います。

まとめ

今回はクラスタリングを用いたモデル作成を解説しました。少しは面白い例題になっていると良いのですが…。 一見何の役に立つかわかりづらいクラスタリングも発想次第で有用なものになる、ということが感じ取っていただけると幸いです。

ということで今回は以上です。次回はテキスト分析にチャレンジ。

*1:分類(Classification)のモジュールは沢山用意されてますね。

*2:ここで解説しているのは標準的な手順です。実際にはK-Meansの弱点を補うアイデアを盛り込んだ種々のアルゴリズムが存在します。

*3:これについてもある程度有効な手法は既にあるのですが、業務上の理由でここでは書けません…。みなさん試行錯誤してみてください。