יחידה 10 / 11

דליפת נתונים ושחזור: אסונות שקטים ומשמעת

רווחים:

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

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

דליפת נתונים: מודל של ראיית רוח

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

סוגי הדליפה העיקריים הם:

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

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

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

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

סוג דליפה

איך נולד

איך למנוע

דליפת מטרה

עמודה שהיא התוצאה של היעד

מבחן "האם יש לי את זה בזמן החיזוי".

דליפת זמן

מביאים את העתיד לעבר

חלוקה כרונולוגית, בקרת חלונות

דליפה בעיבוד מקדים

המרה מפוצלת מראש

צינור, מתאים רק מהאימונים

דליפת שורות מקובצת

אותה יחידה בשני סטים

פיצול לפי קבוצה (GroupKFold)

המשמעת היחידה למניעת דליפה

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

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

יכולת שחזור: קבלת אותה תוצאה פעמיים

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

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

אקראיות לא קבועה: אימון מודל, דגימה, פיצול כרוכים באקראיות. פתרון: תקן את ה-seed האקראי (הערך ההתחלתי של המחולל האקראי) (random_state=42).

שינוי גרסה: התוצאה עשויה להשתנות כאשר גירסת הספרייה משתנה. פתרון: תקן תלות (requirements.txt, קובץ סביבה).

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

"זה עובד רק על המחשב שלי": פתרון: תיעד את הסביבה, השתמש במיכלים (Docker) אם אפשר.

שלושה מיני תיקים

מקרה 1 - דליפת מטרה. ניתוח בריאות הציג את העמודה "תרופות לאחר שחרור" בניבוי "האם החולה יתקבל מחדש". עמודה זו התמלאה רק לאחר שהמטופל שוחרר. הדגם נתן 96%, בייצור 61%. הפרויקט בן 8 השבועות היה זבל. שיעור: שאלו כל תכונה "האם היא קיימת בזמן החיזוי?"

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

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

ארבע תבניות הניתנות להעתקה

1) בדיקת נזילות:

תפקידך: מפקח דליפות. יעד: "נטישה" (0/1), תאריך התייחסות תחזית: record_date. אני אתן לך רשימה זו של תכונות. עבור כל תכונה: (א) האם היא תוצאה של המטרה, (ב) האם היא זמינה לי בזמן החיזוי, (ג) האם חלון הזמן כולל את העתיד? סמן את זה כ"לא בטוח/חשוד/דליפה" וכתוב סיבה. תכונות: [רשימה]

2) צינור ללא דליפות:

הגדר את Sklearn Pipeline: תחילה פיצול רכבת/בדיקה (שכבתי, זריעה=42), ואז התאם את כל העיבוד המקדים (זקוף, קנה מידה, קידוד) לצינור מהאימון בלבד. הסבר מדוע הקוד נטול דליפות, איזה שלב נלמד היכן.

3) קוד רשימת תיוג לשחזור:

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

4) מחיצה מקובצת (אותה דליפה של יחידה):

בנתונים אותו customer_id קיים במספר שורות. בצע פיצול (GroupKFold orGroupShuffleSplit, group = customer_id) שמונע מאותו לקוח להיות גם בהדרכה וגם בבדיקות. כלול קוד כדי לוודא שאין לקוחות בשתי הקבוצות לאחר הפיצול.

הנחיה חלשה / הנחיה חזקה

הנחיה חלשה:

הדגם שלי החזיר 98% דיוק, זה לא נהדר? בצע אופטימיזציה של הקוד.

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

הנחיה עוצמתית:

תפקידך: מפקח דליפות. הדגם שלי מחזיר 98% דיוק על סט הבדיקה, מה שנשמע לי "טוב מדי מכדי להיות אמיתי". בדוק: (1) האם תכונות כלשהן הן התוצאה של היעד, (2) האם ההמרות שנעשו לפני הפיצול, (3) הן אותה יחידה בשתי סטים, (4) האם יש דליפות זמן. רשום נקודות חשודות; התמקד באיתור הנזילה, לא בתיקון הניקוד.

כאן מתייחסים לציון גבוה כאל סימן שיש לחקור, לא לחגוג.

טעויות נפוצות

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

לסיכום

דליפת נתונים ואי-שחזור הן שתי השגיאות השקטות היקרות ביותר במדעי הנתונים. דליפה היא חזון העתיד של הדגם ומציגה את עצמה כהצלחה כוזבת; הפתרון הוא לפצל את מערך המבחנים מוקדם, ללמוד את הטרנספורמציות רק מאימון (pipeline), לשאול כל תכונה את השאלה "האם יש לי את זה בזמן החיזוי" ולעשות פיצול נכון (כרונולוגי/מקובץ). יכולת שחזור היא היכולת להגיע לאותה תוצאה פעמיים; הפתרון שלו הוא להסיר ידנית שלבים, להצמיד את ה-Seed, להקפיא את הגרסאות ולשמור הכל ב-Git. בינה מלאכותית יכולה להגדיל או להפחית סיכונים אלה; המשמעת שלך היא שקובעת.

משימת יישום

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

רשימת בדיקה

  • [ ] האם שאלתי את הציון "טוב מדי מכדי להיות אמיתי" כהתראת דליפה?
  • [ ] האם למדתי את כל הטרנספורמציות שלאחר הפיצול, רק מאימון?
  • [ ] האם חילקתי לפי מבנה הזמן/קבוצה (כרונולוגי/GroupKFold)?
  • [ ] האם הפכתי את כל האקראיות לחזרה עם זרע קבוע?
  • [ ] האם הסרתי את השלבים הידניים ושמרתי הכל בקוד ובבקרת גרסאות?