本文へスキップ
ひもとくAI

クラスタリング:正解なしで、似たもの同士をまとめる

レッスン 6/7

クラスタリング:正解なしで、似たもの同士をまとめる

教師なし学習

これまでの分類では、訓練データに「正解」(この画像は数字の8、このワインは品種A、など)が付いていました。正解付きのデータから学ぶ方法を 教師あり学習 と呼びます(第1章)。

一方、正解が付いていないデータから、データの構造を見つけ出す方法を 教師なし学習 と呼びます。前のレッスンの主成分分析も、教師なし学習でした。このレッスンの クラスタリング は、似たデータ同士を自動でグループ(クラスタ)にまとめる、教師なし学習です。

  • 買い物の記録から、似た買い方をするお客さんのグループを見つける
  • たくさんの文章を、似た話題ごとにまとめる

といった場面で使われます。正解がないので、「どのグループが正しいか」は、人が結果を見て解釈します。

k-means:中心を決めて、近い点を集める

代表的なクラスタリングの方法が k-means(k平均法)です。クラスタの数 kk を先に決めて、次の手順を繰り返します。

  1. はじめに: kk 個の「中心」を、データの中からでたらめに選ぶ
  2. 割り当て: それぞれの点を、一番近い中心のクラスタに入れる(距離はレッスン1のユークリッド距離)
  3. 中心の更新: クラスタごとに、入っている点の平均の位置を、新しい中心にする
  4. 割り当てが変わらなくなるまで、2と3を繰り返す
特徴量1特徴量20246802468
  • クラスタ1
  • クラスタ2
  • クラスタ3
  • クラスタの中心
正解の付いていない45個の点を、k-means で3つのクラスタに分けた結果。左下のクラスタ1(○、中心は2.04と1.74)、右下のクラスタ2(■、中心は6.82と2.58)、上のクラスタ3(△、中心は3.75と7.47)。★は各クラスタの中心で、それぞれの点の集まりの真ん中にある

この45個の点には正解を付けていませんが、k-means は、目で見ても分かる3つのまとまりを見つけました(★が、最後の中心)。はじめの中心をでたらめに選んで6回試すと、どれも3〜4回の繰り返しで割り当てが変わらなくなり、同じ結果になりました。

k-means は、「各点と、そのクラスタの中心との距離の2乗」の合計(クラスタ内の誤差の2乗和)を小さくしていく方法です。2の割り当ても3の中心の更新も、この合計を小さくする(大きくはしない)ので、必ずどこかで止まります。ただし、はじめの中心の選び方によっては、一番よい分け方ではないところで止まることがあります。scikit-learn では、はじめの中心を互いに離れた点から選ぶ工夫(k-means++)をしたうえで、何回かやり直して一番よい結果を使います。

クラスタの数の選び方と、k-means の限界

エルボー法:誤差の減り方が急にゆるやかになるところ

クラスタの数 kk を増やすと、中心が増えて各点が中心に近くなるので、クラスタ内の誤差の2乗和は必ず小さくなります(kk をデータの数と同じにすれば0)。そのため、「誤差が一番小さい kk」では選べません。

代わりに、kk を1つ増やしたときの 減り方 を見ます。前のスライドの45個の点で測りました。

クラスタの数 k誤差の2乗和1234560200400600
クラスタの数 k(横軸、1〜6)と、クラスタ内の誤差の2乗和(縦軸)。k=1で541.6、k=2で254.5、k=3で77.6(○)と急に下がり、その後は k=4で61.3、k=6で42.0と、ゆるやかにしか下がらない。k=3のところで、折れ線がひじのように曲がっている

k=3k = 3 までは大きく下がり、その先はゆるやかです。グラフが「ひじ(エルボー)」のように曲がるところを選ぶ方法を エルボー法 と呼びます。ただし、実際のデータでは、はっきり曲がらないことも多く(ワインのデータでは2314、1659、1278、1181、1110と、なだらかに下がる)、最後は「その分け方が、目的に役立つか」で決めます。

実験:ワインを、正解を使わずに3つに分ける

レッスン1のワインのデータ(178本)を、正解(品種)を使わずに、k-means で3つのクラスタに分けました。その後で、各クラスタにどの品種のワインが入ったかを数えました。

品種0品種1品種2
クラスタA5930
クラスタB0650
クラスタC0348

(標準化してから分けた場合)

正解を一度も見ていないのに、178本中172本が、品種ごとにきれいにまとまりました。成分の似たワインが、同じ品種だったのです。一方、標準化せずに 分けると、品種0は46本と13本に、品種2は19本と29本に分かれてしまいました。k-means も距離を使うので、距離がほとんど値の大きいプロリンだけで決まってしまうためです。

k-means が苦手なデータ

k-means は、各点を「一番近い中心」に割り当てるので、クラスタが 中心のまわりに丸くまとまっている ことを前提にしています。レッスン2と同じような同心円のデータ(200点)を2つに分けると、内側と外側には分かれず、どちらのクラスタにも内側と外側の点が混ざってしまい、正解と一致したのは約半分(0.51)でした。形が複雑なデータには、点のつながり方(密度)で分ける方法(DBSCAN など)が使われます。

階層的クラスタリング

k-means のようにクラスタの数を先に決めず、「一番近い2つのクラスタをまとめる」ことを、全部が1つになるまで繰り返す方法もあります。これを 階層的クラスタリング と呼びます。まとめていく順番を木の形の図(デンドログラム)に描き、好きな高さで切ると、その数のクラスタが得られます。データが多いと計算が重くなります。

半教師あり学習

正解を付けるには手間がかかるので、「少しのデータにだけ正解があり、大部分には正解がない」ことがよくあります。この両方を使って学習する方法を 半教師あり学習 と呼びます。例えば、正解のあるデータで作ったモデルで、正解のないデータを予測し、自信の高いものを正解として加えて学習し直す(自己学習)方法があります。

Pythonで k-means を使う、よくある誤解と振り返り

from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

X = StandardScaler().fit_transform(load_wine().data)   # 正解(target)は使わない

km = KMeans(n_clusters=3, n_init=10, random_state=0)
labels = km.fit_predict(X)          # 各ワインが入ったクラスタの番号(0, 1, 2)
print(km.cluster_centers_.shape)    # → (3, 13)(3つの中心、それぞれ13個の成分)
print(km.inertia_)                  # クラスタ内の誤差の2乗和 → 1277.9…
  • n_clusters がクラスタの数 kk、n_init は、はじめの中心を変えてやり直す回数です
  • クラスタの番号(0, 1, 2)には意味がありません。実行し直すと、同じまとまりに別の番号が付くこともあります。正解の「品種0」とクラスタの「0」は、別のものです
  • fit_predict には、正解 y を渡しません(教師なし学習)

よくある誤解

  • 「k-means は、正しいクラスタの数を自動で見つけてくれる」: kk は人が決めます。エルボー法などを参考に、目的に合う数を選びます
  • 「クラスタリングの結果は、データの中の『正しい』グループ」: 使う特徴量や標準化の有無で、結果は大きく変わります(ワインの例)。結果の意味は、人が解釈して確かめます
  • 「クラスタの番号0は、正解のクラス0にあたる」: 番号はでたらめに付けられるので、対応はありません

振り返り

  • 正解のないデータから構造を見つけるのが教師なし学習。クラスタリングは、似たデータ同士をクラスタにまとめる
  • k-means は、「一番近い中心に割り当てる」と「中心を平均の位置に動かす」を繰り返す。距離を使うので、標準化が大切
  • クラスタの数はエルボー法などで選ぶ。丸くまとまっていないクラスタは苦手
  • 半教師あり学習は、少しの正解付きデータと、多くの正解なしデータを組み合わせて学ぶ

演習

演習を読み込んでいます…