โค้ด Python 10 บรรทัดเพื่อทำให้การค้นหาสาเหตุที่คุณต้องดูเป็นไปโดยอัตโนมัติ
จุดเน้นของการวิจัยล่าสุดของฉันคือ การอนุมานเชิงสาเหตุ ขับเคลื่อนโดยคำขอที่เพิ่มขึ้นที่ฉันได้รับจากลูกค้าให้ก้าวไปไกลกว่าการคาดการณ์ของแมชชีนเลิร์นนิงไปสู่การตอบว่า "จะเกิดอะไรขึ้นถ้า" พิมพ์คำถามเพื่อขับเคลื่อนผลกระทบและผลลัพธ์
สิ่งหนึ่งที่ทำให้ฉันทึ่งในตอนแรกคือ “แผนภาพเชิงสาเหตุถูกสร้างขึ้นมาอย่างไร” ในตัวอย่างออนไลน์หลายตัว ดูเหมือนว่าพวกมันจะเกิดขึ้นจริงโดยสมบูรณ์โดยไม่มีคำอธิบายว่าโหนดและลิงก์ถูกระบุอย่างไร
สิ่งนี้ทำให้ฉันได้อ่าน “The Book of Why” โดย Judea Pearl และ Dana Mackenzie (หลายครั้ง!) และมุมมองหนึ่งที่แสดงออกมาก็คือ คุณไม่สามารถทำวิศวกรรมย้อนกลับแผนภาพเชิงสาเหตุ หรือที่เรียกว่า Directed Acyclic Graph (DAG) จากข้อมูลได้ ตามลำพัง.
ข้อมูลสามารถเปิดเผยความสัมพันธ์แต่ไม่ใช่สาเหตุ แล้วจะ "ค้นพบ" สาเหตุได้อย่างไร
หมายเหตุ: ชุดข้อมูลทั้งหมดในบทความนี้ได้รับอนุญาตให้ใช้งานสาธารณะ โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความสำหรับแหล่งที่มาและการอ้างอิงทั้งหมด
ก่อนที่เราจะดำดิ่งลงสู่การค้นพบเชิงสาเหตุ โปรดพิจารณา...
เข้าร่วมสื่อด้วยลิงก์ผู้อ้างอิงของฉัน (ฉันจะได้รับค่าธรรมเนียมตามสัดส่วนหากคุณสมัครโดยใช้ลิงก์นี้)
สมัครรับอีเมลฟรีทุกครั้งที่ฉันเผยแพร่เรื่องราวใหม่.
มาดูบทความก่อนหน้าของฉันอย่างรวดเร็ว.
ดาวน์โหลดกรอบการตัดสินใจที่ขับเคลื่อนด้วยข้อมูลเชิงกลยุทธ์ของฉันฟรี.
เยี่ยมชมเว็บไซต์วิทยาศาสตร์ข้อมูลของฉัน — บล็อกข้อมูล.
พิจารณาจำนวนค่าจากชุดข้อมูลไบนารีต่อไปนี้ …
หมายเหตุ: ชุดข้อมูลพระอาทิตย์ขึ้น/กระทงเป็นข้อมูลสังเคราะห์ที่สร้างขึ้นโดยผู้เขียน โปรดดูส่วนข้อมูลอ้างอิงท้ายบทความสำหรับแหล่งข้อมูลทั้งหมดและรายละเอียดข้อมูลอ้างอิง
เราจะเห็นว่าไก่ขันเมื่อดวงอาทิตย์ขึ้นในการสังเกต 90.25% แต่เราจะรู้ได้อย่างไรว่าดวงอาทิตย์ขึ้นทำให้ไก่ขัน หรือไก่ขันทำให้ดวงอาทิตย์ขึ้นโดยอาศัยข้อมูลเพียงอย่างเดียว
จำนวนกรณีที่ไก่ขันเมื่อดวงอาทิตย์ไม่ขึ้นหรือเมื่อดวงอาทิตย์ขึ้นแต่ไก่ยังเงียบอยู่แทบจะเหมือนกัน (50,000 ต่อ 47,500) ดังนั้นจึงไม่สามารถหาคำตอบเชิงสาเหตุได้โดยการเปรียบเทียบปริมาณข้อมูลสัมพัทธ์
วิธีหนึ่งคือการดูที่แง่มุมชั่วคราว หากดวงอาทิตย์ขึ้นสม่ำเสมอก่อนที่กระทงจะขัน นั่นจะเป็นตัวบ่งชี้สาเหตุที่ดี แต่จะเกิดอะไรขึ้นถ้ากระทงของเราตื่นเช้าล่ะ?
คำตอบคือต้องปรึกษาผู้เชี่ยวชาญด้านโดเมน หากเราสามารถรวมทีมกับนักโหราศาสตร์ นักฟิสิกส์ และเกษตรกรผู้เลี้ยงสัตว์ปีกได้ พวกเขาคงจะสรุปได้ว่าดวงอาทิตย์กำลังทำให้ไก่ตัวผู้ขัน และไม่ใช่อย่างอื่น!
โดยไม่มีใครขัดขวางโดยดวงอาทิตย์ขึ้นและไก่ขันขัน ฉันจึงออกเดินทางเพื่อค้นหาบางสิ่งที่มีอยู่แล้วซึ่งอาจสามารถค้นพบสิ่งมหัศจรรย์ตามสาเหตุโดยอาศัยข้อมูล
มีอัลกอริธึมที่เรียกว่า "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 และแม้ว่าฉันจะจัดการเพื่อให้ได้การกำหนดค่าที่ถูกต้อง ฉันก็ไม่สามารถสร้างโค้ดแบบพกพาที่นักวิทยาศาสตร์ข้อมูลคนอื่นๆ สามารถใช้ได้
ไลบรารีการค้นหาสาเหตุและอัลกอริธึมที่มีอยู่ใช้งานไม่ได้ และสิ่งนี้ได้บังคับใช้มุมมองที่แสดงใน "หนังสือแห่งสาเหตุ" อีกครั้ง กล่าวคือ ไม่สามารถออกแบบวิศวกรรมย้อนกลับจากข้อมูลเพียงอย่างเดียวได้
ข้อสรุปนี้ทำให้ฉันพัฒนาแนวทางของตัวเอง …
การ์ดบนโต๊ะ ฉันยังไม่ได้เขียนอัลกอริธึมการค้นหาเชิงสาเหตุ แต่อัลกอริธึมของฉันใช้การค้นพบเชิงสัมพันธ์ที่มีการหักมุม (ไม่มีเจตนาเล่นสำนวน!)
เมื่อฉันเลิกใช้ไลบรารีการค้นหาสาเหตุ ฉันยังคงต้องการวิธีแสดงภาพสาเหตุเป็นจุดเริ่มต้นสำหรับการสนทนากับผู้เชี่ยวชาญในโดเมน
ฉันให้เหตุผลว่าฉันสามารถคำนวณความสัมพันธ์ระหว่างฟีเจอร์/โหนดได้อย่างง่ายดาย และอย่างน้อยนี่ก็จะเป็นจุดเริ่มต้นที่ดี
ฉันพัฒนาความคิดของฉันดังนี้ — ในโมเดลการค้นพบเชิงสาเหตุ เรามักจะระบุ “ผลกระทบ” เช่น คุณลักษณะข้อมูลที่เราสนใจ (เช่น “เป้าหมาย” ในการทำนายการเรียนรู้ของเครื่อง) ในตัวอย่างไข้ทรพิษนี่คือ “ความตาย?” และในตัวอย่างรายได้ของผู้สำเร็จการศึกษา คือรายได้ “มากกว่าขอบคุณ 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 คอม/ฟีด
<!–
->
- Bitcoin
- bizbuildermike
- blockchain
- การปฏิบัติตามบล็อคเชน
- การประชุม blockchain
- ที่ปรึกษาบล็อคเชน
- coinbase
- เหรียญอัจฉริยะ
- เอกฉันท์
- การประชุม crypto
- การทำเหมือง crypto
- cryptocurrency
- ซึ่งกระจายอำนาจ
- Defi
- สินทรัพย์ดิจิทัล
- ethereum
- เรียนรู้เครื่อง
- โทเค็นที่ไม่สามารถทำซ้ำได้
- เพลโต
- เพลโตไอ
- เพลโตดาต้าอินเทลลิเจนซ์
- Platoblockchain
- เพลโตดาต้า
- เพลโตเกม
- รูปหลายเหลี่ยม
- หลักฐานการเดิมพัน
- W3
- ลมทะเล