シルエットスコア
CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 8/51。
慣性は k とともに常に改善するため、エルボーが必要です。シルエットでは、各点に対してより公平な問いを立てます。自分のグループのほうが、次に近いグループよりも近いでしょうか?
各点のスコアは (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)でピークに達し、そのとき各点が最も適切に分類されます。
チャレンジ
簡単2人の予報士は、沿岸に襲来する嵐の種類の数について意見が一致していません。スターターコードには150個の嵐のピーク風速と降雨量が含まれており、Anaのk、次にBenのkを読み込みます。
- 各kをシルエットスコアで評価し、小数点以下3桁まで表示します。
- どちらのkの適合度が高いかを表示します。
- スコアとともに、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())
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ