ציוני Silhouette
חלק מהיחידה למידה בלתי מונחית במסלול ה-Machine Learning של Coddy. שיעור 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, שבו הנקודות מרגישות הכי בבית.
אתגר
קלשני חזאי מזג אוויר חלוקים בדעתם לגבי מספר סוגי הסופות שפוגעות בחוף שלהם. הקוד ההתחלתי מכיל 150 סופות, את מהירות הרוח המרבית ואת כמות הגשם, וקולט תחילה את k של Ana ואז את k של Ben.
- חשבו את ציון הצללית של כל k, עד 3 ספרות אחרי הנקודה העשרונית.
- הדפיסו ה-k של מי מתאים יותר.
- הדפיסו את ה-k הטוב ביותר בין 2 ל-8, יחד עם הציון שלו.
עבור חוף אחר:
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)
# ארבעה סוגי סופות: רוח וגשם אופייניים, וכמה סופות מכל סוג
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 סופות בחוף אחד, שורה לכל סופה: מהירות הרוח המרבית (m/s) וכמות הגשם (mm לשעה)
storms = np.round(np.concatenate(parts), 1)
# מספרי סוגי הסופות של שני החזאים
k_ana = int(input())
k_ben = int(input())
# כתבו את הקוד שלכם למטה
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה למידה בלתי מונחית
תרגלו בעצמכם: קומפיילר Python אונליין