3秒でわかる
正解ラベルを与えず、データそのものに潜む構造を機械に見つけさせる学習方法。分類の答えが決まっていない場面で、傾向やまとまりを洗い出すために使います。
30秒図解
もう少し詳しく
どういうものか
教師なし学習は、入力データだけを渡し、正解にあたるラベルを与えずに学習させる枠組みです。何を当てるかが決まっていないので、目的は「データの構造を明らかにすること」になります。代表的な手法として、似たもの同士をまとめるクラスタリング、情報をできるだけ保ったまま項目数を減らす次元削減、他と大きく外れた点を見つける異常検知があります。
なぜ必要か
現実のデータには、ほとんどラベルが付いていません。1 万件の問い合わせ本文に「これは料金の質問」「これは不具合報告」と人手で印を付けるには膨大な時間がかかります。教師なし学習は、まずデータをまとまりに分けてから代表例だけを人が見る、という進め方を可能にします。
異常検知も同様です。不正利用の例は数が少なく種類も毎回違うため、事前に正解を集めきれません。「普段と違う」を基準にすれば、見たことのない手口にも反応できます。
具体例
from sklearn.cluster import KMeans
import numpy as np
# 会員ごとの [来店回数, 平均購入額]
X = np.array([
[1, 800], [2, 950], [1, 700],
[12, 3200], [15, 2900], [11, 3500],
[30, 900], [28, 1100], [33, 850],
])
model = KMeans(n_clusters=3, n_init=10, random_state=0)
labels = model.fit_predict(X)
print(labels) # [0 0 0 1 1 1 2 2 2] のように分かれる
print(model.cluster_centers_)出てきた 0 と 1 と 2 に意味はありません。中心の値を見て「たまに来る層」「高単価の常連」「頻繁に来る少額層」と人が名前を付けます。
つまずきやすいところ
尺度を揃えずに距離を計算するのが定番の失敗です。上の例でも、購入額は数百から数千、来店回数は 1 から 33 と桁が違うため、そのままでは購入額だけで結果が決まります。標準化してから渡します。
もう 1 つは、分ける数を根拠なく決めることです。k-means は 3 と指定すれば必ず 3 つに割ります。意味のあるまとまりが 2 つしかなくても 3 つに割れてしまうため、エルボー法やシルエット係数で妥当性を確かめます。
似た用語との違い
| 枠組み | 与えるもの | 出てくるもの |
|---|---|---|
| 教師あり学習 | 入力と正解 | 未知の入力への予測値 |
| 教師なし学習 | 入力のみ | まとまりや圧縮された表現 |
| 強化学習 | 行動への報酬 | 報酬を高める方策 |
覚え方
答え合わせができないので、正しさではなく「使えるまとまりか」を人が判断します。ここが教師あり学習との最大の違いです。