גילוי סיבתי: האם קריאת התרנגול גורמת לשמש לזרוח?

10 שורות של קוד Python לאוטומטיות של גילוי סיבתי שאתה חייב לראות

תמונה על ידי אגור מיזניק on Unsplash

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

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

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

נתונים יכולים לחשוף קורלציה אבל לא סיבתיות, אז איך אפשר "לגלות" קשר סיבתי?

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

לפני שאנו צוללים לגילוי סיבתי אנא שקול...

מצטרף ל-Medium עם קישור ההפניה שלי (אקבל חלק מהעמלות אם תירשם באמצעות קישור זה).

נרשם למייל בחינם בכל פעם שאני מפרסם סיפור חדש.

מבט חטוף במאמרים הקודמים שלי.

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

ביקור באתר מדעי הנתונים שלי - בלוג הנתונים.

שקול את ספירת הערכים מקבוצת הנתונים הבינאריים הבאים...

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

תמונה מאת המחבר

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

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

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

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

תמונה על ידי פדריקו רספיני on Unsplash

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

יש אלגוריתם בשם "NOTEARS" שאכן טוען שהוא מסוגל ליישם גילוי סיבתי, אז בואו ננסה אותו ונראה מה הוא יכול לעשות...

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

תמונה מאת המחבר

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

[('תגובה?', 'חיסון?'),
('אבעבועות שחורות?', 'תגובה?'),
('מוות?', 'תגובה?'),
('מוות?', 'אבעבועות שחורות?')]

אם היינו מדמיינים את התוצאות שהפיקו NOTEARS זה היה נראה כך...

תמונה מאת המחבר

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

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

תמונה מאת המחבר

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

אם אתה רוצה לקרוא עוד על חוסר ההתאמה של NOTEARS לסיבתיות הנה מאמר אקדמי מצוין - https://arxiv.org/pdf/2104.05441.pdf (מרקוס קייזר ומקסים סיפוס).

לפני שאנחנו מוותרים על גילוי סיבתי אוטומטי לחלוטין, בואו נסתכל על חלופה של NOTEARS, האלגוריתם "לאסו" -

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

תמונה מאת המחבר
תמונה מאת המחבר

הו יקירי, לאסו הוא אסון! הוא חזה שהכל גורם לכל השאר ושהצמתים גורמים גם לעצמם!

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

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

מסקנה זו הובילה אותי לפיתוח גישה משלי...

תמונה על ידי אמנדה ג'ונס on Unsplash

קלפים על השולחן, לא כתבתי אלגוריתם גילוי סיבתי. במקום זאת, האלגוריתם שלי מיישם גילוי קורלטיבי עם טוויסט (ללא משחק מילים!).

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

נימקתי שאני יכול לחשב את המתאמים בין התכונות / צמתים בקלות ושזו לפחות תהיה נקודת התחלה טובה.

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

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

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

תמונה מאת המחבר

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

אלו הן 10 השורות של קוד פייתון רקורסיבי שהמצאתי כדי ליישם גילוי סיבתי

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

נתחיל בקריאה בנתונים ונציץ במתאמים...

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

תמונה מאת המחבר

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

תמונה מאת המחבר

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

תמונה מאת המחבר

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

תמונה מאת המחבר

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

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

בעבודה עם מומחי הדומיינים (או עם הניסיון שלי בהזמנות מלונות במקרה זה!) שמתי לב לדברים הבאים -

  • הקישור מ-"DifferentRoomAssigned" ל-"LeadTime" הוא בכיוון הלא נכון מכיוון שזמן הובלת הזמנה ארוך מגדיל את ההסתברות שהזמנת החדר תשתנה ולא להיפך.
  • המתאם בין "BookingChanges" ו-"DifferentRoomAssigned" הוא מתחת לסף, אבל זה עשוי להיות סיבתי משמעותי ולכן צריך לכלול אותו.

הניסיון הבא מורה לאלגוריתם לבצע את התיקונים האלה -

תמונה מאת המחבר

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

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

ישנם שני מלונות בנתונים - מלון "עירוני" ומלון "נופש". זה הוביל אותי להשערה שהמבלבל הבלתי נצפה במודל סיבתי זה הוא ”הסיבה לשהות במלון“.

ההשערה שלי היא ש נופשים מתארחים בעיקר במלון הנופש ואנשי עסקים ופורצי ערים שוהים בעיקר במלון העירוני.

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

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

תמונה מאת המחבר

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

  • יש "בלבול בלתי נצפה" שהוא הסיבה העיקרית לשהות (חופשה לעומת עסקים / חופשה בעיר).
  • ל"מדינה" יש השפעה סיבתית על המבלבל שלא נצפה - אלה הנוסעים ממדינות מסוימות נוטים יותר להיות בחופשה.
  • אותו דבר חל על "TotalGuests". מסיבות גדולות נוטות יותר לחופשות, רווקים בנסיעות עסקים וזוגות בחופשות עירוניות.
  • ל"סיבה לשהות" שלא נצפתה יש השפעה סיבתית על "LeadTime", "HotelType" ו-"DepositType".
  • ל-"LeadTime", "DifferentRoomAssigned", "HotelType", "DepositType" ו-"Reason for Stay" (U) לכולם יש השפעה סיבתית על "IsCanceled".

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

עם זאת, עדיין יש צורך קריטי לדמיין סיבתיות כך שניתן יהיה לחקור אותה עם מומחי תחום על מנת לבנות דיאגרמת סיבתיות (המכונה גם Directed Acyclic Graph או DAG).

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

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

אם נהנית מכתבה זו אנא שקול…

מצטרף ל-Medium עם קישור ההפניה שלי (אקבל חלק מהעמלות אם תירשם באמצעות קישור זה).

נרשם למייל בחינם בכל פעם שאני מפרסם סיפור חדש.

מבט חטוף במאמרים הקודמים שלי.

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

ביקור באתר מדעי הנתונים שלי - בלוג הנתונים.

שמש עולה / קריאת תרנגול נתונים

נתוני אבעבועות שחורות

נתוני רווחים / מפקד אוכלוסין

נתוני הזמנות מלונות

גילוי סיבתי: האם קריאת התרנגול גורמת לשמש לזרוח? פורסם מחדש ממקור https://towardsdatascience.com/causal-discovery-does-the-cockerel-crowing-cause-the-sun-to-rise-f4308453ecfa?source=rss—-7f60cf5620c9—4 דרך https://towardsdatascience. com/פיד

<!–

->

בול זמן:

עוד מ יועצי בלוקצ'יין