ייצוג: נתוני ניקיון

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

שינוי קנה המידה של ערכי התכונות

Scaling הוא המרה של ערכי תכונות של נקודה צפה (floating-point) מהטווח הטבעי שלהם (לדוגמה, 100 עד 900) לטווח סטנדרטי (לדוגמה, מ-0 ל-1, או מ- -1 עד +1). אם קבוצת תכונות כוללת רק תכונה אחת, לקנה מידה יש יתרון מעשי מועט, אם בכלל. עם זאת, אם קבוצת תכונות מורכבת מכמה תכונות, הרחבת התכונות מספקת את היתרונות הבאים:

  • עוזר להמרה בירידה הדרגתית במהירות רבה יותר.
  • כך אפשר למנוע את "trap" של NaN, שבו מספר אחד במודל הופך ל-NaN (למשל, כשערך חורג ממגבלת הדיוק של הנקודה הצפה במהלך האימון), וכתוצאה מפעולות מתמטיות – כל מספר אחר במודל הופך בסופו של דבר ל-NaN.
  • עוזר למודל ללמוד את המשקולות המתאימות לכל תכונה. אם לא ניתן לשנות את גודל התכונות, המודל יקדיש יותר מדי תשומת לב לתכונות שיש להן טווח רחב יותר.

לא חייבים לתת לכל פיצ'ר של נקודה צפה (floating-point) בדיוק אותו היקף. לא יקרה שום דבר רע אם תכונה א' עוברת שינוי מ-1 ל-1+, כאשר תכונה ב' משתנה מ-3- ל-3+. עם זאת, המודל יגיב בצורה גרועה אם תכונה ב' משוקללת מ-5,000 ל-100,000.

טיפול בחריגות קיצוניות

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

תרשים עם חדריםPerPerson שבו כמעט כל הערכים מקובצים בין 0 ל-4, אבל יש "זנב ארוך" שמוביל ל-55 חדרים לאדם

איור 4. זנב ברררי לונה.

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

תרשים יומן(roomsPerPerson) שבו 99% מהערכים מקובצים באשכולות בין 0.4 ל-1.8, אבל עדיין יש זנב ארוך שיוצא בערך 4.2.

איור 5. קנה מידה לוגריתמי עדיין משאיר זנב.

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

תרשים של חדריםPerPerson שבו כל הערכים נמצאים בין 0.3- ל-4.0. עלילה בצורת פעמון אבל יש בה גבעה חריגה בגובה 4.0.

איור 6. ערכי תכונת חיתוך של 4.0

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

כלי קיבול

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

חלקת בתים בכל קו רוחב. העלילה מאוד לא סדירה, ויש בה רגעי שיא סביב קו רוחב 36 ותעלות גבוהות במיוחד סביב קווי רוחב 34 ו-38.

איור 7. בתים בכל קו רוחב.

במערך הנתונים, latitude הוא ערך של נקודה צפה (floating-point). עם זאת, לא הגיוני להציג במודל שלנו את latitude כתכונה צפה (floating-point). הסיבה לכך היא שלא קיים קשר לינארי בין ערכי קו הרוחב לדיור. לדוגמה, בתים בקו רוחב 35 לא \(\frac{35}{34}\) יקרים יותר (או פחות יקרים) מבתים בקו רוחב 34. עם זאת, קווי רוחב נפרדים הם כנראה חיזוי טוב למדי לערכי בתים.

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

חלקת בתים בכל קו רוחב. התרשים מחולק ל:

איור 8. מקבצים ערכים.

במקום להשתמש בתכונה אחת של נקודה צפה (floating-point), יש לנו עכשיו 11 תכונות בוליאניות ייחודיות (LatitudeBin1, LatitudeBin2, ..., LatitudeBin11). האפשרות של 11 פיצ'רים נפרדים היא לא אלגנטית, לכן נאחד אותם לווקטור אחד של 11 רכיבים. כך נוכל לייצג את קו הרוחב 37.4 באופן הבא:

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

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

קרצוף

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

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

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

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

  • מקסימום ומינימום
  • ממוצע וחציון
  • סטיית תקן

כדאי ליצור רשימות של הערכים הנפוצים ביותר לתכונות נפרדות. לדוגמה, אם מספר הדוגמאות עם country:uk תואם למספר שציפיתם לו. האם language:jp היא באמת השפה הכי נפוצה בקבוצת הנתונים שלכם?

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

חשוב להקפיד על הכללים הבאים:

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

יש להתייחס לנתונים בכל הקשור לקודים שחיוניים למשימה. למידת מכונה טובה מסתמכת על נתונים טובים.

מידע נוסף

כללים של למידת מכונה, שלב 2 של למידת מכונה: הנדסת תכונות