רווחים:
- יכולת לייצר תכונות נגזרות משמעותיות עם ידע בתחום ולקודד קטגוריות קטגוריות בשיטות מתאימות (חמה אחת, תווית, יעד)
- יכולת קנה מידה של משתנים מספריים לפי סוג המודל (סטנדרטיזציה, נורמליזציה) ולהימנע מקנה מידה מיותר או לא שלם
- יכולת להימנע מדליפת תכונה על ידי לימוד כל הטרנספורמציות לאחר פיצול האימון/מבחן ורק מאימון
יש פתגם ישן בלמידת מכונה: "למידת מכונה יישומית היא בעצם הנדסת תכונות." מכיוון שהצלחתו של מודל נובעת לרוב מהתשומות שאתה נותן למודל, ולא מאיזה אלגוריתם אתה בוחר. הנדסת תכונות היא האמנות של הפקת אותות משמעותיים מנתונים גולמיים שהמודל יכול ללמוד מהם. בינה מלאכותית היא מקור עשיר לרעיונות בשלב זה: כששואלים "אילו תכונות אפשר להפיק מהנתונים האלה", היא מפרטת עשרות הצעות. אבל חלק מההצעות הללו עשויות להיות בעלות ערך, חלקן עשויות להיות חסרות תועלת, וחלקן עשויות להיות מסוכנות (דליפה). זה התפקיד שלך לסדר את זה.
למה הנדסת תכונות
נתונים גולמיים כמעט ולא מגיעים למודל בצורה הטובה ביותר שלו. בעוד שהעמודה "תאריך לידה" לבדה היא חסרת משמעות, ערך ה"גיל" שנוצר ממנה הוא איתות חזק. אתה יכול לחלץ תכונות כגון "יום בשבוע", "יום/לילה", "האם זה חג" מ"חותמת הזמן להזמנה". ניתן לשלב שתי עמודות כדי לייצר יחס ("יחס חוב/הכנסה"). כאן, הנדסת תכונות מתרגמת ידע בתחום לאות מתמטי; ובדיוק בגלל זה זה השלב שדורש הכי הרבה אינטליגנציה אנושית.
המרת משתנים קטגוריים למספרים: קידוד
מודלים בדרך כלל עובדים עם מספרים, לא עם טקסט. המרת משתנים קטגוריים (כגון עיר, צבע, סוג מוצר) למספרים נקראת קידוד. שלוש שיטות נפוצות:
קידוד חם אחד: פותח עמודה נפרדת עם ערך של 0/1 לכל קטגוריה. עבור "עיר", נוצרים עמודים איסטנבול, אנקרה, איזמיר; אם לקוח הוא מאיסטנבול, רק העמודה הזו תהיה 1. אידיאלי כאשר מספר הקטגוריות קטן; אם יש יותר מדי קטגוריות זה מייצר מאות עמודות (זה נקרא "פיצוץ גודל").
קידוד תווית: נותן מספר לכל קטגוריה (איסטנבול=0, אנקרה=1). זה פשוט, אבל זה עלול ללמד את הדגם בטעות רצף (כמו אנקרה > איסטנבול); אז הוא משמש בזהירות בקטגוריות לא מסודרות.
קידוד יעד: מחליף כל קטגוריה בממוצע של משתנה היעד באותה קטגוריה. הוא חזק מאוד, אבל המקור המסוכן ביותר לדליפה: אם לוקחים בחשבון את היעד של נתוני הבדיקה, המודל רואה את העתיד. יש לחשב אותו רק מנתוני הכשרה ובזהירות (בתוך אימות צולב).
קנה מידה: מספרים גדולים אינם מציפים את הדגם
מודלים מסוימים (מבוסס מרחק, מודלים ליניאריים, רשתות עצביות) רגישים לקנה המידה של המשתנים. אם "הכנסה" (0-500,000) ו"גיל" (0-100) נכנסים לאותו דפוס, ההכנסה עשויה לשלוט רק בגלל שהיא גדולה יותר. קנה מידה מתקן את זה. שתי שיטות נפוצות: סטנדרטיזציה (ממיר כל ערך ל"כמה סטיות תקן רחוקות מהממוצע") ונורמליזציה (נורמליזציה מינימום-מקס - דוחסת ערכים לטווח 0-1). מודלים מבוססי עצים (עצי החלטה, יער אקראי) אינם רגישים לקנה מידה, הם אינם דורשים קנה מידה.
זהירות: יש לחשב פרמטרים של קנה מידה וקידוד (ממוצע, סטיית תקן, מיפוי קטגוריה-ממוצע) רק מנתוני האימון, ואז יש להחיל את אותו הדבר על נתוני הבדיקה. הכללת נתוני בדיקה היא דליפה וגורמת לדגם שלך להיראות טוב יותר ממה שהוא באמת.
לב הדליפה בהנדסת תכונות
יצירת תכונה היא המקום שבו דליפת נתונים נובעת לרוב. שתי טעויות אופייניות: דליפת זמן - הפקת תכונה הכוללת מידע עתידי (כולל ימים לאחר יום התחזית בעת חישוב "ממוצע 30 הימים האחרונים"). זליגת סטטיסטיקה - חישוב תכונה (ממוצע קנה מידה, ערך קידוד יעד) מכל הנתונים לפני חלוקת האימון/מבחן. כלל: למד כל טרנספורמציה לאחר ביצוע חלוקת הרכבת/מבחן תחילה ורק מנתוני האימון. הדרך הבטוחה ביותר לעשות זאת באופן קבוע היא להשתמש בצינור - מבנה שאוסף את כל הטרנספורמציות בשרשרת אחת ומיישם אותן לאחר הפיצול.
שיטה
בשביל מה
סכנת דליפה
הערה
קידוד חם אחד
משתנה עם מעט קטגוריות
נמוך
גודל מתפוצץ במספר קטגוריות
קידוד תווית
קטגוריה ממוינת
נמוך
לא בסדר מלמד סדר לא נכון
קידוד יעד
אות רב קטגוריות, חזק
גבוה מאוד
רק מחינוך, בקורות חיים
סטנדרטיזציה
מודלים ליניאריים/מרחקים
בינוני
פרמטר תלוי רק בחינוך
תכונת חלון זמן
סדרת זמן
גבוה
הוסף את העתיד
שלושה מיני תיקים
מקרה 1 - רכוש יקר ערך. צוות אשראי יצר את התכונה "יחס חוב להכנסה" מהעמודות הגולמיות "הכנסה חודשית" ו"תשלום חוב חודשי". תכונה יחידה זו הגדילה את דיוק הדגם מ-71% ל-79%; כי זה היה השיעור, לא ההכנסה המוחלטת, שבאמת קבע את הסיכון. לקח: יחסים שנוצרים על ידי ידע בתחום הם אותות חזקים.
מקרה 2 - דליפת קידוד מטרה. צוות אחד המיר את ה"מיקוד" למספר עם קידוד היעד (שיעור הנטישה הממוצע באזור זה), אך עשה זאת מכל הנתונים לפני הפיצול. הדגם נתן 94% על סט המבחן, ירד ל-68% בייצור. 6 שבועות של מאמץ בזבוז. שיעור: קידוד יעד נעשה בקפידה, רק במסגרת האימון.
מקרה 3 - קנה מידה לשכוח. אנליסט אחד הזין הכנסות (0-400,000) וגיל לקוחות (18-75) למודל מבוסס מרחק ללא קנה מידה. המודל הסתכל כמעט אך ורק על הכנסה, וריסק את אפקט הגיל. כאשר הוספת קנה מידה, הפילוח הפך למשמעותי. שיעור: קנה המידה אינו מוזנח במודלים למרחקים/לינארים.
ארבע תבניות הניתנות להעתקה
1) יצירת רעיון לתכונה (הביטול תלוי בך):
התפקיד שלך: עוזר הנדסת תכונה. עמודות ה-df שלי: תאריך_לידה, זמן_הזמנה (חותמת זמן), הכנסה_תל, חוב_תל, עיר, קטגוריית_מוצר. יעד: "ההלוואה תוחזר" (0/1). הצע 15 תכונות שניתן ליצור מעמודות אלו; ציין את הסיכון לדליפה (נמוך/בינוני/גבוה) עבור כל אחד מהם. סמן בבירור את אלה המכילים מידע עתידי.
2) קידוד מאובטח (אחרי פיצול):
כתוב קוד שמקודד "עיר" ו"מוצר_קטגוריית". חשוב: התאימו את הקידוד רק לנתוני האימון, ואז הפכו את נתוני הבדיקה (עם sklearn OneHotEncoder). הסבר כיצד אתה מטפל בקטגוריה הבלתי נראית (handle_unknown) בחינוך.
3) המרה ללא דליפות עם Pipeline:
הגדר Sklearn Pipeline: החל StandardScaler על עמודות מספריות, OneHotEncoder על עמודות קטגוריות, הוסף מסווג בסוף. הבטח שכל הטרנספורמציות נלמדות לאחר פיצול הרכבת/מבחן ורק מאימון. הסבר את הקוד ומדוע הוא נטול דליפות.
4) תכונת חלון זמן (בקרת דליפה):
צור את התכונה "מספר הזמנות ב-30 הימים האחרונים" עבור כל לקוח, אך לעולם אל תכלול נתונים לאחר יום התחזית. הסבר שורה אחר שורה שהקוד אינו מסתכל אל העתיד. אספק את עמודת תאריך ההתייחסות.
הנחיה חלשה / הנחיה חזקה
הנחיה חלשה:
הוסף מאפיינים טובים לנתונים אלה.
"טוב" אינו מוגדר, היעד אינו ברור, אין בקרת דליפה. AI מייצר תכונות אקראיות, אולי דולפות.
הנחיה עוצמתית:
התפקיד שלך: מהנדס תכונות. יעד: "נטישה תוך 30 ימים" (0/1), תאריך התייחסות משוער: save_date. יש היסטוריית עסקאות ב-df.Task: צור 8 תכונות, ענה על השאלה "האם יש לי את המידע הזה בזמן החיזוי" עבור כל אחד. הוספת התאריך לאחר תאריך ההתייחסות בתכונות חלון זמן. כתוב את הקוד בצורה תואמת צינור לביצוע לאחר קטע הרכבת/בדיקה.
כאן, היעד, זמן ההתייחסות ובקרת הדליפה מוגדרים מההתחלה.
טעויות נפוצות
- לימוד הטרנספורמציה מכל הנתונים לפני החלוקה. אם פרמטר קנה המידה/קידוד רואה את נתוני הבדיקה, מתרחשת דליפה.
- שימוש רשלני בקידוד יעד. זוהי השיטה החזקה ביותר אך הדולפת ביותר; רק מאימון, באימות צולב.
- הוספת העתיד עם תכונת חלון זמן. אם חישוב "30 הימים האחרונים" נכנס לאחר יום התחזית, המודל רואה את העתיד.
- קנה מידה מיותר במודל העץ וקנה מידה לא שלם במודל הליניארי. החלטות קנה מידה מתקבלות בהתאם לסוג הדגם.
- הוספת כל הצעת תכונה של AI ללא שאלה. הצעות עשויות לכלול תכונות חסרות תועלת ודולפות.
טיפ: רשום שאלה בודדת עבור כל תכונה שאתה יוצר: "האם אני יכול לחשב את הערך הזה עם המידע שיש לי בזמן שאני עושה את החיזוי?" אם התשובה אינה ברורה "כן", אל תשתמש בתכונה. דיסציפלינה יחידה זו מבטלת את רוב הדליפות הקשורות לתכונות.
לסיכום
הנדסת תכונות היא אמנות הפקת אותות משמעותיים מנתונים גולמיים ולעתים קרובות קובעת את הצלחת המודל יותר מאשר האלגוריתם. קידוד קטגוריות (חם אחד, תווית, יעד), קנה מידה של מספרים (סטנדרטיזציה, נורמליזציה) והפקת תכונות נגזרות עם ידע בתחום הם הכלים הבסיסיים. אבל השלב הזה הוא גם לב הדליפה: את כל התמורות יש ללמוד לאחר פיצול האימון/מבחן ורק מנתוני האימון. AI מייצר הרבה רעיונות; השיפוט האנושי הוא שמבדיל בין בעל ערך למסוכן.
משימת יישום
בחר משתנה יעד ועצב לפחות חמש תכונות נגזרות מהעמודות שברשותך. עבור כל אחד מהם, ענה בכתב על השאלה "האם אני זמין בזמן התחזית" ובטל לפחות אחת כ"סיכון גבוה לדליפה". לאחר מכן יש לקודד את התכונות המאובטחות בצינור שייושם לאחר החלוקה.
רשימת בדיקה
- [ ] האם יישמתי את כל ההמרות לאחר פיצול הרכבת/מבחן?
- [ ] האם למדתי רק פרמטרים של קנה מידה/קידוד מהאימון?
- [ ] האם עניתי על השאלה "האם יש לי את זה בזמן החיזוי" עבור כל תכונה?
- [ ] האם נקטתי בזהירות רבה יותר בשיטות בסיכון גבוה כגון קידוד יעד?
- [ ] האם החלטתי לבצע קנה מידה מתאים לסוג הדגם (עץ/לינארי)?