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

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

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

  • 可視化だけではない!
  • 任意の中間段階のクラスタラベルを取得可能
  • 例:クロス集計で活用

ユーロビジョンの階層クラスタリング

Pythonで学ぶ教師なし学習

中間クラスタリングと樹形図の高さ

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

高さ15に水平線がある拡大クラスタ

Pythonで学ぶ教師なし学習

樹形図はクラスタ間距離を示す

  • 樹形図の高さ=結合するクラスタ間の距離
  • 例:キプロスとギリシャのみのクラスタの距離は約6

キプロス/ギリシャのクラスタをハイライトした拡大図

Pythonで学ぶ教師なし学習

樹形図はクラスタ間距離を示す

  • 樹形図の高さ=結合するクラスタ間の距離
  • 例:キプロスとギリシャのみのクラスタの距離は約6
  • 新クラスタは、ブルガリアのみのクラスタから約12離れる

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

Pythonで学ぶ教師なし学習

中間クラスタリングと樹形図の高さ

  • 樹形図の高さは、結合するクラスタ間の最大距離を示す
  • これ以上離れたクラスタは結合しない(例:15)

高さ15に水平線がある拡大クラスタ

Pythonで学ぶ教師なし学習

クラスタ間距離

  • 「リンケージ法」で定義
  • 「complete」リンケージ:クラスタ間距離=両クラスタ内サンプル間の最大距離
  • method引数で指定(例:linkage(samples, method="complete"))
  • リンケージ法が違えば、階層クラスタリングも変わる!
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...