クラスタに名前を付けよう
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 46/51。
クラスタには名前ではなく番号が付いています。ここでラベルを使えます。クロス集計表は、各クラスタにどの数字が入ったかを数えます。たとえば、3つのクラスタにおける1、7、9の数は次のとおりです。
各クラスタに、そのクラスタで最も多く見られる数字の名前を付けます。その数字として正しく分類された件数を数えます:
ct = pd.crosstab(km.labels_, y)
names = ct.idxmax(axis=1) # 各行で値が最も大きい列
right = ct.max(axis=1).sum()
print(names.tolist(), right)これは [9, 7, 1] 496 を出力します。541 回のスキャンのうち496 回は、単一のラベルなしで見つかったグループによって right と名付けられています。
チャレンジ
中級10 個のクラスタに名前を付けましょう。スターターには、ラベルなしで学習させた km が用意されています。ここからは y の数字を使えます。
- クラスタと
yのクロス集計表を作成し、各クラスタで最も多い数字にちなんで名前を付けます。 - 名前の順に、各クラスタで正しく名前が付いたスキャン数、クラスタのサイズ、正しく名前が付いたスキャンの割合を整数のパーセントで出力します。
- 全体で正しく名前が付いたスキャン数を、パーセントは小数第1位まで表示して出力します。
5 個のクラスタの場合:
Cluster named 0: 175 of 177 scans (99%)
Cluster named 2: 160 of 367 scans (44%)
Cluster named 3: 168 of 531 scans (32%)
Cluster named 6: 179 of 359 scans (50%)
Cluster named 7: 176 of 363 scans (48%)
Named right without labels: 858 of 1797 scans (47.7%)あなたのクラスタのうち、最も精度が低いのはどれですか?その中には何が隠れていますか?
自分で試してみよう
import pandas as pd
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
# 「Look at the Digits」より:64ピクセルのスキャンが1,797件、インクの値は0から16
digits = load_digits()
X = digits.data
y = digits.target
# 「Shrink with PCA」より:分散の80%をスキャンあたり13個の数値で表現
pca = PCA(n_components=0.8)
X_small = pca.fit_transform(X)
# 「Cluster the Digits」より:ラベルを使わずに見つけた10個のクラスタ
km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ