29 KiB
מבוא לאשכולות
אשכול הוא סוג של למידה לא מפוקחת שמניח כי מערך הנתונים אינו מתויג או שהקלטים שלו אינם מותאמים עם פלטים שהוגדרו מראש. הוא משתמש באלגוריתמים שונים כדי למיין נתונים לא מתויגים ולספק קבוצות על פי דפוסים שהוא מזהה בנתונים.
🎥 לחצו על התמונה למעלה לצפייה בווידאו. בזמן שאתם לומדים למידת מכונה עם אשכולות, תהנו מקצת רצועות דאנס הול ניגריות - זו שיר מדורג גבוה משנת 2014 של PSquare.
מבחן טרום-הרצאה
מבוא
אשכולות מאוד שימושיים לחקר נתונים. בואו נראה אם הם יכולים לעזור לגלות מגמות ודפוסים בדרך שבה קהל ניגרי צורך מוזיקה.
✅ קחו דקה לחשוב על השימושים באשכולות. בחיים האמיתיים, אשכולות מתבצעים כשיש לכם ערימת כביסה וצריך למיין את הבגדים של בני המשפחה 🧦👕👖🩲. במדעי הנתונים, אשכולות מתבצעים כשמנסים לנתח העדפות של משתמש או לקבוע את מאפייני מערך נתונים לא מתויג. אשכולות, באופן מסוים, עוזרים להבין את הכאוס, כמו מגירת גרביים.
🎥 לחצו על התמונה למעלה לווידאו: ג'ון גאוטג מאית' מציג אשכולות
בסביבה מקצועית, ניתן להשתמש באשכולות כדי לקבוע דברים כמו סגמנטציה בשוק, לקבוע אילו קבוצות גיל קונות אילו פריטים, למשל. שימוש נוסף הוא גילוי חריגות, אולי כדי לזהות הונאה מתוך מערך נתוני עסקאות בכרטיס אשראי. או שאפשר להשתמש באשכולות כדי לזהות גידולים באוסף סריקות רפואיות.
✅ חשבו דקה איך אולי פגשתם אשכולות 'בטבע', בסביבת בנקאות, מסחר אלקטרוני או עסקים.
🎓 מעניין, ניתוח אשכולות נוצר בתחומי האנתרופולוגיה והפסיכולוגיה בשנות ה-30 של המאה הקודמת. האם תוכלו לדמיין איך השתמשו בזה?
בנוסף, ניתן להשתמש באשכולות כדי לקבץ תוצאות חיפוש - לפי קישורי קניות, תמונות או ביקורות לדוגמה. אשכולות שימושיים כשיש לכם מערך נתונים גדול שאתם רוצים להקטין ועליו לבצע ניתוח מפורט יותר, לכן השיטה יכולה לשמש ללמידה על נתונים לפני שנבנים מודלים אחרים.
✅ לאחר שמארגנים את הנתונים לאשכולות, מקצים להם מזהה אשכול, וטכניקה זו יכולה להיות שימושית לשמירת פרטיות מערך הנתונים; ניתן להתייחס לנקודת נתונים לפי מזהה האשכול במקום לפי נתונים מזהים מפורטים יותר. תוכלו לחשוב על סיבות נוספות בגללן אפשר להתייחס למזהה אשכול במקום לאלמנטים אחרים באשכול כדי לזהותו?
העמיקו את ההבנה שלכם בטכניקות אשכולות במודול Learn module
התחלת עבודה עם אשכולות
Scikit-learn מציע מערך רחב של שיטות לבצע אשכולות. סוג השיטה שתבחרו תלוי במקרי השימוש שלכם. לפי התיעוד, לכל שיטה יש יתרונות שונים. להלן טבלה מפושטת של השיטות הנתמכות על ידי Scikit-learn ומקרי השימוש המתאימים להן:
| שם שיטה | מקרה שימוש |
|---|---|
| K-Means | מטרה כללית, אינדוקטיבית |
| הפצת אפיניות (Affinity propagation) | אשכולות רבים ובלתי שווים, אינדוקטיבית |
| Mean-shift | אשכולות רבים ובלתי שווים, אינדוקטיבית |
| אשכולות ספקטרלי (Spectral clustering) | אשכולות מעטים ואחידים, טראנסדוקטיבית |
| אשכול היררכי מסוג Ward | אשכולות רבים עם מגבלות, טראנסדוקטיבית |
| אשכול אגרגטיבי (Agglomerative clustering) | אשכולות רבים, מוגבלים, מרחקים לא אוקלידיים, טראנסדוקטיבית |
| DBSCAN | גאומטריה לא שטוחה, אשכולות בלתי שווים, טראנסדוקטיבית |
| OPTICS | גאומטריה לא שטוחה, אשכולות בלתי שווים בצפיפויות משתנות, טראנסדוקטיבית |
| תערובות גאוסיות (Gaussian mixtures) | גאומטריה שטוחה, אינדוקטיבית |
| BIRCH | מערך נתונים גדול עם חריגות, אינדוקטיבי |
🎓 איך אנו יוצרים אשכולות קשור מאוד לאופן בו אנו אוספים את נקודות הנתונים לקבוצות. בואו נפרק קצת אוצר מילים:
🎓 'טראנסדוקטיבי' מול 'אינדוקטיבי'
הסקת מסקנות טראנסדוקטיבית נגזרת ממקרים שנצפו באימון אשר ממופים למקרים ספציפיים במבחן. הסקת מסקנות אינדוקטיבית נגזרת ממקרים של אימון הממופים לחוקים כלליים, שאז בלבד מיושמים על מקרים במבחן.
דוגמה: דמיינו שיש לכם מערך נתונים שהוא מתויג חלקית. כמה דברים הם 'תקליטים', כמה 'תקליטורים', וכמה ריקים. תפקידכם לספק תוויות לריקים. אם תבחרו בגישה אינדוקטיבית, תאמנו מודל שיחפש 'תקליטים' ו'תקליטורים' ויחיל את התוויות הללו על הנתונים ללא תוויות. גישה זו תתקשה לסווג דברים שהם למעשה 'קסטות'. לעומת זאת, גישה טראנסדוקטיבית מטפלת בנתונים הלא ידועים בצורה יעילה יותר כשמטרתה לקבץ פריטים דומים ביחד ואז להחיל תווית על קבוצה. במקרה זה, האשכולות עשויים לשקף 'דברים מוזיקליים עגולים' ו'דברים מוזיקליים מרובעים'.
🎓 'גאומטריה לא שטוחה' מול 'שטוחה'
מושגים מתמטיים, גאומטריה לא שטוחה מול שטוחה מתייחסת למדידת מרחקים בין נקודות בשיטות גאומטריות 'שטוחות' (אוקלידיות) או 'לא שטוחות' (לא אוקלידיות).
'שטוחה' בהקשר זה מתייחסת לגאומטריה אוקלידית (חלקים ממנה נלמדים כגאומטריית מישור), ו'לא שטוחה' מתייחסת לגאומטריה לא אוקלידית. מה הקשר בין גאומטריה ללמידת מכונה? בתחומים שהם שורשיים במתמטיקה, יש צורך במידה משותפת למדידת מרחקים בין נקודות באשכולות, וזה יכול להתבצע בצורה 'שטוחה' או 'לא שטוחה', בהתאם לטבע הנתונים. מרחקים אוקלידיים נמדדים כאורך קטע קו בין שתי נקודות. מרחקים לא אוקלידיים נמדדים לאורך עקומה. אם הנתונים שלכם, כפי שמוצגים, נראים כאילו אינם נמצאים במישור, ייתכן שתצטרכו להשתמש באלגוריתם מיוחד כדי לטפל בהם.
אינפוגרפיקה מאת דאסאני מדייפאלי
🎓 'מרחקים'
אשכולות מוגדרים על ידי מטריצת המרחקים שלהם, לדוגמה המרחקים בין נקודות. מרחק זה יכול להימדד בדרכים שונות. אשכולות אוקלידיים מוגדרים על פי הממוצע של ערכי הנקודות, ומכילים 'צנטרואיד' או נקודת מרכז. המרחקים נמדדים אפוא לפי המרחק לצנטרואיד זה. מרחקים לא אוקלידיים מתייחסים ל'קלוסטרואידים', הנקודה הקרובה ביותר לנקודות אחרות. קלוסטרואידים מוגדרים במספר דרכים שונות.
🎓 'מוגבל'
אשכולות מוגבלים מכניסים למידה 'חצי מפוקחת' לשיטה הבלתי מפוקחת הזו. היחסים בין נקודות מסומנים כ'אי-קישור' או 'חייב-קישור', כך שחלק מהחוקים מוחלים על מערך הנתונים.
דוגמה: אם אלגוריתם ישוחרר על אוסף נתונים ללא תוויות או חצי מתויג, האשכולות שהוא מייצר עשויים להיות באיכות נמוכה. בדוגמה שלמעלה, האשכולות עשויים לקבץ 'דברים מוזיקליים עגולים', 'דברים מוזיקליים מרובעים', 'דברים משולשים' ו'עוגיות'. אם ניתן לו מגבלות או חוקים לעקוב אחריהם ("הפריט חייב להיות מפלסטיק", "הפריט צריך להיות מסוגל להפיק מוזיקה") זה יכול לעזור 'להגביל' את האלגוריתם לבחור טוב יותר.
🎓 'צפיפות'
נתונים שהם 'רועשים' נחשבים כ'צפופים'. המרחקים בין הנקודות בכל אשכול עומדים למבחן כיותר או פחות צפופים, או 'צפופים' ולכן יש לנתח את הנתונים האלו עם שיטת אשכולות מתאימה. מאמר זה מדגים את ההבדל בין שימוש באשכול K-Means לעומת אלגוריתמי HDBSCAN לחקר מערך רועש עם צפיפות אשכולות משתנה.
אלגוריתמים של אשכולות
ישנם מעל 100 אלגוריתמים לאשכולות, והשימוש בהם תלוי בטבע הנתונים. בואו נדון בכמה מהעיקריים:
-
אשכול היררכי. אם אובייקט מסווג על ידי קרבתו לאובייקט סמוך יותר, ולא לאחד רחוק יותר, נוצרים אשכולות על בסיס המרחק בין חבריו לאובייקטים אחרים. אשכול אגרגטיבי של Scikit-learn הוא היררכי.
אינפוגרפיקה מאת דאסאני מדייפאלי
-
אשכול צנטרואיד. אלגוריתם פופולרי זה מחייב לבחור 'k', או מספר האשכולות שצריך ליצור, לאחר מכן האלגוריתם קובע את נקודת המרכז של אשכול ואוסף סביבו נתונים. אשכול K-means הוא גרסה פופולרית של אשכולות צנטרואיד. המרכז נקבע לפי הממוצע הקרוב ביותר, ולכן השם. מרחק מרובע מהאשכול מוקטן.
אינפוגרפיקה מאת דאסאני מדייפאלי
-
אשכול מבוסס התפלגות. מבוסס על מודלים סטטיסטיים, אשכול מבוסס התפלגות מתמקד בקביעת ההסתברות שנקודת נתונים שייכת לאשכול, ומקצה אותה בהתאם. שיטות תערובת גאוס שייכות לסוג זה.
-
אשכול מבוסס צפיפות. נקודות נתונים מוקצות לאשכולות על פי צפיפותן, או סידורן סביב זו. נקודות נתונים רחוקות מהקבוצה נחשבות לחריגות או לרעש. DBSCAN, Mean-shift ו-OPTICS שייכים לסוג אשכולות זה.
-
אשכול רשתית. למערכי נתונים רב-ממדיים, נוצרת רשת והנתונים מתחלקים בין התאים ברשת, ובכך נוצרים אשכולות.
תרגיל - אשכולו את הנתונים שלך
אשכולות כטכניקה מקבלים עזרה רבה מהדמיה מתאימה, אז בואו נתחיל עם הדמיית נתוני המוזיקה שלנו. תרגיל זה יעזור לנו להחליט איזו מהשיטות של אשכולות נשתמש בצורה היעילה ביותר לטבע נתונים זה.
-
פתחו את הקובץ notebook.ipynb בתיקייה זו.
-
ייבאו את חבילת
Seabornלהדמיית נתונים טובה.!pip install seaborn -
הוסיפו את נתוני השירים מתוך nigerian-songs.csv. טענו מסגרת נתונים עם מידע על השירים. התכוננו לחקור נתונים אלו על ידי ייבוא ספריות והצגת הנתונים:
import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("../data/nigerian-songs.csv") df.head()בדקו את שורות הנתונים הראשונות:
name album artist artist_top_genre release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature 0 Sparky Mandy & The Jungle Cruel Santino alternative r&b 2019 144000 48 0.666 0.851 0.42 0.534 0.11 -6.699 0.0829 133.015 5 1 shuga rush EVERYTHING YOU HEARD IS TRUE Odunsi (The Engine) afropop 2020 89488 30 0.71 0.0822 0.683 0.000169 0.101 -5.64 0.36 129.993 3 2 LITT! LITT! AYLØ אינדי ר&ב 2018 207758 40 0.836 0.272 0.564 0.000537 0.11 -7.127 0.0424 130.005 4 3 Confident / Feeling Cool Enjoy Your Life Lady Donli פופ ניגרי 2019 175135 14 0.894 0.798 0.611 0.000187 0.0964 -4.961 0.113 111.087 4 4 wanted you rare. Odunsi (The Engine) אפרופופ 2018 152049 25 0.702 0.116 0.833 0.91 0.348 -6.044 0.0447 105.115 4 -
קבל מידע על מסגרת הנתונים, קורא ל-
info():df.info()הפלט נראה כך:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 530 entries, 0 to 529 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 530 non-null object 1 album 530 non-null object 2 artist 530 non-null object 3 artist_top_genre 530 non-null object 4 release_date 530 non-null int64 5 length 530 non-null int64 6 popularity 530 non-null int64 7 danceability 530 non-null float64 8 acousticness 530 non-null float64 9 energy 530 non-null float64 10 instrumentalness 530 non-null float64 11 liveness 530 non-null float64 12 loudness 530 non-null float64 13 speechiness 530 non-null float64 14 tempo 530 non-null float64 15 time_signature 530 non-null int64 dtypes: float64(8), int64(4), object(4) memory usage: 66.4+ KB -
בדוק שוב ערכים חסרים, על ידי קריאה ל-
isnull()ואימות שסכומם הוא 0:df.isnull().sum()נראה טוב:
name 0 album 0 artist 0 artist_top_genre 0 release_date 0 length 0 popularity 0 danceability 0 acousticness 0 energy 0 instrumentalness 0 liveness 0 loudness 0 speechiness 0 tempo 0 time_signature 0 dtype: int64 -
תאר את הנתונים:
df.describe()release_date length popularity danceability acousticness energy instrumentalness liveness loudness speechiness tempo time_signature count 530 530 530 530 530 530 530 530 530 530 530 530 mean 2015.390566 222298.1698 17.507547 0.741619 0.265412 0.760623 0.016305 0.147308 -4.953011 0.130748 116.487864 3.986792 std 3.131688 39696.82226 18.992212 0.117522 0.208342 0.148533 0.090321 0.123588 2.464186 0.092939 23.518601 0.333701 min 1998 89488 0 0.255 0.000665 0.111 0 0.0283 -19.362 0.0278 61.695 3 25% 2014 199305 0 0.681 0.089525 0.669 0 0.07565 -6.29875 0.0591 102.96125 4 50% 2016 218509 13 0.761 0.2205 0.7845 0.000004 0.1035 -4.5585 0.09795 112.7145 4 75% 2017 242098.5 31 0.8295 0.403 0.87575 0.000234 0.164 -3.331 0.177 125.03925 4 max 2020 511738 73 0.966 0.954 0.995 0.91 0.811 0.582 0.514 206.007 5
🤔 אם אנו עובדים עם אשכולות, שיטה לא מפוקחת שאינה דורשת נתונים מתויגים, מדוע אנו מציגים את הנתונים עם תוויות? בשלב חקר הנתונים, הן מועילות, אך אינן הכרחיות לאלגוריתמי האשכולות לפעול. ניתן פשוט להסיר את כותרות העמודות ולהתייחס לנתונים לפי מספר עמודה.
הסתכלו על הערכים הכלליים של הנתונים. שימו לב ש-popularity יכול להיות '0', מה שמראה שירים ללא דירוג. נחליף אותם בקרוב.
-
השתמש ב-barplot כדי לגלות את הז'אנרים הפופולריים ביותר:
import seaborn as sns top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top[:5].index,y=top[:5].values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')
✅ אם ברצונכם לראות יותר ערכי שיא, שנו את הטווח העליון [:5] לערך גדול יותר, או הסירו אותו כדי לראות את כולם.
שימו לב, כאשר הז'אנר העליון מתואר כ-'Missing', זה אומר ש-Spotify לא סיווג אותו, אז בואו נסיר אותו.
-
סנן את הנתונים החסרים מתוך המסננת
df = df[df['artist_top_genre'] != 'Missing'] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue')עכשיו בדקו שוב את הז'אנרים:
-
עד כה, שלושת הז'אנרים המובילים שולטים במערך נתונים זה. בואו נתמקד ב־
afro dancehall,afropop, ו-nigerian pop, בנוסף נסנן את מערך הנתונים להסיר כל ערך עם popularit 0 (כלומר לא סווג עם פופולריות במערך הנתונים וניתן לראות בו כרעש למטרותינו):df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')] df = df[(df['popularity'] > 0)] top = df['artist_top_genre'].value_counts() plt.figure(figsize=(10,7)) sns.barplot(x=top.index,y=top.values) plt.xticks(rotation=45) plt.title('Top genres',color = 'blue') -
בצעו בדיקה מהירה לראות אם הנתונים מקשרים באופן חזק מסוים:
corrmat = df.corr(numeric_only=True) f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True)המתאם היחיד החזק הוא בין
energyו-loudness, שזה לא מפתיע מדי, בהתחשב בכך שמוזיקה רועשת בדרך כלל די אנרגטית. מעבר לכך, המתאמים יחסית חלשים. יהיה מעניין לראות מה אלגוריתם אשכולות יכול ללמוד מהנתונים האלה.🎓 שימו לב שמתאם לא מורה על סיבתיות! יש לנו הוכחה למתאם אך לא הוכחה לסיבתיות. אתר אינטרנט משעשע amusing web site מכיל כמה ויזואליזציות המדגישות נקודה זו.
האם יש התכנסות במערך נתונים זה סביב הפופולריות הנתפסת של שיר ויכולת הריקוד שלו? FacetGrid מראה שיש מעגלים מתרכזים שמסתדרים יחד, ללא קשר לז'אנר. האם ייתכן שהטעמים הניגריים מתכנסים ברמת ריקוד מסוימת לז'אנר הזה?
✅ נסו נקודות נתונים שונות (energy, loudness, speechiness) וז'אנרים מוזיקליים נוספים או שונים. מה תוכלו לגלות? הבט בטבלת df.describe() כדי לראות את התפלגות הנקודות הכללית.
תרגיל - התפלגות נתונים
האם שלושת הז'אנרים האלה שונים משמעותית בתפיסת יכולת הריקוד שלהם, בהתבסס על הפופולריות שלהם?
-
בדוק את התפלגות הנתונים של שלושת הז'אנרים המובילים עבור פופולריות ו-danceability לאורך צירי x ו-y נתונים.
sns.set_theme(style="ticks") g = sns.jointplot( data=df, x="popularity", y="danceability", hue="artist_top_genre", kind="kde", )תוכלו לגלות מעגלים מתרכזים סביב נקודת התכנסות כללית, המציגים התפלגות נקודות.
🎓 שימו לב שהדוגמה הזאת משתמשת בגרף KDE (Kernel Density Estimate) שמייצג את הנתונים באמצעות עקומת צפיפות הסתברותית רציפה. זה מאפשר לנו לפרש נתונים כאשר עובדים עם התפלגויות מרובות.
באופן כללי, שלושת הז'אנרים מתיישבים באופן רופף מבחינת הפופולריות ויכולת הריקוד שלהם. זיהוי אשכולות בנתונים המתיישבים באופן רופף זה יהיה אתגר:
-
צור גרף פיזור:
sns.FacetGrid(df, hue="artist_top_genre", height=5) \ .map(plt.scatter, "popularity", "danceability") \ .add_legend()גרף פיזור של אותם צירים מראה דפוס דומה של התכנסות
באופן כללי, עבור אשכולות, ניתן להשתמש בגרפי פיזור כדי להראות אשכולות של נתונים, ולכן שליטה בסוג ויזואליזציה זה שימושית מאוד. בשיעור הבא, נשתמש בנתונים המסוננים האלה וניישם אשכולות k-means כדי לגלות קבוצות בנתונים אלה שנראות כמתחברות בדרכים מעניינות.
🚀אתגר
בהכנה לשיעור הבא, צרו תרשים על האלגוריתמים השונים לאשכולות שאתם עשויים לגלות ולהשתמש בהם בסביבת ייצור. אילו סוגי בעיות האלגוריתם אשכולות מנסה לפתור?
מבחן לאחר ההרצאה
סקירה ולמידה עצמית
לפני שאתם מיישמים אלגוריתמים של אשכולות, כפי שלמדנו, כדאי להבין את טבע מערך הנתונים שלכם. קראו עוד בנושא זה כאן.
מאמר מועיל זה מלווה אתכם בדרכים שונות שבהן אלגוריתמים שונים לאשכולות מתנהגים, בהתחשב בצורות נתונים שונות.
מטלה
חקור ויזואליזציות נוספות לאשכולות
כתב ויתור: מסמך זה תורגם באמצעות שירות תרגום אוטומטי Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.









