機械学習の過程をD3.jsで可視化する
はじめに(お決まりのやつ)
こんにちは。
そしてはじめまして、dr_paradiです。
CYBIRDエンジニア Advent Calendar 2014 - Qiitaの12日目です。
CYBIRDエンジニアの昨日の記事は SayakaItoさん(いつもお世話になっております)のルカによる福音書24章でした。最近入った私としては昔のCYBIRDの話(というかITビジネス黎明期)のお話は非常に参考になります。
本日の要約
今回、私はD3.jsというわりと人気なJavaScriptライブラリを用いて、
代表的なクラスタリングアルゴリズムであるK-meansを可視化したお話をします。
ソースとデモはこちらです。
bl.ocks.orgを用いています。
自己紹介
フルスタックデータアナリスト(自称)として活躍中です。
1年前くらいのデータヴィジュアライゼーションハッカソンで野球の守備の可視化アプリを作成しました。
データ可視化 (Data Visualization) について
弊社のデータアナリストの仕事としては、
- 仮説立案 (どのようなデータからどのような知見が得られそうか)
- データ処理 (いわゆる集計とかマエショリ)
- 分析 (統計とか機械学習とか)
- アウトプット (レポートやアルゴリズムなど)
があります。
最後のアウトプットでデータを可視化し、レポートにまとめ、プレゼンテーションを行うため、可視化の善し悪しがデータ分析者の最終的な成果を大きく左右します。
いくら分析の精度や妥当性が高くとも可視化の出来次第で、提案が受け入れられないという事も大いにあります。
参考: 悪い可視化の事例集
機械学習について
データ分析業務の中では、知識発見的なアプローチを求められる事もあり、
「ビッグデータからデータマイニングして」
※(いろいろなログを集めた大量のデータから教師なし学習で施策などに役立つ知識を出して欲しいという意味だと思われる)
と言われ、機械学習の利用を迫られることもままあります。
説明する側にとっても、説明を受ける側にとっても「機械学習」という言葉はなかなか威圧感があり、とっつきづらい印象があります。
そこで、可視化の力を借りて、アルゴリズムのイメージをしやすくしました。
概要を知らずに、「内容を知らないけどクラスタリング使って分析しました」と説明するよりは説得力が増すかと思います。
クラスタリングの可視化
本題の機械学習の可視化の過程になります。
今回用いる、代表的なクラスタリングのアルゴリズムであるK-meansは、その名の通り与えられたデータを「K」個の重心(mean) をもつ集合(クラスタ)に分割する手法です。
今回作成したデモの場合は、入力データとしてランダムに選んだ3点を中心にガウス分布を生成します。
※現場でKはヒューリスティックに決めます。
このサンプルデータを3つのクラスタに分けて行きます。
K-meansの流れ
K-meansのアルゴリズムは以下の通りです。
解説
発生する計算は上記の2番くらいで、難しい事はしていません。
// ユークリッド距離の計算
distance = Math.sqrt(
Math.pow((centroidArr[i - 1].x - d.x), 2) +
Math.pow((centroidArr[i - 1].y - d.y), 2)
);
ピタゴラスの定理さえできれば問題ないですね。
まとめ
言葉で説明したり数式を眺めたりするよりは、理解するのが簡単だったかと思います。
実際の分析では、多次元情報をクラスタリングすることになるので、
簡単に可視化できませんが、デモのような二次元での可視化でも処理のイメージをつけるのは重要です。
また、あまりアルゴリズムの詳細を知らずにRやSPSSなどのライブラリを使っている方にとっても、どういった処理をしているかを理解する手助けになれば幸いです。
今後、入力などに気をつかって間違いを起こしづらくなること間違いありません。
実際の分析では、クラスタリングの出番が多くあります。
私が行った例では、とあるサービスのアンケートの分析を行う際に、
ユーザの属性を元にクラスタリングして、クラスタ毎の回答を形態素解析して頻度を抽出して実際の施策やキャンペーンの参考にすることができました。
おわりに(お決まりのやつ)
CYBIRDエンジニア Advent Calendar 2014 - Qiitaは、Satoshi_Nakamuraさんの記事です!
だいぶメジャーなネタに寄せてると話していたので、インフラについて熱く語ってくれる事間違いありません。