מדריך זה מדגים כיצד לסווג מערך נתונים שאינו מאוזן ביותר בו מספר הדוגמאות בכיתה אחת עולה על הדוגמאות בסוג אחר. אתה תעבוד עם מערך הנתונים של גילוי הונאות בכרטיסי אשראי המתארח ב- Kaggle. המטרה היא לגלות 492 עסקאות הונאה בלבד מתוך 284,807 עסקאות בסך הכל. תשתמש ב- Keras כדי להגדיר את המודל ומשקולות הכיתה כדי לעזור למודל ללמוד מהנתונים הלא מאוזנים. .
טען קובץ CSV באמצעות פנדות.
צור מערכי רכבת, אימות ומבחנים.
הגדר ואמן מודל באמצעות Keras (כולל קביעת משקולות הכיתה).
הערך את המודל באמצעות מדדים שונים (כולל דיוק וזכרון).
Pandas היא ספריית Python עם כלי עזר מועילים רבים לטעינה ועבודה עם נתונים מובנים וניתן להשתמש בה כדי להוריד קובצי CSV למספר נתונים.
זה מראה את החלק הקטן של הדגימות החיוביות.
לנתונים הגולמיים יש כמה בעיות. ראשית, העמודות ' Time Amount משתנות מכדי להשתמש בהן ישירות. שחרר את העמודה Time (מכיוון שלא ברור מה המשמעות של זה) וקח את יומן העמודה Amount כדי לצמצם את הטווח שלה.
פצל את מערך הנתונים לערכות רכבת, אימות ומבחנים. מערך האימות משמש במהלך התאמת המודל כדי להעריך את האובדן ואת כל המדדים, אולם המודל אינו מתאים לנתונים אלה. ערכת המבחנים אינה בשימוש לחלוטין בשלב האימונים ומשמשת רק בסוף כדי להעריך עד כמה טוב המודל הכללי לנתונים חדשים. זה חשוב במיוחד עם מערכי נתונים לא מאוזנים שבהם התאמת יתר מהווה דאגה משמעותית מהיעדר נתוני האימונים.
מנרמל את תכונות הקלט באמצעות sklearn StandardScaler. זה יגדיר את הממוצע ל 0 וסטיית תקן ל 1.
הערה: StandardScaler מתאים רק באמצעות train_features כדי לוודא שהדגם לא מציץ לאימות או למערכות הבדיקה.
זהירות: אם ברצונך לפרוס מודל, חשוב מאוד לשמור על חישובי העיבוד המקדים. הדרך הקלה ביותר ליישם אותם כשכבות, ולחבר אותם למודל שלך לפני הייצוא.
האם ההפצות הללו הגיוניות?
כן. נרממת את הקלט ואלו מרוכזים בעיקר בטווח +/- 2 .
האם אתה יכול לראות את ההבדל בין ההפצות?
כן הדוגמאות החיוביות מכילות שיעור גבוה בהרבה של ערכים קיצוניים.
שימו לב שיש כמה ערכים שהוגדרו לעיל וניתן לחשב אותם על ידי המודל שיסייע בעת הערכת הביצועים.
AUC מתייחס לאזור שמתחת לעיקול עקומת מאפיין פועל מקלט (ROC-AUC). מדד זה שווה לסיכוי שמסווג ידרג מדגם חיובי אקראי גבוה יותר מדגם שלילי אקראי.
הערה: דיוק אינו מדד מועיל למשימה זו. אתה יכול 99.8% + דיוק במשימה זו על ידי חיזוי שקר כל הזמן.
כעת צור ואמן את המודל שלך באמצעות הפונקציה שהוגדרה קודם. שימו לב שהדגם מתאים בכמויות אצווה גדולות מהברירת מחדל של 2048, זה חשוב להבטיח שלכל אצווה יש סיכוי הגון להכיל כמה דוגמאות חיוביות. אם גודל האצווה היה קטן מדי, סביר להניח שלא יהיו להם עסקאות הונאה ללמוד מהן.
הערה: דגם זה לא יתמודד היטב עם חוסר האיזון המעמדי. תשפר אותו בהמשך במדריך זה.
אופציונלי: הגדר את ההטיה הראשונית הנכונה.
הניחושים הראשוניים הללו אינם גדולים. אתה יודע שהנתונים לא מאוזנים. הגדר את ההטיה של שכבת הפלט כך שתשקף זאת (ראה: מתכון להכשרת רשתות עצביות: "init well" ). זה יכול לעזור בהתכנסות ראשונית.
קבע זאת כהטיה הראשונית, והדגם ייתן ניחושים ראשוניים סבירים בהרבה.
אובדן ראשוני זה פחות פי 50 מאשר אם היה ניתן לאתחול תמים.
בדרך זו המודל לא צריך לבזבז את התקופות הראשונות רק כדי ללמוד שדוגמאות חיוביות אינן סבירות. זה גם מקל על קריאת עלילות האובדן במהלך האימונים.
כדי להפוך את ריצות האימונים השונות ליותר דומות, שמור את משקולות המודל הראשוני בקובץ מחסום, והטען אותן בכל דגם לפני האימון.
לפני שתמשיך הלאה, אשר במהירות כי אתחול ההטיה הקפדני אכן עזר.
הנתון לעיל מבהיר: מבחינת אובדן האימות, בבעיה זו, אתחול זהיר זה נותן יתרון ברור.
בחלק זה, תייצרו חלקות מדויקות ואובדן הדגם שלכן במערכת האימונים והתקפות. אלה שימושיים כדי לבדוק overfitting, שבו אתה יכול ללמוד עוד על זה הדרכה .
בנוסף, אתה יכול לייצר את החלקות הללו עבור כל אחד מהערכים שיצרת לעיל. דוגמא לכך שליליות כוזבות.
הערה: עקומת האימות בדרך כלל מתפקדת טוב יותר מעקומת האימונים. זה נגרם בעיקר מהעובדה ששכבת הנשירה אינה פעילה בעת הערכת הדגם.
אתה יכול להשתמש במטריצת בלבול לסיכום התוויות בפועל לעומת החזוי כאשר ציר ה- X הוא התווית החזויה וציר Y הוא התווית בפועל.
הערך את המודל שלך בנתון הנתונים של המבחן והצג את התוצאות עבור הערכים שיצרת למעלה.
אם המודל היה חוזה הכל בצורה מושלמת, זה יהיה מטריצה ​​אלכסונית שבה הערכים מהאלכסון הראשי, המציינים תחזיות לא נכונות, היו אפס. במקרה זה המטריצה ​​מראה שיש לך מעט חיובי שווא יחסית, כלומר היו מעט יחסית עסקאות לגיטימיות שסומנו באופן שגוי. עם זאת, סביר להניח שתרצו לקבל אפילו פחות שלילי שווא למרות העלות להגדיל את מספר הפוזיטיביות השקריות. יתכן וסחר זה יעדיף מכיוון שליליות כוזבות יאפשרו לעבור עסקאות הונאה, ואילו חיוביות שגויות עלולות לגרום לשלוח דוא"ל ללקוח כדי לבקש ממנו לאמת את פעילות הכרטיסים שלהם.
עכשיו תכנן את ה- ROC . עלילה זו שימושית מכיוון שהיא מציגה במבט חטוף את טווח הביצועים שאליו הדגם יכול להגיע רק על ידי כוונון סף הפלט.
נראה כי הדיוק גבוה יחסית, אך הזכרון והשטח מתחת לעקומת ROC (AUC) אינם גבוהים ככל שתתרצו. מסווגים לרוב מתמודדים עם אתגרים כאשר מנסים למקסם את הדיוק והזכירה כאחד, וזה נכון במיוחד כאשר עובדים עם מערכי נתונים לא מאוזנים. חשוב לקחת בחשבון את העלויות של סוגים שונים של טעויות בהקשר לבעיה שאכפת לך ממנה. בדוגמה זו, שלילי שווא (עסקת הונאה מוחמצת) עשוי להיות בעלות כספית, ואילו חיובית שגויה (עסקה מסומנת באופן שגוי כהונאה) עשויה להפחית את אושר המשתמשים.
המטרה היא לזהות עסקאות הונאה, אך אין לכם הרבה מאוד מדגמים חיוביים שכדי לעבוד איתם, לכן תרצו שהמסווג ישקל בכבדות את הדוגמאות הבודדות שיש. אתה יכול לעשות זאת על ידי העברת משקולות Keras עבור כל כיתה דרך פרמטר. אלה יגרמו למודל "להקדיש יותר תשומת לב" לדוגמאות מהכיתה הנמצאת תחת מצג.
כעת נסה לאמן מחדש ולהעריך את המודל עם משקולות הכיתה כדי לראות כיצד זה משפיע על התחזיות.
הערה: שימוש ב class_weights משנה את טווח האובדן. זה עשוי להשפיע על יציבות האימונים בהתאם למיטוב. אופטימיזציות שגודל הצעד שלהן תלוי בעוצמת הדרגה, כמו optimizers.SGD של ה- DD, עשויות להיכשל. כלי האופטימיזציה המשמש כאן, optimizers.Adam , אינו מושפע מהשינוי בקנה המידה. שימו לב גם בגלל שקלול שקלול, ההפסדים הכוללים אינם ניתנים להשוואה בין שני הדגמים.
כאן תוכלו לראות כי במשקולות הכיתה הדיוק והדיוק נמוכים יותר מכיוון שיש יותר חיובי כוזב, אך לעומת זאת, ההיזכר ו AUC גבוהים יותר מכיוון שהמודל מצא גם חיובי נכון יותר. למרות שיש דיוק נמוך יותר, למודל זה יש זיכרון גבוה יותר (ומזהה עסקאות הונאה יותר). כמובן שיש עלות לשני סוגי השגיאות (לא תרצו לאגד משתמשים על ידי סימון של יותר מדי עסקאות לגיטימיות כהונאות). שקול בזהירות את החילופים בין סוגים שונים של טעויות ליישום שלך.
גישה קשורה תהיה לדגום מחדש את מערך הנתונים באמצעות דגימת יתר של מיעוט המיעוטים.
אם אתה משתמש ב- tf.data , הדרך הקלה ביותר לייצר דוגמאות מאוזנות היא להתחיל עם מערך נתונים positive negative , ולמזג אותן. עיין במדריך tf.data לקבלת דוגמאות נוספות.
כדי להשתמש במערך נתונים זה, תזדקק למספר הצעדים בכל תקופה.
כעת נסה לאמן את המודל עם מערך הנתונים המחודש, במקום להשתמש במשקולות הכיתה כדי לראות כיצד השיטות הללו משתוות.
הערה: מכיוון שהנתונים היו מאוזנים על ידי שכפול הדוגמאות החיוביות, גודל הנתונים הכולל הוא גדול יותר, וכל תקופה פועלת לצעדים רבים יותר של אימונים.
אם תהליך ההדרכה שוקל את כל מערך הנתונים בכל עדכון שיפוע, דגימה יתר זו הייתה למעשה זהה למשקלול הכיתה.
אבל כשאתה מאמן את המודל באופן אצווה, כמו שעשית כאן, הנתונים מדגימת היתר מספקים אות מעבר צבע חלק יותר: במקום שכל דוגמה חיובית תוצג באצווה אחת עם משקל גדול, הם מוצגים באצוות רבות ושונות בכל פעם עם משקל קטן.
אות מעבר צבע זה מקל על אימון הדגם.
שים לב שההפצות של ערכים יהיו שונות כאן מכיוון שלנתוני האימונים יש תפוצה שונה לחלוטין מנתוני האימות והבדיקה.
מכיוון שהאימונים קלים יותר על הנתונים המאוזנים, נוהל האימונים שלעיל עשוי להתאים יתר על המידה במהירות.
אז תפרק את העידנים כדי לתת את callbacks.EarlyStopping תחילה שליטה טובה יותר מתי להפסיק את האימונים.
סיווג נתונים לא מאוזן הוא משימה קשה מטבעה מכיוון שיש כל כך מעט דוגמאות שניתן ללמוד ממנה. עליך להתחיל קודם כל עם הנתונים ולעשות כמיטב יכולתך לאסוף כמה שיותר דוגמאות ולשקול מחשבה משמעותית באילו תכונות עשויות להיות רלוונטיות כדי שהמודל יוכל להפיק את המרב מכיתת המיעוט שלך. בשלב מסוים המודל שלך עשוי להיאבק כדי לשפר ולהניב את התוצאות שאתה רוצה, ולכן חשוב לזכור את הקשר הבעיה שלך ואת ההחלפות בין סוגים שונים של טעויות.