Menu
CoddyTech

シルエットスコア

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 8/51。

慣性は k とともに常に改善するため、エルボーが必要です。シルエットでは、各点に対してより公平な問いを立てます。自分のグループのほうが、次に近いグループよりも近いでしょうか?

黒い点から、自分のグループに属する8個の点へ実線が引かれており、平均の長さは a = 1.3 です。また、最も近い別のグループに属する8個の点へ破線が引かれており、平均の長さは b = 3.4 です。そのシルエット値は0.62です

各点のスコアは (b - a) / max(a, b) です。1に近いほどグループ内にしっかり収まり、0に近いほど境界上にあり、0未満なら誤ったグループに属しています。平均スコアでクラスタリングを評価します。

from sklearn.metrics import silhouette_score
for k in [2, 3, 4]:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(X)
    print(k, f"{silhouette_score(X, km.labels_):.3f}")

りんごの場合、次のように出力されます:

2 0.534
3 0.657
4 0.545

最適な k(ここでは 3)でピークに達し、そのとき各点が最も適切に分類されます。

challenge icon

チャレンジ

簡単

2人の予報士は、沿岸に襲来する嵐の種類の数について意見が一致していません。スターターコードには150個の嵐のピーク風速と降雨量が含まれており、Anaのk、次にBenのkを読み込みます。

  1. 各kをシルエットスコアで評価し、小数点以下3桁まで表示します。
  2. どちらのkの適合度が高いかを表示します。
  3. スコアとともに、2から8の範囲で最適なkを表示します。

別の沿岸の場合:

Ana, k = 2: 0.512
Ben, k = 3: 0.574
Ben's k fits better
Best from 2 to 8: k = 3 (0.574)

自分で試してみよう

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 以下の行は変更しないでください
rng = np.random.default_rng(6)
# 4種類の嵐:それぞれの典型的な風速と降雨量、および嵐の数
kinds = [(30, 8, 40), (12, 34, 35), (21, 21, 30), (11, 9, 45)]
parts = []
for w, r, n in kinds:
    parts.append(np.column_stack([rng.normal(w, 2.5, n), rng.normal(r, 3, n)]))
# ある沿岸で発生した150件の嵐。各行に1件ずつ、最大風速 (m/s) と時間雨量 (mm per hour) を記録
storms = np.round(np.concatenate(parts), 1)

# 2人の予報士が考える嵐の種類の数
k_ana = int(input())
k_ben = int(input())

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ