การค้นพบสาเหตุ: การขันกระทงทำให้ดวงอาทิตย์ขึ้นหรือไม่?

โค้ด Python 10 บรรทัดเพื่อทำให้การค้นหาสาเหตุที่คุณต้องดูเป็นไปโดยอัตโนมัติ

ภาพถ่ายโดย เอกอร์ มิซนิค on Unsplash

จุดเน้นของการวิจัยล่าสุดของฉันคือ การอนุมานเชิงสาเหตุ ขับเคลื่อนโดยคำขอที่เพิ่มขึ้นที่ฉันได้รับจากลูกค้าให้ก้าวไปไกลกว่าการคาดการณ์ของแมชชีนเลิร์นนิงไปสู่การตอบว่า "จะเกิดอะไรขึ้นถ้า" พิมพ์คำถามเพื่อขับเคลื่อนผลกระทบและผลลัพธ์

สิ่งหนึ่งที่ทำให้ฉันทึ่งในตอนแรกคือ “แผนภาพเชิงสาเหตุถูกสร้างขึ้นมาอย่างไร” ในตัวอย่างออนไลน์หลายตัว ดูเหมือนว่าพวกมันจะเกิดขึ้นจริงโดยสมบูรณ์โดยไม่มีคำอธิบายว่าโหนดและลิงก์ถูกระบุอย่างไร

สิ่งนี้ทำให้ฉันได้อ่าน “The Book of Why” โดย Judea Pearl และ Dana Mackenzie (หลายครั้ง!) และมุมมองหนึ่งที่แสดงออกมาก็คือ คุณไม่สามารถทำวิศวกรรมย้อนกลับแผนภาพเชิงสาเหตุ หรือที่เรียกว่า Directed Acyclic Graph (DAG) จากข้อมูลได้ ตามลำพัง.

ข้อมูลสามารถเปิดเผยความสัมพันธ์แต่ไม่ใช่สาเหตุ แล้วจะ "ค้นพบ" สาเหตุได้อย่างไร

หมายเหตุ: ชุดข้อมูลทั้งหมดในบทความนี้ได้รับอนุญาตให้ใช้งานสาธารณะ โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความสำหรับแหล่งที่มาและการอ้างอิงทั้งหมด

ก่อนที่เราจะดำดิ่งลงสู่การค้นพบเชิงสาเหตุ โปรดพิจารณา...

เข้าร่วมสื่อด้วยลิงก์ผู้อ้างอิงของฉัน (ฉันจะได้รับค่าธรรมเนียมตามสัดส่วนหากคุณสมัครโดยใช้ลิงก์นี้)

สมัครรับอีเมลฟรีทุกครั้งที่ฉันเผยแพร่เรื่องราวใหม่.

มาดูบทความก่อนหน้าของฉันอย่างรวดเร็ว.

ดาวน์โหลดกรอบการตัดสินใจที่ขับเคลื่อนด้วยข้อมูลเชิงกลยุทธ์ของฉันฟรี.

เยี่ยมชมเว็บไซต์วิทยาศาสตร์ข้อมูลของฉัน — บล็อกข้อมูล.

พิจารณาจำนวนค่าจากชุดข้อมูลไบนารีต่อไปนี้ …

หมายเหตุ: ชุดข้อมูลพระอาทิตย์ขึ้น/กระทงเป็นข้อมูลสังเคราะห์ที่สร้างขึ้นโดยผู้เขียน โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความสำหรับแหล่งข้อมูลทั้งหมดและรายละเอียดข้อมูลอ้างอิง

ภาพโดยผู้เขียน

เราจะเห็นว่าไก่ขันเมื่อดวงอาทิตย์ขึ้นในการสังเกต 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 กันก่อน ซึ่งคืออัลกอริธึม "Lasso"

หมายเหตุ: ชุดข้อมูลรายได้สำมะโนประชากร / รายได้บัณฑิตได้รับอนุญาตให้ใช้สาธารณะ โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความเพื่อดูแหล่งข้อมูลทั้งหมดและรายละเอียดข้อมูลอ้างอิง

ภาพโดยผู้เขียน
ภาพโดยผู้เขียน

โอ้ที่รัก Lasso เป็นหายนะ! มีการทำนายว่าทุกสิ่งทุกอย่างทำให้เกิดทุกสิ่งทุกอย่างและโหนดก็ทำให้เกิดตัวมันเองเช่นกัน!

ความพยายามครั้งสุดท้ายของฉันคือลองใช้อัลกอริธึม GES, GIES และ LINGAM แต่ทั้งหมดนี้ต้องใช้ไลบรารี R ฉันไม่ได้ใช้ R และแม้ว่าฉันจะจัดการเพื่อให้ได้การกำหนดค่าที่ถูกต้อง ฉันก็ไม่สามารถสร้างโค้ดแบบพกพาที่นักวิทยาศาสตร์ข้อมูลคนอื่นๆ สามารถใช้ได้

ไลบรารีการค้นหาสาเหตุและอัลกอริธึมที่มีอยู่ใช้งานไม่ได้ และสิ่งนี้ได้บังคับใช้มุมมองที่แสดงใน "หนังสือแห่งสาเหตุ" อีกครั้ง กล่าวคือ ไม่สามารถออกแบบวิศวกรรมย้อนกลับจากข้อมูลเพียงอย่างเดียวได้

ข้อสรุปนี้ทำให้ฉันพัฒนาแนวทางของตัวเอง …

ภาพถ่ายโดย อแมนดาโจนส์ on Unsplash

การ์ดบนโต๊ะ ฉันยังไม่ได้เขียนอัลกอริธึมการค้นหาเชิงสาเหตุ แต่อัลกอริธึมของฉันใช้การค้นพบเชิงสัมพันธ์ที่มีการหักมุม (ไม่มีเจตนาเล่นสำนวน!)

เมื่อฉันเลิกใช้ไลบรารีการค้นหาสาเหตุ ฉันยังคงต้องการวิธีแสดงภาพสาเหตุเป็นจุดเริ่มต้นสำหรับการสนทนากับผู้เชี่ยวชาญในโดเมน

ฉันให้เหตุผลว่าฉันสามารถคำนวณความสัมพันธ์ระหว่างฟีเจอร์/โหนดได้อย่างง่ายดาย และอย่างน้อยนี่ก็จะเป็นจุดเริ่มต้นที่ดี

ฉันพัฒนาความคิดของฉันดังนี้ — ในโมเดลการค้นพบเชิงสาเหตุ เรามักจะระบุ “ผลกระทบ” เช่น คุณลักษณะข้อมูลที่เราสนใจ (เช่น “เป้าหมาย” ในการทำนายการเรียนรู้ของเครื่อง) ในตัวอย่างไข้ทรพิษนี่คือ “ความตาย?” และในตัวอย่างรายได้ของผู้สำเร็จการศึกษา คือรายได้ “มากกว่าขอบคุณ 50”

ดังนั้นหากมีความสัมพันธ์กันระหว่างลักษณะใดๆ กับ “ผลกระทบ” ทิศทางเชิงสาเหตุจะต้องมาจากลักษณะอื่นๆ กับผลกระทบตามที่มันอยู่ที่ “ปลายบรรทัด”

ขั้นตอนต่อไปของฉันคือการพัฒนาอัลกอริธึมแบบเรียกซ้ำที่สามารถมองเห็นได้ดังนี้

ภาพโดยผู้เขียน

ลิงก์ที่ซ้ำกันและลิงก์สองทิศทางจะต้องถูกยกเว้น ฉันยังต้องการที่จะรวมหรือแยกการเชื่อมต่อ (ขอบ) อย่างชัดเจน และแยกคุณสมบัติ (โหนด) อย่างชัดเจน

นี่คือโค้ด Python แบบเรียกซ้ำ 10 บรรทัดที่ฉันคิดขึ้นมาเพื่อใช้ในการค้นหาเชิงสาเหตุ

เพื่อแสดงวิธีการทำงานของโซลูชัน ฉันได้เลือกข้อมูลบางส่วนจากข้อมูลการยกเลิกการจองโรงแรม

เริ่มต้นด้วยการอ่านข้อมูลและดูความสัมพันธ์กัน …

หมายเหตุ: ชุดข้อมูลการจองโรงแรมได้รับอนุญาตให้ใช้งานสาธารณะ โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความเพื่อดูแหล่งที่มาทั้งหมดและรายละเอียดข้อมูลอ้างอิง

ภาพโดยผู้เขียน

การดำเนินการครั้งแรกของอัลกอริธึมการค้นพบเกี่ยวข้องกับการวนซ้ำลงไปที่ 1 ดังนั้นเราจึงเพียงดูความสัมพันธ์ (ซึ่งควรเป็นสาเหตุ) กับ "ผลกระทบ" กล่าวคือ การจองโรงแรมจะถูกยกเลิกหรือไม่ ...

ภาพโดยผู้เขียน

ตกลง นั่นไม่ใช่การเริ่มต้นที่ไม่ดี มาเพิ่มจำนวนการวนซ้ำ / การเรียกซ้ำ / เลเยอร์เป็น 3 ปรับแต่งเกณฑ์ความสัมพันธ์เล็กน้อยแล้วดูว่าเราได้อะไร ...

ภาพโดยผู้เขียน

ตกลง ก็ไม่แย่เหมือนกัน แต่มันค่อนข้าง "ยุ่ง" ดังนั้นขั้นตอนต่อไปคือการแยกโหนดบางส่วนที่เราสงสัยว่าอาจก่อให้เกิดเสียงรบกวน (หมายเหตุ: ในกรณีทางธุรกิจในโลกแห่งความเป็นจริง เราจะพูดคุยด้วย ผู้เชี่ยวชาญด้านโดเมนของเราในขั้นตอนนี้)

ภาพโดยผู้เขียน

นี่เริ่มดูดีขึ้นแล้ว โปรดจำไว้ว่าอัลกอริทึมของฉันมั่นใจว่าลิงก์ไปยัง "ถูกยกเลิก" นั้นมีเหตุเพราะเป็น "ผลกระทบ" ดังนั้นจึงไม่มีอะไรตามมาหลังจากนั้น

ชั้นอื่นๆ ของต้นไม้มีความสัมพันธ์กัน ทิศทางของลูกศรถูกเพิ่มตามลำดับที่อัลกอริทึมพบ

การทำงานร่วมกับผู้เชี่ยวชาญโดเมน (หรือประสบการณ์การจองโรงแรมของฉันเองในกรณีนี้!) ฉันสังเกตเห็นสิ่งต่อไปนี้ –

  • ลิงก์จาก "DifferentRoomAssigned" ไปยัง "LeadTime" อยู่ในทิศทางที่ไม่ถูกต้อง เนื่องจากระยะเวลารอคอยการจองที่ยาวนานจะเพิ่มความน่าจะเป็นที่การจองห้องพักจะเปลี่ยนแปลงและไม่ใช่ในทางกลับกัน
  • ความสัมพันธ์ระหว่าง "การเปลี่ยนแปลงการจอง" และ "DifferentRoomAssigned" ต่ำกว่าเกณฑ์ แต่อาจมีสาเหตุที่สำคัญ ดังนั้นจึงจำเป็นต้องรวมไว้ด้วย

ความพยายามครั้งต่อไปจะสั่งให้อัลกอริทึมทำการแก้ไขเหล่านี้ -

ภาพโดยผู้เขียน

“ตัวรบกวนที่ไม่มีใครสังเกตเห็น” เป็นปัจจัยที่เราเชื่อว่ากำลังส่งผลกระทบต่อแบบจำลองเชิงสาเหตุของเราโดยจัดให้มีการเชื่อมโยงระหว่างโหนดบางโหนด แต่ยังไม่ได้รับการวัด และด้วยเหตุนี้จึงไม่รวมอยู่ในแผนภาพ

ประสบการณ์ของฉันในการไปโรงแรมและความรู้เกี่ยวกับชุดข้อมูลโรงแรมทำให้ฉันสงสัยว่ามี “ตัวรบกวนที่ไม่มีใครสังเกตเห็น” ส่งผลกระทบต่อข้อมูลโรงแรม

ข้อมูลนี้มีโรงแรมสองแห่ง ได้แก่ โรงแรม "เมือง" และโรงแรม "รีสอร์ท" สิ่งนี้ทำให้ฉันตั้งสมมติฐานว่าตัวรบกวนที่ไม่มีใครสังเกตเห็นในแบบจำลองเชิงสาเหตุนี้คือ “เหตุผลในการเข้าพักโรงแรม”.

สมมติฐานของฉันคือว่า นักท่องเที่ยวส่วนใหญ่จะพักที่โรงแรมรีสอร์ท ส่วนนักธุรกิจและผู้ที่แยกเมืองจะพักที่โรงแรมในเมืองเป็นหลัก.

นอกจากนี้ ฉันได้ตั้งสมมติฐานว่าทั้งสองกลุ่มมีพฤติกรรมที่แตกต่างกัน และนี่คือ “ตัวรบกวนที่ไม่มีใครสังเกต” (ไม่ได้สังเกตเพราะข้อมูลไม่ได้จับ “เหตุผลในการคงอยู่”)

หมายเหตุและอัลกอริธึมอื่นที่คล้ายคลึงกันไม่สามารถอธิบายถึง "ตัวรบกวนที่ไม่มีใครสังเกตได้" แต่อัลกอริธึมที่ฉันพัฒนาสามารถนำมาพิจารณาได้โดยการรวมไว้อย่างชัดเจนดังต่อไปนี้ ...

ภาพโดยผู้เขียน

ผลลัพธ์ของการทำซ้ำครั้งสุดท้ายคือการแสดงภาพที่เป็นไปได้ อ่านได้ และเข้าใจได้สำหรับสาเหตุในข้อมูลโรงแรม ซึ่งฉันมั่นใจที่จะสำรวจและปรับแต่งร่วมกับผู้เชี่ยวชาญในโดเมน นี่คือประเด็นสำคัญ ...

  • มี “สิ่งที่กวนใจโดยไม่มีใครสังเกตเห็น” ซึ่งเป็นเหตุผลหลักสำหรับการเข้าพัก (วันหยุดกับธุรกิจ/การพักผ่อนในเมือง)
  • “ประเทศ” มีผลกระทบเชิงสาเหตุต่อผู้สับสนที่ไม่มีใครสังเกตเห็น — ผู้ที่เดินทางมาจากบางประเทศมีแนวโน้มที่จะไปเที่ยวพักผ่อนมากกว่า
  • เช่นเดียวกับ “TotalGuests” งานปาร์ตี้ขนาดใหญ่มักจะไปเที่ยวพักผ่อน คนโสดไปเที่ยวเพื่อธุรกิจ และไปเที่ยวในเมืองเป็นสองเท่า
  • “เหตุผลในการเข้าพัก” ที่ไม่มีใครสังเกตเห็นมีผลกระทบเชิงสาเหตุต่อ “ระยะเวลารอคอย”, “ประเภทโรงแรม” และ “ประเภทเงินฝาก”
  • “LeadTime”, “DifferentRoomAssigned”, “ประเภทโรงแรม”, “ประเภทเงินฝาก” และ “เหตุผลในการเข้าพัก” (U) ล้วนมีผลกระทบเชิงสาเหตุต่อ “ถูกยกเลิก”

การค้นพบสาเหตุ เป็นกระบวนการที่นอกเหนือไปจากการเชื่อมโยงที่สัมพันธ์กันไปสู่การค้นพบการเชื่อมโยงเชิงสาเหตุ (เช่น ลูกศรอยู่ตรงปลายเส้นที่สัมพันธ์กันที่ปลายเส้นใดที่ลูกศรอยู่) สิ่งนี้เป็นไปไม่ได้หรืออย่างน้อยก็ยากอย่างห้ามไม่ให้ดำเนินการอัตโนมัติด้วยอัลกอริธึมเช่น NOTEARS เนื่องจากคำตอบไม่มีอยู่ในข้อมูลเพียงอย่างเดียว

อย่างไรก็ตาม ยังมีความจำเป็นที่สำคัญในการแสดงภาพสาเหตุเพื่อให้สามารถสำรวจกับผู้เชี่ยวชาญในโดเมนเพื่อสร้างแผนภาพเชิงสาเหตุ (หรือเรียกอีกอย่างว่า Directed Acyclic Graph หรือ DAG)

ในบทความนี้ มีการเสนออัลกอริทึมบนพื้นฐานของการค้นพบความสัมพันธ์ที่เพิ่มขึ้นโดยใช้โค้ด Python เพียง 10 บรรทัดที่สามารถใช้กับผู้เชี่ยวชาญโดเมนเพื่อปรับแต่งความไว (เกณฑ์) ซ้ำ ๆ และเพื่อแก้ไข เพิ่มหรือลบลิงก์ (ลูกศร) และแยกรายการที่ไม่เกี่ยวข้องออก โหนด

ในบทความต่อๆ ไป แผนภาพเชิงสาเหตุเหล่านี้จะถูกนำมาใช้เพื่อสร้างโมเดลแมชชีนเลิร์นนิงเชิงสาเหตุเต็มรูปแบบ ซึ่งสามารถตอบคำถามที่ซับซ้อนว่า "จะเกิดอะไรขึ้นถ้า" พิมพ์คำถามจากลูกค้าและผู้นำธุรกิจ

หากคุณชอบบทความนี้โปรดพิจารณา ...

เข้าร่วมสื่อด้วยลิงก์ผู้อ้างอิงของฉัน (ฉันจะได้รับค่าธรรมเนียมตามสัดส่วนหากคุณสมัครโดยใช้ลิงก์นี้)

สมัครรับอีเมลฟรีทุกครั้งที่ฉันเผยแพร่เรื่องราวใหม่.

มาดูบทความก่อนหน้าของฉันอย่างรวดเร็ว.

ดาวน์โหลดกรอบการตัดสินใจที่ขับเคลื่อนด้วยข้อมูลเชิงกลยุทธ์ของฉันฟรี.

เยี่ยมชมเว็บไซต์วิทยาศาสตร์ข้อมูลของฉัน — บล็อกข้อมูล.

ข้อมูลพระอาทิตย์ขึ้น / กระทงขัน

ข้อมูลไข้ทรพิษ

ข้อมูลรายได้บัณฑิต / การสำรวจสำมะโนประชากร

ข้อมูลการจองโรงแรม

การค้นพบสาเหตุ: การขันกระทงทำให้ดวงอาทิตย์ขึ้นหรือไม่? เผยแพร่ซ้ำจากแหล่งที่มา https://towardsdatascience.com/causal-discovery-does-the-cockerel-crowing-cause-the-sun-to-rise-f4308453ecfa?source=rss—-7f60cf5620c9—4 ผ่าน https://towardsdatascience คอม/ฟีด

<!–

->

ประทับเวลา:

เพิ่มเติมจาก ที่ปรึกษาบล็อคเชน