階層クラスタリングのクラスタラベル

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

階層クラスタリングのクラスタラベル

  • 可視化のためだけのツールではない
  • 途中段階でもクラスターラベルを復元できる
  • その後のクロス集計などに活用できる

Eurovision 階層型クラスタリング

Pythonで学ぶ教師なし学習

デンドログラムの途中段階クラスタリングと高さ

  • 例:高さ15の場合:
    • ブルガリア、キプロス、ギリシャは1つのクラスター
    • ロシアとモルドバが別のクラスター
    • アルメニアは単独のクラスター

高さ15の水平線付きズームインしたクラスタ

Pythonで学ぶ教師なし学習

デンドログラムはクラスタ間の距離を示す

  • デンドログラムの高さ = 統合されるクラスター間の距離
  • 例:キプロスとギリシャのクラスタの距離:およそ6

キプロスとギリシャのクラスターが強調された拡大図

Pythonで学ぶ教師なし学習

デンドログラムはクラスタ間の距離を示す

  • デンドログラムの高さ = 統合されるクラスター間の距離
  • 例:キプロスとギリシャのクラスタの距離:およそ6
  • このクラスターが、ブルガリアとおよそ12離れている

キプロス/ギリシャ クラスターとキプロス/ギリシャ/ブルガリア クラスターがハイライトされたクラスターの拡大図

Pythonで学ぶ教師なし学習

デンドログラムの途中段階クラスタリングと高さ

  • デンドログラムの高さの指定は、統合されるクラスタ間の最大距離
  • これ以上離れたクラスタは統合しない(例:15)

高さ15の水平線が引かれたクラスターの拡大図

Pythonで学ぶ教師なし学習

クラスタ間の距離

  • 「連結法」で定義
  • 「完全」連結法では、クラスタ間の距離を、そのクラスタ内のサンプル間の最大距離とする
  • メソッドパラメータで指定(例:linkage(samples, method="complete"){{3}})
  • 連結法が変われば、階層的クラスタリングも変わる
Pythonで学ぶ教師なし学習

クラスタラベルの抽出

  • fcluster()関数を使う
  • クラスターラベルのNumPy配列を返す

高さ15の水平線付き拡大されたクラスター図

Pythonで学ぶ教師なし学習

fclusterを使ったクラスタラベルの抽出

from scipy.cluster.hierarchy import linkage
mergings = linkage(samples, method='complete')
from scipy.cluster.hierarchy import fcluster

labels = fcluster(mergings, 15, criterion='distance') print(labels)
[ 9  8 11 20  2  1 17 14 ... ]
Pythonで学ぶ教師なし学習

クラスタラベルと国名を対応させる

文字列リストcountry_namesがある場合:

import pandas as pd
pairs = pd.DataFrame({'labels': labels, 'countries': country_names})
print(pairs.sort_values('labels'))
               countries  labels
5                Belarus       1
40               Ukraine       1
...
36                 Spain       5
8               Bulgaria       6
19                Greece       6
10                Cyprus       6
28               Moldova       7
...
Pythonで学ぶ教師なし学習

練習しましょう!

Pythonで学ぶ教師なし学習

Preparing Video For Download...