<<< hello, this ad #2 >>>

ניתוח תוצאות הבחירות לכנסת ה 21 באמצעות למידה עמוקה

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

אימון והסקה

בגדול מאוד קונספט השימוש ב DL במקרים הנ”ל דומה, ומכיל שני שלבים:
1. אימון (train) רשת נוירונים באמצעות מידע מתוייג, ובניית מודל הממפה בין הקלט לפלט המתוייג.
2. ביצוע הסקה (inference) עבור קלט חדש, וסיווגו אל מול אחד הפלטים מהעבר (או קירוב מספרי – רגרסיה).
 

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

שימוש ב DL לטובת ניתוח נתונים

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

בפוסט קודם שלי לדוגמא, כתבתי על הערך של ייצוג ווקטורי של מילים לטובת זיהוי דמיון בין מילים לשימושים שונים בעולם ההבנת טקסט טבעי (NLP) ובאמצעות אלגוריתם Word2Vec. מעניין לחשוב על זה כך – ייצוג הוקטורי של המילים הוא תוצר לוואי של רשת נוירונים, ולא הפלט הקלאסי. עם זאת – תוצר הלוואי הזה הוא הדבר החשוב באמת. 
 
הפעם אם כן, בחרתי להתמקד בזווית מעט שונה: שיטות חדשות לניתוח נתונים כתוצרי לוואי של רשת נוירונים.
לטובת ניתוח זה, נשתמש בכלים המתקדמים שמתאפשרים בזכות התפתחות הלמידה העמוקה, בכלל זה – Keras מעל Tensorflow, וספריות ויזואליזציה – matplotlib, ו networkx, הכל כמובן כתוב ב python. 
 
מתחילים, נא להדק חגורות.. 

ארכיטקטורה עמוקה פוגשת את מערכות הבחירות 

פוסט זה נכתב כחודש וקצת לאחר קיום הבחירות לכנסת ה 21 בישראל (בכל זאת לוקח זמן לעבד את הנתונים במקביל ל day job וזמן משפחה), ומקורות המידע הן תוצאות הבחירות בקלפיות השונות לכנסת ה 20 וה- 21. 
 
לטובת הפוסט, פיתחתי רשת נוירונים הממפה את תוצאות הבחירות של שתי מערכות הבחירות ברמת הקלפי הבודדת – כלומר רשת המתיימרת לזהות תבנית הצבעה בקלפי בכנסת ה 20 ובאמצעותן לחזות את תוצאות אותה הקלפי בכנסת ה 21. 
 
נשאלת השאלה המתבקשת – למה לבנות רשת הממפה בין תוצאות של שתי תוצאות בחירות כאשר המידע ידוע ופורסם?
התשובה היא – שמטרתי בפיתוח זה היא לא תהליך ההסקה, אלא שימוש במודל שנוצר כדי לנסות וללמוד משהו על מערכת הבחירות, בשאיפה משהו שלא ידענו קודם (וגם כי זה כיף :).
 
קצת מספרים 
 
בבחירות לכנסת ה 20: התמודדו 26 מפלגות ואזרחי ישראל הצביעו ב 10,412 קלפיות.
בבחירות לכנסת ה 21: התמודדו 43 מפלגות ואזרחי ישראל הצביעו ב 10,765 קלפיות.
מתוך אותן 10,000+ קלפיות בשתי מערכות הבחירות – ישנן 8,565 קלפיות שהשתתפו בשתי מערכות הבחירות גם יחד.
 
כאמור, כעת נבנה רשת נוירונים עם מטרה פשוטה למדי – מיפוי בין תוצאות כל אחת מה 8,565 קלפי בכנסת ה 20 לתוצאות של אותן קלפיות בכנסת ה 21.
כלומר, נבנה רשת עם שכבת קלט של 26 נוירונים – כמספר המפלגות שהתמודדו בכנסת ה 20, ושכבת פלט של 43 נוירונים – כמספר המפלגות שהתמודדו בכנסת ה 21.
בין שתי השכבות הללו, נבנה 4 שכבות נסתרות (hidden layers) מסוג חיבור מלא (dense) עם 35 נוירונים כל אחת. הרשת אם כן, נראת בצורה הבאה:
arch
למה 4 שכבות? למה 35 נוירונים בשכבות הנסתרות ?
ברוב האלגוריתמים ב Machine Learning, מספר הפרמטרים שיכולים להשפיע על התנהגות המודל הינו די מצומם, ולרוב אינו משפיע מהותית על מבנה הנתונים המשמש לתהליך בנית המודל.
 
להבדיל, ב DL למפתח יש אחריות רבה יותר – בנוסף לפרמטרים הקלאסיים כגון קצב הלימוד (learning rate), ומספר האיטרציות (epocs), ואחרים — המפתח נדרש ממש להגדיר את ארכיטקטורת הרשת הלומדת: איך נראת שכבות הקלט והפלט, כמה שכבות ביניים קיימות ומאילו סוגים, מה הן פונקציות האקטיבציה בין שלב לשלב, מה היא פונקציית ההפסד ועוד, ועוד.. כמות הפרמוטציות האפשריות לבנית כל רשת היא אדירה.
מומחים יספרו על כללי אצבע כאלו ואחרים, אבל בתכלס – ניסוי וטעיה is your best friend. 
אז למה 4 שכבות, עם 35 נוירונים בכל שכבה? כי זה עובד!
 
שכבות הקלט והפלט
כאמור שכבות הקלט והפלט מיצגות את תוצאות הבחירות בכל קלפי בכנסת ה 20 וה 21 בהתאמה.
למעשה אלו וקטורים באורכים 26 ו 43 שבכל תא ותא מספר המיצג את המצביעים באותה קלפי למפלגה המתאימה. הואיל וכמות המצביעים בכל קלפי אינו זהה, ננרמל את התוצאות ל 100%, כלומר בכל תא נייצג את מספר המצביעים שהצביעו לאותה מפלגה יחסית לסך כל הקולות הכשרים בקלפי זו.
 

תהליך ה fit ותוצאות ראשוניות

כעת יש לנו מבנה נתונים המייצג מיפוי בין תוצאות כל קלפי בכנסת ה 20 ו 21.
כל שנותר לנו לעשות כדי לאמן את המודל הוא ‘להעביר’ את הדאטה הגולמי דרך מבנה הנתונים הזה, תהליך הנקרא fitting
נבצע 100 איטרציות (שוב, ניסוי וטעיה) ונמדוד את איכות המודל. 
 
בדיקת איכות
הואיל והבעיה איתה אנו מתמודדים היא בעיה מסוג supervised learning, כלומר תוצאת הקלפיות למעשה ידועות – ניתן בקלות למדוד את איכות המודל שבנינו.
הדרך המקובלת היא לפצל את הדאטה לשני חלקים, לרוב לא שווים בגודלם – דאטה לאימון (train set) ודאטה לבדיקה (test set). את המודל נבנה על הדאטה לאימון, ונבדוק את דיוקו אל מול הדאטה לבדיקה. 
לאחר 100 האיטרציות, הגענו לדיוק של 89% – לא רע בשביל הזמן שהושקע בפוסט זה, אבל סביר להניח ניתן לשפר זאת.
 
נבחן כמה דוגמאות
נגריל 4 קלפיות אקראיות, ונבחן את הדמיון בין ההצבעה בפועל לבין התחזית, בהחלט ניכר דמיון ברוב המקרים. 
ballot1.PNG
הערך cosine similarity מתאר את רמת הדמיון בין הערכים בפועל לבין התחזית, וערכיו נעים בין 1 – 0. 
(בצורה יותר פורמאלית, ערך זה הוא קוסינוס הזווית הכלואה בין שני הוקטורים – בפועל והתחזית)  
 
 
אבל האמת היא שלא הכל ורוד, נחפש עכשיו את התחזיות הרחוקות ביותר מהתוצאה בפועל – כאן, ערכי ה cosine similarity קרוב מאוד (מידי) ל 0.
ballot2.PNG
אכן תמונות קשות, בקלפיות האלו אין הרבה קשר בין התחזית לתוצאה בפועל… הייתי ממליץ לועדת הבחירות לחזור ולהעמיק את בדיקת אי הסדרים בקלפיות הללו.
 

אכלו לי, שתו לי

אחד הנושאים המרכזיים במערכת הבחירות ה 21 היה נושא ‘שתיית הקולות’ של המפלגות המרכזיות את המנדטים של המפלגות הקטנות. האם נוכל להעזר במודל שלנו כדי לאשש טענה זו?

נניח שבמערכת הבחירות ה 20, הייתה קלפי שבה 100% מהקולות הלכו למפלגה ספציפית, מסקרן איזו תוצאה יחזה המודל עבור אותה קלפי למערכת הבחירות ה 21.
לדוגמא – אילו היתה קלפי בה 100% מהקולות במערכת הבחירות ה 20 היו למפלגת העבודה (המחנה הציוני דאז), אזי על-פי המודל רק 19% מהקולות היו נשארים במפלגת ‘אמת’, 11% קולות היו עוברים ל’מרצ’ ו 63% מהקולות היו עוברים למפלגת ‘פה’ (כחול לבן). מסתבר שיש דברים בגו. 

אז אם יש לנו מודל שיודע לנבא כיצד מצביעי מפלגה מסויימת שינו את דעתם בין שתי מערכות הבחירות, למה שלא נבחן זאת על כל המפלגות?
לשם כך נייצר מטריצה ריבועית בגודל 26×26, בה כל הערכים הם 0, פרט לאלכסון שאותו נסמן כ 1 – בצורה זו, יצרנו מבנה נתונים של 26 קלפיות מדומות, שבכל אחת יש מפלגה אחת שקיבלה 100% מהקולות.
המטריצה אם כן, תראה כך: 

diagflat.png

בעזרת מטריצה זו נוכל לבדוק בדיוק את נושא ‘השתיה’ ע”י חיזוי תוצאות קלפיות בבחירות 21 באמצעות המודל שנבנה קודם.
נתאר זאת במפה הבאה (צמצמתי ל 13 המפלגות החשובות בכנסת ה 21):ballot-map.png

כמה אנקדוטות מעניינות:

1. כאמור, מפלגת העבודה קיבלה את אמונם של 19% ממצביעיה המקוריים, 65% נדדו למפלגת כחול לבן
2. את תואר המצביעים הנאמנים ביותר, מקבלת מפלגת יהדות התורה, עם 90% לויאליות. 
3. 30% ממצביעי הבית היהודי התפוגגו אצל מפלגת הימין החדש (שכידוע לא עברה את אחוז החסימה)
4. מצביעי כולנו התפזרו להם אצל המון מפלגות, בינהן – שס, כחול לבן, הליכוד, רע”ם-בל”ד ויהדות התורה
5. כ 25% ממצביעי ישראל ביתנו הצביעו לחד”ש-תע”ל בכנסת ה 21. מוזר מאוד! אשמח להסבר בתגובות.
6. מפלגת הליכוד, קיבלה את אמונם של 10% ממצביעי יש עתיד, אולם מפלגת כחול לבן (הנושאת את אותם אותיות) לא הצליחה להעביר מנדטים משמעותיים מהליכוד אליה. 

ברור שרמה כזו של תובנות קשה יהיה להסיק באמצעות שיטות קלאסיות הנהוגות בכלי Business Inteligience הרגילים.

טביעת אצבע וקטורית של מפלגות 

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

נתבנון שוב על המפה, ממקודם, אבל נתמקד לרגע בשתי מפלגות – מפלגת העבודה, ומפלגת כחול לבן

ballot-map - sim

מסתבר ששתי שורות אלו די קרובות אחת לשניה – הזווית הכלואה בין שני הווקטורים קרובה ל 0, וקוסינוס הזווית קרוב ל 1, (אם ננרמל את התוצאות לכל שורה ל 100% נראה זאת בבירור, אבל לא הפעם).
המשמעות הלוגית היא, שמצביעי שתי המפלגות בכנסת ה 21, הגיעו בגדול מאותן מפלגות ובאותם יחסית בכנסת  ה 20.

ניתן לחשוב על הווקטור האופקי כטביעת האצבע של המפלגה – מפלגות הדומות אחת לשניה (בהיבט מצביעים, לאו דווקא אידיאולוגי כמובן) ייקבלו ייצוג דומה – כלומר ערכי ה cosine similarity יתקרבו לזוג כזה ל – 1.

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

dist.PNG

אין יותר ימין או שמאל?

זוכרים את הסלוגן? נבדוק…

ננסה לתאר את מפת המפלגות בכנסת ה 21 על גבי קנבס דו מימדי (בעקבות מגבלות המדיה כמובן) – כלומר עלינו לבצע המרה של הנתונים מוקטור באורך 26 תאים לווקטור עם שני תאים מבלי לאבד יותר מידי מידע.  
ישנן שתי שיטות נפוצות לעשות זאת – אלגוריתם הפחתת מימדים: T-SNE, ואלגוריתם התמרת מימדים: PCA.
בחרתי דווקא שיטה אחרת – שימוש בגרף ממושקל, כאשר משקל כל קשת הוא כמרחק בין כל זוג מפלגות.
את הגרף נדפיס באמצעות הספריה networkx (את הקשתות צבעתי בלבן), המשתמשת באלגוריתם איטרטיבי המביא את הצמתים למרחק בו המערכת כולה מגיעה לשיווי משקל.

וקיבלנו את המפה דו מימדית להלן:

votes-map.PNG

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

לסיכום

למידה עמוקה היא יותר מרק ביצוע תחזיות, קלסיפיקציות וכיוצ”ב – הכלים החדשים פותחים לנו עולמות חדשים של אפשרויות בתחומים משיקים, למשל בעולם ה Business Inteligience.
שימוש מושכל במידע המצטבר בשכבות הנסתרות או בתוצרי החיזוי, יכול לפתוח את עיננו לסודות מעניינים מאוד, אם רק נדע להפיק אותם. 
האם חברות האנליטיקס וה BI ישנו את עורן כדי לספק שירותי דוחות חדשים מבוססי DL? אני מעריך שלא מיד, אבל בהחלט נראה שיש פה הזדמנות מעניינת לחדשנות.

הקוד כולו נמצא בלינק הבא.

Happy Deep Learning!

Bookmark the permalink.

13 Responses to ניתוח תוצאות הבחירות לכנסת ה 21 באמצעות למידה עמוקה

  1. Maya says:

    ניתוח יפה!
    הייתי מנסה להתמקד בגרף הממושקל ולמצוא את המפלגה המרכזית ע”י למשל אלגוריתם
    Page rank.

  2. ביבי_בוט says:

    וואו ! סחטיין על היצירתיות והביצוע

  3. ווכט says:

    בנוגע לישראל ביתנו/רע”מ תעל: האם ניתן לצמצם את הקלפיות הספציפיות בהן התרחש המעבר הזה? או שהשינוי הוא בהתפלגות אחידה על פני הקלפיות?

    • haggai says:

      אני מניח שאפשר למצוא את הסיבה, אבל מפאת קוצר הזמן לא נכנסתי לזה… אתה מוזמן להרים את הכפפה

  4. אילן ב says:

    לגבי 25 אחוז ממצביעי ישראל ביתנו שהצביעו לחד״ש-תע״ל

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

    אם תוכל להנפיק עוד מידע על זה זה יהיה מדהים, אולי יהיה ערך נוסף למחקר שלך

  5. שי says:

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

  6. דודו says:

    לגבי הציר האופקי – “ל” בצד שמאל שובר את המודל :). למשל – מי משרת בצבא או תורם לכלכלת המדינה או מעורבות באופן כללי.

    לגבי שימוש ברשת נוירונים. האם בדקת\השוות מה ה prediction במידה ומשתמשים ב random forest? נראה לי גם מודל שעשוי להתאים (ההבנה שלי מוגבלת, אז סליחה מראש אם השאלה לא במקום…)

  7. Moshe K says:

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

    • haggai says:

      זו קלפי ספציפית בירושלים, יכול להיות שזה היה בשכונה יותר חילונית

  8. אריאל says:

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

  9. אלון סנדלר says:

    לגבי הציר האופקי ב
    Tsne

    אין לו שום משמעות וגם לא אמורה להיות לו.

    Tsne
    רק מבטיח שנקודות קרובות במימד הגבוה יהיו קרובות במימד הנמוך, הוא *לא* מבטיח שנקודות רחוקות ישארו רחוקות.

    האלגוריתם לא מחפש כיוונים ראשיים
    כמו pca למשל
    אלא “מקפל” את המרחב לדו מימד.
    ולכן הציר האופקי בגרף שקיבלת (ובעצם גם הציר האנכי) חסרי משמעות

    הם גם ישתנו בכל הרצה של האלגוריתם בסדר אחר על הנקודות דאטה

Leave a Reply to ווכט Cancel reply

Your email address will not be published. Required fields are marked *

  • Recent Posts

    • Natural Language Understanding using Deep Learning
      Deep Learning, NLP
    • AI will get you fired
      Uncategorized
    • Being a Busy “B” won’t get you promoted
      Uncategorized
    • Big Data 10th anniversary – where do we go now ?
      Big Data