IBM Developer Japan Webサイトは2021年3月15日をもって終了となり、日本語コンテンツの一部は、オープンソースとして、提供予定です。 URLはこちら

Python と scikit-learn を使用してクラスタリング・アルゴリズムについて学ぶ

このチュートリアルは開発者向けのラーニング・パス「機械学習を始める」を構成するコンテンツです。

概要

このチュートリアルでは、教師なしアルゴリズムを使用してデータからグループと例外を見つけ出します。教師なし学習を適用するのは、「グラウンド・トゥルース」がないか、期待される結果を示すラベル付きデータセットがない場合です。教師なし学習では、未加工のデータに各種のアルゴリズムを適用してデータのクラスターを発見します。教師なし学習の背後にある理論と考え方について学ぶには、「Unsupervised learning for data classification」を参照してください。

cluster_plotly.gif

クラスターが (例えば 3 次元のグラフで) 形になってくるにつれ、クラスターにラベルを付けたくなってくるでしょう。それが、教師なし学習を適用してデータ内に隠された特徴を発見するという例です。クラスターは重要ではなく、外れ値について詳しく調べたいとしたら、「異常検知」を目指していることになります。

cluster_anomalies.gif

データの視覚化を試みる場合、最も簡単に描画できる 2 次元または 3 次元のデータを使おうとするかもしれませんが、このチュートリアルで使用する手法は多次元または超次元のデータに適用されるものであることに注意してください。こうしたデータでは視覚化の難易度は高くなりますが、2 次元や 3 次元のデータとほとんど同じ方法で、クラスター内のデータの数学的分布を評価でき、検出されたグループ分けと外れ値を使用できます。

はじめに

このチュートリアルは、知識として機械学習について知りたいと思っている読者にも、実務に役立つ手法を学ぼうと目指す開発者にも有益なものになるように考慮してあります。自分で実際にコードを実行するとチュートリアルの内容をより深く理解できますが、時間がないという場合 (またはコーディングは得意ではないという場合) に備え、概念を把握できるよう十分なサンプル・コードを用意しておきました。チュートリアルに付属の Python で作成された Jupyter Notebook は、IBM Cloud 上で無料のトライアル・アカウントを使って、Watson Studio を使用して実行できます。

  1. 新しいアカウントを登録するか、既存のアカウントにログインします。

  2. 空のプロジェクトを作成します。

    • Create a project (プロジェクトを作成)」または「New project (新規プロジェクト)」をクリックします。
    • Create an empty project (空のプロジェクトを作成)」を選択します。
    • プロジェクトに名前を付けます。
    • Object Storage サービスの既存のインスタンスを選択するか、新しいインスタンスを作成します。
    • Create (作成)」をクリックします。
  3. ノートブックを追加します。

    • +Add to project (プロジェクトに追加)」をクリックします。
    • Notebook (ノートブック)」をクリックします。
    • From URL (URL から)」をクリックします。
    • Name (名前)」にノートブックの名前を入力します。
    • Select runtim (ランタイムを選択)」で、「Default Python 3.6 Free (デフォルト Python 3.6 無料版)」を選択します。
    • Notebook URL (ノートブックの URL)」として「https://raw.githubusercontent.com/IBM/ml-learning-path-assets/master/notebooks/clustering_with_scikit-learn.ipynb」と入力します。
    • Create Notebook (ノートブックを作成)」をクリックします。
  4. ノートブックを実行します。

    開いた状態のノートブックで、「Run (実行)」をクリックしてセルを 1 つずつ実行します。チュートリアルでは以降、ノートブックの順序に従って説明を進めます。

視覚化ツール

予測されたクラスターをデモンストレーションする際は、常にデータセットの特徴を 2 つか 3 つ描画し、クラスターを色分けして示します。グラフの大半では、matplotlib ライブラリーを使用し、seaborn データ視覚化ライブラリーでスタイルを設定しています。また、場合によっては Plotly によるインタラクティブなグラフも追加しています。Plotly のグラフは、グラフを回転させて別の角度から 3 次元クラスターを見る場合に特に役立ちます。

scikit-learn

さまざまなクラスタリング・アルゴリズムが実装された scikit-learn を使用して、アルゴリズム間の違いと、各アルゴリズムの利点、欠点を調べます。

データセット

scikit-learn には、クラスタリング・アルゴリズムの違いを明らかにする上で役立つデータセットが用意されています。必要に応じてこれらのデータセットを使用しますが、明らかな形状ではなく実際的なデータを使用してクラスタリングを視覚化するために、顧客データも使用します。

チュートリアルのサンプル・データを使用してノートブックを実行した後は、独自のデータを使用して学習したことをテストし、そのデータについて何を学習できるか確かめてください。

クラスタリング・アルゴリズムのカテゴリー

このチュートリアルで使用するアルゴリズムは、次の 3 つのカテゴリーに分類されます。

  • セントロイド (幾何中心) 準拠型クラスタリング
  • 密度準拠型クラスタリング
  • 階層型クラスタリング

チュートリアルに付属のノートブックでは、次のアルゴリズムを使用しています。

カテゴリー アルゴリズム 説明
セントロイド準拠型 k 平均法 事前に決められた数 (k) のクラスターの中心点を見つけて、中心からの距離に基づく k クラスターを作成します。
セントロイド準拠型 平均値シフト法 より高密度の領域を探してクラスターの中心を決定します。
密度準拠型 DBSCAN ノイズ (低密度領域内のデータ・ポイント) を外れ値として分離し、高密度領域内のデータをグループ化します。
階層型 凝集クラスタリング 出発点として各データ・ポイントをそれぞれ固有のクラスターとします。そこから目標に達するまで、最短距離のクラスターを結合していきます。

k 平均法クラスタリング

まずは、k 平均法クラスタリングから見ていきましょう。 多くの場合、k 平均法はクラスタリング・アルゴリズムの「Hello World」として使用されます。「k」はクラスター (またはクラスターの中心) の数を表します。k 平均法を使用するには、「k」を設定する必要があります。これが、k 平均法に伴う最大の欠点の 1 つです。もちろん、ループを作成してさまざまな k の設定値を評価し、最適なクラスターの数を判断することもできますが、そうする必要のない他のアルゴリズムに目が向くようになるでしょう。

最初の例では、scikit-learn の make_blobs() 関数によって生成されたデータセットを使用します。k=3 の場合に k 平均法で簡単に予測できる 3 つの別個の blob を作成しました。実際のところ、作成したのは 10 次元の超球ですが、k 平均法では次元がいくら増えてもまったく問題ありません。 3 次元の matplotlib (および seaborn) グラフで blob を示すときには、10 次元のうちの 3 つの次元を選択します。

以下のコードで k 平均法モデルをトレーニングし、データセットに対して予測処理を実行しました。グラフでは、予測されたクラスターを色分けして示しています。赤い X がクラスターの中心です。

kmeans_blobs.png

データに合わせて適切なクラスタリング・アルゴリズムを適用すれば、このように簡単にクラスターを予測することができます。ノートブックを実行するとしたら、遠慮なく k の値を変更してセルを再実行してください。k の値が 3 以外の場合に、blob がどのように分割または結合されるのかを確認できます。

k 平均法の仕組み

k 平均法ではまず、超空間内に k (3) 個のクラスター・セントロイドのシード値を割り当てます。ランダムにデータ・ポイントを割り当てることもできますが、scikit-learn のデフォルトではそれよりも少々賢い方法が採られています。ランダムな割り当てによって局所的最小値に集結するという罠にはまらないようにするために、ポイント間に一定の距離を設けるという方法です。scikit-learn の別のデフォルト (n_init=10) では、「不良なシード値」によって不幸な結果に終わらないよう、シード値を変えて 10 回予測処理を実行するようになっています。

次に、すべてのポイントとすべてのクラスター・セントロイドの間の距離を計算し、各ポイントを最短距離のセントロイドに割り当てます。すべてのポイントを割り当てた後、各クラスターに含まれるポイントの平均値を計算します。これらの平均値が、次のイテレーションでセントロイドとして使用されます。クラスター・セントロイドの大幅な移動が必要なくなるまで、この割り当てとセントロイド移動のプロセスが繰り返されます。

k 平均法クラスタリングの制限事項

前述のとおり、k 平均法では「k」(クラスターの数) を指定しなければなりません。blob の例で使用した 3 以外の数を設定するとしたら、blob を分割するか結合する必要があります。

2 つの目の大きな制限事項は、k 平均法ではポイントを球形 (超次元の場合は超球) に分離することです。これを説明するために、ノートブック内の次の例では scikit-learn の make_moons() 関数を使用して、2 つの三日月形、あるいはスマイルとしかめた眉のように見える 2 次元のデータセットを作成しています。

視覚的にはデータ・ポイントから 2 つの形状が作り出されることは明らかです。また、k=2 を設定すると、予測されるクラスターはスマイルとしかめた眉に分かれることもわかります。あいにく球形のクラスターでは、このように分離することはできません。

kmeans_moons.png

k 平均法による顧客クラスター

不自然さの少ない例を調べるために、顧客層の統計、アカウントのアクティビティー、株取引による利益に関するデータが含まれる顧客データセットの一部を使用しました。この例でも次元の数は 3 次元を超えていますが、グラフには視覚化に特に役立つ 3 つの次元を選択しています。以下の図に、k=3 を設定した場合の結果が示されています。この結果を使用して、他のアルゴリズムとの違いを明らかにします。コツを理解したら、独自のデータで試してください。

kmeans_customers.png

使用ケースによっては、このようなクラスターの形状が役立ちます。例えば、クラスタリングは多くの場合、画像認識の一環として用いられます。画像認識の目標は、形状を認識することだからです。一方、この顧客データの例ではクラスターの分離と密度を明らかにするのに形状が役立ちますが、真の目的は顧客の各グループを特定し、それらのグループをビジネス目的で使用することです。この例ではデータセットには含まれていないチャーン・リスクのラベルを使用して、トレーニングと予測を行いました。予測されたクラスターを既知のチャーン・リスクと比較して、チャーンを防ぐために注意を向けなければならないことが考えられる顧客のグループを見つけられるかどうかを確認します。顧客のグループ分けから、隠れた特徴または共通の特質を発見できたでしょうか?

kmeans_risk.png

この 3 つのクラスターは、低リスクの顧客を分離するのに大いに役立つことがわかります。高リスクのクラスターは役立ちそうに見えますが、中/高リスクのクラスターが役立つかどうかを判断するにはさらに情報が必要です。他のクラスタリング・アルゴリズムを試して違いを明らかにする際は、この外部評価結果を散布図と併せて使用します。

平均値シフト法

平均値シフト法もセントロイド準拠型アルゴリズムです。場合によっては、k 平均法にかなり似た挙動を見せることもありますが、決定的な違いもいくつかあります。具体的には、平均値シフト法には次の違いがあります。

  • クラスターの数を事前に決定する必要がない
  • 高密度領域でクラスターの中心を探す
  • 低密度領域をノイズまたは外れ値として扱う

平均値シフト法による顧客クラスター

平均値シフト法で予測された顧客クラスターを調べましょう。まず注目する点は、クラスターの数を指定しなくても、アルゴリズムがクラスターの数として 5 の値を選択したことです。クラスターの数を事前に決定しなくて済むことは、大きな利点です。平均値シフト法では、データを k 個のクラスターに割り当てるのではなく、データに合わせてクラスターの数が選択されます。

次に注目する点として、この例ではデフォルトの cluster_all=False 以外のパラメーター設定を使用しています。こうすることにより、アルゴリズムが低密度領域内のデータ・ポイントを取り、それらのポイントを孤立 (cluster -1) しているとしてラベルを付けることができます。グラフの左側と右側に緑色で示された低密度領域内のデータ・ポイントが、孤立したポイントです。このアニメーション化された matplotlib グラフを見ると、孤立データ・ポイントを分類すると残りのクラスターが明確になること、外れ値とみなされる可能性のあるデータ・ポイントを識別できることがわかります。

cluster_anomalies.gif

リスク・ラベルと比べても、これらのグループ分けが元の (k 平均法による) 3 つのグループよりも大幅に有用であるかどうかは明らかになりません。けれども、孤立したデータ・ポイントと左右の両端にあるミニ・クラスターが、より高密度にクラスタリングされた顧客と一致している可能性は小さいことはわかります。このように顧客を分離すると、グループ分けを明らかにできます。

mean_shift_risk.png

平均値シフト法による三日月形

平均値シフト法では少なくとも密度が考慮されるため、三日月のデータセットを k 平均法よりも上手く処理すると思うかもしれません。けれども実際のところ、2 つのクラスターが認識されるようになるまでに、パラメーターをかなりカスタマイズしなければなりませんでした。大幅にカスタマイズした後でも、スマイルとしかめた眉を分離するのにセントロイド準拠型の手法はあまり効果がないことがわかるはずです。cluster_all=False の設定では、孤立したデータ・ポイント部分がしっぽのように長く続くことに注目してください。

mean_shift_moons.png

幸い、こうした問題に対処するための密度準拠型のアルゴリズムがあります。

DBSCAN

DBSCAN は「Density-Based Spatial Clustering of Applications with Noise」を表します。このとおり長い名前ですが、ありがたいことに頭字語を使えます。この名前から明らかなように、DBSCAN は密度準拠型のアルゴリズムです。

DBSCAN による三日月

セントロイド準拠型アルゴリズムでは上手くいかなかったことを、DBSCAN ではどのように対処するかに注目しましょう。以下の図に、DBSCAN が分類したスマイルとしかめた眉を示します。さらにこの図には、外れ値としてラベルを付けられる、DBSCAN によって検出された 3 つのデータ・ポイントも示されています。

dbscan_moons.png

これこそが求めていた結果ですが、この結果に到達するまでに eps パラメーターをカスタマイズしなければならなかった点は重要です。DBSCAN は密度に基づいて自動的にクラスターを判断しますが、何を「高密度」とするかは eps を使用して指定する必要があります。

DBSCAN の仕組み

DBSCAN は、最も密に連結するデータ・ポイントの集合をクラスターとして定義することによって機能します。考慮されるパラメーターには eps (ε) と minimum_samples の 2 つがあります。εは、2 つの標本が近傍にあるとみなされる最大半径です。minimum samples は、クラスターとみなされる、ε近傍内での標本の最小数です。

データ・ポイントは、コア点、境界点、外れ値の 3 つに分類されます。コア点とは、自身を含め、ε近傍内に標本の最小数を持つデータ・ポイントを指します。コア点はクラスターの内部にあるデータ・ポイントです。境界点とは、ε近傍内の標本数が最小数に達しないものの、クラスターが到達可能なデータ・ポイントを指します。つまり、コア点の近傍にあるということです。外れ値 (別名、ノイズ点) とは、クラスターが到達できないデータ・ポイントを指します。

DBSCAN の利点

DBSCAN には次の利点があります。

  • クラスターの数を自動的に判断する
  • 外れ値 (ノイズ) を識別する
  • 球形クラスターに制約されない

DBSCAN を使用してノイズを除去した顧客クラスター

チュートリアルのノートブック内でも、DBSCAN を使用してノイズを除去し、顧客データセットから異なるクラスタリングを形成しています。

dbscan_customers.png

階層型クラスタリング

階層型クラスタリングでは 2 つの方向、つまり 2 つの手法を使用できます。1 つはボトムアップ、もう 1 つはトップダウンです。ボトムアップ手法では、最初に各ポイントを個々のクラスターとします。次に、最短距離にある 2 つのクラスターを結合して 2 つのポイントからなるクラスターを形成します。このプロセスが繰り返されて最短距離にあるクラスターが結合され、最終的にすべてのポイントを含む 1 つのクラスターになります。トップダウン手法はこのプロセスを逆にしたものに過ぎません。つまり、すべてのポイントを含む 1 つのクラスターを分割して、最終的には個々のポイントが各クラスターになります。

いずれの手法でも、階層型クラスタリングは n 個のデータ・ポイントに対して考えられるクラスターのツリーを生成します。ツリーが生成された後、いずれかのレベルを選んでクラスターを決定します。

凝集クラスタリング

チュートリアルのノートブック内では、scikit-learn の凝集クラスタリングの実装を使用しています。凝集クラスタリングは、ボトムアップ手法の階層型クラスタリング・アルゴリズムです。「正解」とするレベルを選択するには、n_clusters または distance_threshold パラメーターを使用します。n_clusters は使用したくなかったので (k 平均法で苦労させられたため)、distance_threshold を使用しましたが、適切だと思えるクラスターの数を判断するまで調整が必要になりました。パラメーターを微調整することで、結果にかなりの違いが出てくる場合があります。

凝集クラスタリングの興味深い点の 1 つは、最終的なクラスターのサイズがさまざまに異なることです。凝集クラスタリングを適用した顧客データのデモでは、形状とサイズが異なる 14 個のクラスターが形成されました。

ac_customers.png

凝集アルゴリズムも、低リスクの顧客を高リスクの顧客から分離するのに効果を発揮します。不必要に多いクラスターが現れますが、顧客のグループを明確に区別するという点では役立ちます。最もサイズが小さいクラスターはそれほど重要でないように見えても、他の顧客グループを明確化するのに役立ちます。

ac_risk.png

使用ケース

このセクションでは、教師なし学習の使用ケースをいくつか紹介します。

レコメンダー

顧客のクラスタリングによって、次の機能を持つレコメンダーを作成できます。

  • 顧客に喜ばれそうなクーポンを提供する
  • 顧客が好きそうな映画を推薦する
  • チャーンのリスクが高い顧客を識別する

隠れた特徴を明らかにする

クラスターを分析して特定の行動様式を見せることがわかったら、クラスターを使用して、データに別の属性または特徴があるかのようにラベルを付けることができます。サンプルのデータにはチャーン・リスクのラベルが付けられていますが、最適なアルゴリズムを選択して、すべての顧客に低リスク、高リスク、または中/高リスクのラベルを付けることができます。

別の好例としては、映画レコメンダーのクラスターを使用して該当する顧客に例えばロマンチック・コメディー・ファンとしてラベルを付けることもできます。

隠れた特徴という考え方は、グループの行動様式を理解してから、グループに属する各個人について推定を示す新しい属性を見つけることにあります。この属性は観測された属性ではなく、予測または推論された属性です。こうした属性でも同じように使用できますが (つまり、教師あり学習にフィードできます)、精度については見込むことしかできません。

ここで話題にしているのは、人にラベル付けすることではなく、データ・ポイントを分析することであり、例として使っているのがたまたま人に関するデータであったというだけです。それよりも良い例を紹介しましょう。

異常検知

外れ値を識別するメリットを指摘しようとしたのは、ノイズを除去するとクラスターを明確化するのに役立つからです。外れ値を使用する好例としては、異常検知が挙げられます。

デモで示したように、クラスタリングによって外れ値、つまり異常を識別できます。この戦略を使用すれば、次のような詳しく調査すべき異常な行動を識別することができます。

  • 通常とは異なる購入行動 (クレジット・カード詐欺)
  • 異常なネットワーク・トラフィック (サービス拒否攻撃)

コンピューター・ビジョン

クラスタリング・アルゴリズムは画像分割、オブジェクト追跡、画像分類に使用されています。クラスタリング・アルゴリズムを利用すれば、ピクセルの属性をデータ・ポイントとして使用して形状や質感を識別し、画像をコンピューター・ビジョンで認識可能なオブジェクトに変換できます。

まとめ

購入して損をした顧客は、利益を上げた顧客よりもチャーンの可能性が高くなるというのは、誰もがわかっていることです。一例として挙げたにすぎません。では、このチュートリアルでは実際に何を学んだのでしょうか?コードを試して、次の操作を実際に体験できたことを願います。

  • Watson Studio
  • Jupyter Notebook
  • Python
  • scikit-learn クラスタリング
  • scikit-learn データセット
  • Plotly 対話型グラフ
  • matplotlib と seaborn
  • アニメーション型 matplotlib
  • pandas DataFrames

さらに具体的に言えば、このチュートリアルではクラスタリングの 3 つの異なる手法を学びました。

  1. セントロイド準拠型クラスタリング
  2. 密度準拠型クラスタリング
  3. 階層型クラスタリング

このチュートリアルはラーニング・パス: 開発者向け機械学習の開発者向けのラーニング・パス「機械学習を始める」を構成する最後のコンテンツです。このラーニング・パスを通して、機械学習ならびに教師あり学習と教師なし学習について理解を深めていただけたはずです。