חיפוש באתר

קישורים

RSS סטטיסטיקה ברשת

עמודים

קטגוריות

תגיות

ארכיב עבור 'כללי'

איפה הקפיטליסט היומי

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

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

איך אומרים? הטובים שורדים.

מה הסיכוי שקולך ישפיע אם תצביעי בבחירות (ג)

לפני מספר שנים כתבתי כאן שלוש רשימות על הסיכוי שקול בודד ישפיע על התוצאות של הבחירות. (למה להצביע ומה הסיכוי שקולך ישפיעמה הסיכוי שקולך ישפיע אם תצביעי בבחירותמה הסיכוי שקולך ישפיע בבחירות – המשך דיון).

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

ניתוח מרכיבים ראשיים (PCA) – למה, איך ואיך לא

ברשימה זאת אתן הסבר אינטואיטיבי ולא מתמטי אודות שיטת ה-PCA, ואסביר כיצד להשתמש בה בצורה נכונה.

למה להשתמש ב-PCA?

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

איך להשתמש ב-PCA

לצורך ההדגמה אשתמש בקובץ נתונים body, המכיל נתונים אודות מימדי הגוף של 507 נבדקים. הקובץ זמין לציבור בארכיון הנתונים של ה-Journal of Statistical Education. הקובץ נמצא כאן, והסבר על הנתונים שבקובץ תוכלו למצוא כאן. אני אתרכז בשלושה משתנים בקובץ, המודדים שלושה אספקטים של היקף החזה: ,Chest_depth  Chest_diameter ו- Chest_girth.

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

את התשובה לשאלה האחרונה נתן קרל פירסון בשנת 1901. כן, אפשר למצוא שקלול כך שאיבוד האינפורמציה יהיה מינימלי.

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

האינפורמציה שבנתונים מתבטאת בשוניות שבין המשתנים ובשונויות המשותפות שבינהם. לכן הציע פירסון הציע להסתכל על טבלת השונויות המשותפות המשתנים[1] .[2]

Chest_depth Chest_girth Chest_diameter
20.35 4.59 6.33 Chest_diameter
23.93 7.59 4.59 Chest_girth
100.555 23.99 20.35 Chest_depth

בטבלה שמוצגת כאן אנו רואים, למשל, כי השונות המשותפת של המשתנים Chest_diameter ו-Chest_girth היא 23.93. גם מקדם המתאם בין שני המשתנים גבוה, וערכו הוא 0.87. גם המתאמים האחרים גבוהים. ככל שהמתאמים בין המשתנים גבוהים יותר, כך ה-PCA יביא יותר תועלת. לכן מומלץ לבדוק את מקדמי המתאם בין המשתנים לפני הפעלת ה-PCA.

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

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

בדוגמה שלנו הערכים העצמיים של המטריצה הם 110.52, 2.33 ו-1.55. הערך העצמי הגדול ביותר הוא, לכן, 110.52. הוקטור העצמי המתאים לערך עצמי זה הוא: (0.953, 0.230, 0.197 ).   לכן השקלול האופטימלי הוא להכפיל את Chest_depth ב-0.197, להכפיל את Chest_diameter ב-0.230, ולהכפיל את Chest_girth ב-0.953, ולבסוף לחבר הכל. המשתנה המתקבל כך נקרא "המרכיב הראשי הראשון". כמה אינפורמציה נשמרת? ובכן, סכום הערכים העצמיים הוא 114.4. 110.52 חלקי 114.4 זה 0.966. המרכיב הראשי הראשון שומר 96.6% מהאינפורמציה.

באופן דומה אפשר להגדיר את המרכיב הראשי השני והשלישי. בדוגמא שלנו אפשר להסתפק במרכיב הראשי הראשון.

מבחינה גיאומטרית השיטה מתאימה לנתונים מערכת צירים חדשה, על ידי "סיבוב" של ערכי המשתנים. בדוגמה המלאכותית הבאה רואים שני משתנים, X ו-Y, כמו שהם (לפני הפעלת ה-PCA) ואת שני הרכיבים הראשיים (אחרי הפעלת ה-PCA). ניתן לראות כי הנתונים "הסתובבו", וכעת השונות בין המשתנים מתבטאת בעיקר לאורך הציר האופקי.

 

איך לא להשתמש ב-PCA

מי שטרח להסתכל בקובץ הנתונים ראה שיש בו 25 משתנים. מדוע, אפשר לשאול, לא ניקח את כל המשתנים ונפעיל עליהם את פרוצדורת ה-PCA? זה אפשרי מבחינה מתמטית. אם תכניסו את כל הנתונים לתוכנה שמחשבת PCA תקבלו משהו. אבל יש כאן כמה בעיות[4] .

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

שנית, אם תבחנו היטב את רשימת המשתנים, תראו שבקובץ יש משתנה המתאר את מינו של כל אחד מהאנשים שנמדדו. 1 מציין זכר, 0 מציין נקבה. הבחירה של 0 ו-1 היא שרירותית. זהו משתנה שמי. אין כלל משמעות לשונות של המשתנה הזה, או לשונות המשותפת שלו עם משתנים אחרים. הכלל השני: PCA נועד למשתנים כמותיים, כלומר, למשתנים שנמדדים בסולם מנה או סולם רווח. מה לגבי משתנים שנמדדים בסולם סודר? למשל, שביעות הרצון בסולם 1-5? גם כאן בחירת המספרים היא שרירותית. מי שמכניס משתנה כזה לתוך PCA מניח כי שביעות הרצון הזאת היא משתנה כמותי, כלומר ההפרש בין 1 ל-2, למשל, שווה להפרש בין 4 ל-5. הנחה כזו צריך להצדיק. ההצדקה היחידה שראיתי לגבי התייחסות למשתנה כזה כאל משתנה כמותי היא שכנוע עצמי.

גם כשיש נתוני ספירה (count variables), למשל מספר ההתקפים שעבר חולה במשך תקופת זמן מסויימת, צריך להזהר. זה אמנם משתנה כמותי, אבל הוא עלול להיות skewed[5] , ומכאן ייתכן כי המתאם בין משתנה כזה ומשתנים כמותיים אחרים עלול להיות נמוך, ולפיכך לא תהיה תועלת רבה בהכנסתו למודל.

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


הערות
  1. שונות משותפת בין שני משתנים דומה בתכונותיה למקדם המתאם בין המשתנים למעשה, מקדם המתאם מחושב על ידי שקלול של השונות המשותפת. []
  2. כן, אני יודע על  centering ו-scaling ודברים כאלה []
  3. ואפשר להוכיח כי הם יהיו ממשיים וחיוביים []
  4. הניתוח מכאן והלאה תקף גם לשיטות אחרות להקטנת מימדי הנתונים, כגון SVD, MDS וכדומה []
  5. איך מתרגמים את זה לעברית? []

מה עושים כשיש 180000 משתנים מסבירים?

בקבוצת Machine & Deep learning Israel בפייסבוק מישהו שאל את השאלה הבאה:

 I have a feature matrix of about 4000 samples and 180,000 features. Naturally, I want to reduce its dimensions for applying a machine learning algorithm on the reduced matrix.

  1. How do I handle such a big matrix in python for calculations (pandas, other?)
  2. How can I apply feature selection on such a big matrix and what feature selection methods would you try first?

למעשה יש פה שתי שאלות, הראשונה טכנית במהותה (שימוש בשפת פייתון). אני רוצה להתייחס לשאלה השניה.

ראשית, בואו נבהיר אותה בעברית.

לשואל יש קובץ נתונים, עם 4000 תצפיות. בכל תצפית נתונים ערכים של 180,000 משתנים (features בשפת ה-machine learning). ברור לשואל שיש לו יותר מדי משתנים (חלק מהמשיבים לשאלה ציינו זאת במפורש, ויעצו לשואל לאסוף עוד תצפיות) , והוא שואל איך יוכל לבחור מתוכם קבוצה קטנה יותר של משתנים, כך שמימד הבעיה יקטן. כשכמובן הוא מעוניין לבחור את המשתנים המשמעותיים ביותר לבעיה שלו.

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

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

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

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

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

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

1) בחר את אחד המשתנים שבתוך המודל באופן מקרי.

2) בחר אחד מהמשתנים שלא נכנסו למודל באופן מקרי.

3) הוצא מהמודל את המשתנה שבחרת בשלב (1) והכנס במקומו למודל את המשתנה שבחרת בשלב (2).

4) חשב את הערך הפרדיקטיבי של המודל החדש.

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

6) חזור לשלב (1).

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

לאחר שהתכנסנו למודל כלשהו עם 500 משתנים, נוכל להפעיל עליו את אחת השיטות המקובלות של variable/feature selection, למשל LASSO regression.

כעת, אם עדיין יש צורך, אפשר לקחת משתנים המתארים משתנים דומים או קרובים זה לזה (נניח הטמפרטורה בשעה 10 בבוקר והטמפרטורה בשעה 12 בצהריים), ולהחליף אותם במשתנה שירכז בתוכו את רובה של השונות במשתנים אלה, על ידי הפעלת PCA למשל.

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

בהצלחה!

אתה לא יודע כלום, ג'ון שלג

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

event

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

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

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