You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/he/5-Clustering/1-Visualize
localizeflow[bot] c9012568e4
chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes)
3 months ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
README.md chore(i18n): sync translations with latest source changes (chunk 1/1, 9 changes) 3 months ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

מבוא לאשכולות

אשכול הוא סוג של למידה לא מפוקחת שמניח כי מערך הנתונים אינו מתויג או שהקלטים שלו אינם מותאמים עם פלטים שהוגדרו מראש. הוא משתמש באלגוריתמים שונים כדי למיין נתונים לא מתויגים ולספק קבוצות על פי דפוסים שהוא מזהה בנתונים.

No One Like You by PSquare

🎥 לחצו על התמונה למעלה לצפייה בווידאו. בזמן שאתם לומדים למידת מכונה עם אשכולות, תהנו מקצת רצועות דאנס הול ניגריות - זו שיר מדורג גבוה משנת 2014 של PSquare.

מבחן טרום-הרצאה

מבוא

אשכולות מאוד שימושיים לחקר נתונים. בואו נראה אם הם יכולים לעזור לגלות מגמות ודפוסים בדרך שבה קהל ניגרי צורך מוזיקה.

קחו דקה לחשוב על השימושים באשכולות. בחיים האמיתיים, אשכולות מתבצעים כשיש לכם ערימת כביסה וצריך למיין את הבגדים של בני המשפחה 🧦👕👖🩲. במדעי הנתונים, אשכולות מתבצעים כשמנסים לנתח העדפות של משתמש או לקבוע את מאפייני מערך נתונים לא מתויג. אשכולות, באופן מסוים, עוזרים להבין את הכאוס, כמו מגירת גרביים.

Introduction to ML

🎥 לחצו על התמונה למעלה לווידאו: ג'ון גאוטג מאית' מציג אשכולות

בסביבה מקצועית, ניתן להשתמש באשכולות כדי לקבוע דברים כמו סגמנטציה בשוק, לקבוע אילו קבוצות גיל קונות אילו פריטים, למשל. שימוש נוסף הוא גילוי חריגות, אולי כדי לזהות הונאה מתוך מערך נתוני עסקאות בכרטיס אשראי. או שאפשר להשתמש באשכולות כדי לזהות גידולים באוסף סריקות רפואיות.

חשבו דקה איך אולי פגשתם אשכולות 'בטבע', בסביבת בנקאות, מסחר אלקטרוני או עסקים.

🎓 מעניין, ניתוח אשכולות נוצר בתחומי האנתרופולוגיה והפסיכולוגיה בשנות ה-30 של המאה הקודמת. האם תוכלו לדמיין איך השתמשו בזה?

בנוסף, ניתן להשתמש באשכולות כדי לקבץ תוצאות חיפוש - לפי קישורי קניות, תמונות או ביקורות לדוגמה. אשכולות שימושיים כשיש לכם מערך נתונים גדול שאתם רוצים להקטין ועליו לבצע ניתוח מפורט יותר, לכן השיטה יכולה לשמש ללמידה על נתונים לפני שנבנים מודלים אחרים.

לאחר שמארגנים את הנתונים לאשכולות, מקצים להם מזהה אשכול, וטכניקה זו יכולה להיות שימושית לשמירת פרטיות מערך הנתונים; ניתן להתייחס לנקודת נתונים לפי מזהה האשכול במקום לפי נתונים מזהים מפורטים יותר. תוכלו לחשוב על סיבות נוספות בגללן אפשר להתייחס למזהה אשכול במקום לאלמנטים אחרים באשכול כדי לזהותו?

העמיקו את ההבנה שלכם בטכניקות אשכולות במודול Learn module

התחלת עבודה עם אשכולות

Scikit-learn מציע מערך רחב של שיטות לבצע אשכולות. סוג השיטה שתבחרו תלוי במקרי השימוש שלכם. לפי התיעוד, לכל שיטה יש יתרונות שונים. להלן טבלה מפושטת של השיטות הנתמכות על ידי Scikit-learn ומקרי השימוש המתאימים להן:

שם שיטה מקרה שימוש
K-Means מטרה כללית, אינדוקטיבית
הפצת אפיניות (Affinity propagation) אשכולות רבים ובלתי שווים, אינדוקטיבית
Mean-shift אשכולות רבים ובלתי שווים, אינדוקטיבית
אשכולות ספקטרלי (Spectral clustering) אשכולות מעטים ואחידים, טראנסדוקטיבית
אשכול היררכי מסוג Ward אשכולות רבים עם מגבלות, טראנסדוקטיבית
אשכול אגרגטיבי (Agglomerative clustering) אשכולות רבים, מוגבלים, מרחקים לא אוקלידיים, טראנסדוקטיבית
DBSCAN גאומטריה לא שטוחה, אשכולות בלתי שווים, טראנסדוקטיבית
OPTICS גאומטריה לא שטוחה, אשכולות בלתי שווים בצפיפויות משתנות, טראנסדוקטיבית
תערובות גאוסיות (Gaussian mixtures) גאומטריה שטוחה, אינדוקטיבית
BIRCH מערך נתונים גדול עם חריגות, אינדוקטיבי

🎓 איך אנו יוצרים אשכולות קשור מאוד לאופן בו אנו אוספים את נקודות הנתונים לקבוצות. בואו נפרק קצת אוצר מילים:

🎓 'טראנסדוקטיבי' מול 'אינדוקטיבי'

הסקת מסקנות טראנסדוקטיבית נגזרת ממקרים שנצפו באימון אשר ממופים למקרים ספציפיים במבחן. הסקת מסקנות אינדוקטיבית נגזרת ממקרים של אימון הממופים לחוקים כלליים, שאז בלבד מיושמים על מקרים במבחן.

דוגמה: דמיינו שיש לכם מערך נתונים שהוא מתויג חלקית. כמה דברים הם 'תקליטים', כמה 'תקליטורים', וכמה ריקים. תפקידכם לספק תוויות לריקים. אם תבחרו בגישה אינדוקטיבית, תאמנו מודל שיחפש 'תקליטים' ו'תקליטורים' ויחיל את התוויות הללו על הנתונים ללא תוויות. גישה זו תתקשה לסווג דברים שהם למעשה 'קסטות'. לעומת זאת, גישה טראנסדוקטיבית מטפלת בנתונים הלא ידועים בצורה יעילה יותר כשמטרתה לקבץ פריטים דומים ביחד ואז להחיל תווית על קבוצה. במקרה זה, האשכולות עשויים לשקף 'דברים מוזיקליים עגולים' ו'דברים מוזיקליים מרובעים'.

🎓 'גאומטריה לא שטוחה' מול 'שטוחה'

מושגים מתמטיים, גאומטריה לא שטוחה מול שטוחה מתייחסת למדידת מרחקים בין נקודות בשיטות גאומטריות 'שטוחות' (אוקלידיות) או 'לא שטוחות' (לא אוקלידיות).

'שטוחה' בהקשר זה מתייחסת לגאומטריה אוקלידית (חלקים ממנה נלמדים כגאומטריית מישור), ו'לא שטוחה' מתייחסת לגאומטריה לא אוקלידית. מה הקשר בין גאומטריה ללמידת מכונה? בתחומים שהם שורשיים במתמטיקה, יש צורך במידה משותפת למדידת מרחקים בין נקודות באשכולות, וזה יכול להתבצע בצורה 'שטוחה' או 'לא שטוחה', בהתאם לטבע הנתונים. מרחקים אוקלידיים נמדדים כאורך קטע קו בין שתי נקודות. מרחקים לא אוקלידיים נמדדים לאורך עקומה. אם הנתונים שלכם, כפי שמוצגים, נראים כאילו אינם נמצאים במישור, ייתכן שתצטרכו להשתמש באלגוריתם מיוחד כדי לטפל בהם.

Flat vs Nonflat Geometry Infographic אינפוגרפיקה מאת דאסאני מדייפאלי

🎓 'מרחקים'

אשכולות מוגדרים על ידי מטריצת המרחקים שלהם, לדוגמה המרחקים בין נקודות. מרחק זה יכול להימדד בדרכים שונות. אשכולות אוקלידיים מוגדרים על פי הממוצע של ערכי הנקודות, ומכילים 'צנטרואיד' או נקודת מרכז. המרחקים נמדדים אפוא לפי המרחק לצנטרואיד זה. מרחקים לא אוקלידיים מתייחסים ל'קלוסטרואידים', הנקודה הקרובה ביותר לנקודות אחרות. קלוסטרואידים מוגדרים במספר דרכים שונות.

🎓 'מוגבל'

אשכולות מוגבלים מכניסים למידה 'חצי מפוקחת' לשיטה הבלתי מפוקחת הזו. היחסים בין נקודות מסומנים כ'אי-קישור' או 'חייב-קישור', כך שחלק מהחוקים מוחלים על מערך הנתונים.

דוגמה: אם אלגוריתם ישוחרר על אוסף נתונים ללא תוויות או חצי מתויג, האשכולות שהוא מייצר עשויים להיות באיכות נמוכה. בדוגמה שלמעלה, האשכולות עשויים לקבץ 'דברים מוזיקליים עגולים', 'דברים מוזיקליים מרובעים', 'דברים משולשים' ו'עוגיות'. אם ניתן לו מגבלות או חוקים לעקוב אחריהם ("הפריט חייב להיות מפלסטיק", "הפריט צריך להיות מסוגל להפיק מוזיקה") זה יכול לעזור 'להגביל' את האלגוריתם לבחור טוב יותר.

🎓 'צפיפות'

נתונים שהם 'רועשים' נחשבים כ'צפופים'. המרחקים בין הנקודות בכל אשכול עומדים למבחן כיותר או פחות צפופים, או 'צפופים' ולכן יש לנתח את הנתונים האלו עם שיטת אשכולות מתאימה. מאמר זה מדגים את ההבדל בין שימוש באשכול K-Means לעומת אלגוריתמי HDBSCAN לחקר מערך רועש עם צפיפות אשכולות משתנה.

אלגוריתמים של אשכולות

ישנם מעל 100 אלגוריתמים לאשכולות, והשימוש בהם תלוי בטבע הנתונים. בואו נדון בכמה מהעיקריים:

  • אשכול היררכי. אם אובייקט מסווג על ידי קרבתו לאובייקט סמוך יותר, ולא לאחד רחוק יותר, נוצרים אשכולות על בסיס המרחק בין חבריו לאובייקטים אחרים. אשכול אגרגטיבי של Scikit-learn הוא היררכי.

    Hierarchical clustering Infographic

    אינפוגרפיקה מאת דאסאני מדייפאלי

  • אשכול צנטרואיד. אלגוריתם פופולרי זה מחייב לבחור 'k', או מספר האשכולות שצריך ליצור, לאחר מכן האלגוריתם קובע את נקודת המרכז של אשכול ואוסף סביבו נתונים. אשכול K-means הוא גרסה פופולרית של אשכולות צנטרואיד. המרכז נקבע לפי הממוצע הקרוב ביותר, ולכן השם. מרחק מרובע מהאשכול מוקטן.

    Centroid clustering Infographic

    אינפוגרפיקה מאת דאסאני מדייפאלי

  • אשכול מבוסס התפלגות. מבוסס על מודלים סטטיסטיים, אשכול מבוסס התפלגות מתמקד בקביעת ההסתברות שנקודת נתונים שייכת לאשכול, ומקצה אותה בהתאם. שיטות תערובת גאוס שייכות לסוג זה.

  • אשכול מבוסס צפיפות. נקודות נתונים מוקצות לאשכולות על פי צפיפותן, או סידורן סביב זו. נקודות נתונים רחוקות מהקבוצה נחשבות לחריגות או לרעש. DBSCAN, Mean-shift ו-OPTICS שייכים לסוג אשכולות זה.

  • אשכול רשתית. למערכי נתונים רב-ממדיים, נוצרת רשת והנתונים מתחלקים בין התאים ברשת, ובכך נוצרים אשכולות.

תרגיל - אשכולו את הנתונים שלך

אשכולות כטכניקה מקבלים עזרה רבה מהדמיה מתאימה, אז בואו נתחיל עם הדמיית נתוני המוזיקה שלנו. תרגיל זה יעזור לנו להחליט איזו מהשיטות של אשכולות נשתמש בצורה היעילה ביותר לטבע נתונים זה.

  1. פתחו את הקובץ notebook.ipynb בתיקייה זו.

  2. ייבאו את חבילת Seaborn להדמיית נתונים טובה.

    !pip install seaborn
    
  3. הוסיפו את נתוני השירים מתוך 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
  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
    
  5. בדוק שוב ערכים חסרים, על ידי קריאה ל-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
    
  6. תאר את הנתונים:

    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', מה שמראה שירים ללא דירוג. נחליף אותם בקרוב.

  1. השתמש ב-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 לא סיווג אותו, אז בואו נסיר אותו.

  1. סנן את הנתונים החסרים מתוך המסננת

    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')
    

    עכשיו בדקו שוב את הז'אנרים:

    הפופולריים ביותר

  2. עד כה, שלושת הז'אנרים המובילים שולטים במערך נתונים זה. בואו נתמקד ב־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')
    
  3. בצעו בדיקה מהירה לראות אם הנתונים מקשרים באופן חזק מסוים:

    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() כדי לראות את התפלגות הנקודות הכללית.

תרגיל - התפלגות נתונים

האם שלושת הז'אנרים האלה שונים משמעותית בתפיסת יכולת הריקוד שלהם, בהתבסס על הפופולריות שלהם?

  1. בדוק את התפלגות הנתונים של שלושת הז'אנרים המובילים עבור פופולריות ו-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) שמייצג את הנתונים באמצעות עקומת צפיפות הסתברותית רציפה. זה מאפשר לנו לפרש נתונים כאשר עובדים עם התפלגויות מרובות.

    באופן כללי, שלושת הז'אנרים מתיישבים באופן רופף מבחינת הפופולריות ויכולת הריקוד שלהם. זיהוי אשכולות בנתונים המתיישבים באופן רופף זה יהיה אתגר:

    התפלגות

  2. צור גרף פיזור:

    sns.FacetGrid(df, hue="artist_top_genre", height=5) \
       .map(plt.scatter, "popularity", "danceability") \
       .add_legend()
    

    גרף פיזור של אותם צירים מראה דפוס דומה של התכנסות

    Facetgrid

באופן כללי, עבור אשכולות, ניתן להשתמש בגרפי פיזור כדי להראות אשכולות של נתונים, ולכן שליטה בסוג ויזואליזציה זה שימושית מאוד. בשיעור הבא, נשתמש בנתונים המסוננים האלה וניישם אשכולות k-means כדי לגלות קבוצות בנתונים אלה שנראות כמתחברות בדרכים מעניינות.


🚀אתגר

בהכנה לשיעור הבא, צרו תרשים על האלגוריתמים השונים לאשכולות שאתם עשויים לגלות ולהשתמש בהם בסביבת ייצור. אילו סוגי בעיות האלגוריתם אשכולות מנסה לפתור?

מבחן לאחר ההרצאה

סקירה ולמידה עצמית

לפני שאתם מיישמים אלגוריתמים של אשכולות, כפי שלמדנו, כדאי להבין את טבע מערך הנתונים שלכם. קראו עוד בנושא זה כאן.

מאמר מועיל זה מלווה אתכם בדרכים שונות שבהן אלגוריתמים שונים לאשכולות מתנהגים, בהתחשב בצורות נתונים שונות.

מטלה

חקור ויזואליזציות נוספות לאשכולות


כתב ויתור: מסמך זה תורגם באמצעות שירות תרגום אוטומטי Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.