- เป็นโครงสร้างที่ แบ่งพื้นที่คุณลักษณะซ้ำ ๆ เพื่อจัดประเภทข้อมูล โดยในแต่ละขั้นจะเลือกการแบ่งที่ให้ Information Gain สูงที่สุด
- ใช้ Entropy เพื่อวัด ความบริสุทธิ์ (purity) ของข้อมูล และคำนวณ Information Gain จากพื้นฐานนี้
- อัลกอริทึม ID3 จะคำนวณความต่างของ Entropy ระหว่างโหนดแม่กับโหนดลูกเพื่อหาจุดแบ่งที่เหมาะสมที่สุด และขยายต้นไม้แบบเรียกซ้ำ
- สามารถใช้ Gini impurity แทน Entropy ได้เช่นกัน โดยทั้งสองวิธีมักให้ผลลัพธ์คล้ายกัน แต่มีประสิทธิภาพในการคำนวณต่างกัน
- การแบ่งมากเกินไปทำให้เกิด overfitting และ ความไม่เสถียร จึงใช้ pruning หรือ Random Forest เพื่อลดปัญหานี้
แนวคิดพื้นฐานของต้นไม้การตัดสินใจ
- ต้นไม้การตัดสินใจจะแบ่งข้อมูลจากบนลงล่าง โดยในแต่ละขั้นจะใช้ กฎเงื่อนไข เพื่อแบ่งข้อมูลออกเป็นพื้นที่ที่แยกกันได้ชัดเจน
- การแบ่งแต่ละครั้งถูกกำหนดโดย คุณลักษณะ (feature) และ ค่าเกณฑ์ (cutoff value) บางตัวของข้อมูล
- เป้าหมายคือการสร้างโหนดที่บริสุทธิ์ ซึ่งสามารถแยกคลาสได้ชัดเจนในการทำ classification
นิยามและคุณสมบัติของ Entropy
- Entropy เป็นตัวชี้วัด ความไม่แน่นอนของข้อมูล โดยสำหรับความน่าจะเป็น (p_i) นิยามเป็น (H = -\sum p_i \log_2(p_i))
- คุณสมบัติสำคัญ
- เมื่อมีเพียงเหตุการณ์เดียวที่มีความน่าจะเป็น 1 และที่เหลือเป็น 0 จะได้ (H=0) หมายถึงไม่มีความไม่แน่นอน
- เมื่อความน่าจะเป็นของทุกเหตุการณ์เท่ากัน Entropy จะมีค่าสูงสุดและแสดงถึงสถานะที่ไม่บริสุทธิ์ที่สุด
- ยิ่งความน่าจะเป็นกระจายตัวเท่า ๆ กันมากขึ้น Entropy ก็ยิ่งเพิ่มขึ้น
- ดังนั้น โหนดที่บริสุทธิ์ จะมี Entropy เท่ากับ 0 ส่วน โหนดที่มีข้อมูลปะปนกัน จะมีค่า Entropy สูง
Information Gain และอัลกอริทึม ID3
- Information Gain คำนวณจากความต่างของ Entropy ก่อนและหลังการแบ่ง และบ่งบอกถึง ประสิทธิภาพของการแบ่งข้อมูล
- สูตร: (\Delta IG = H_{\text{parent}} - \frac{1}{N}\sum N_{\text{child}} \cdot H_{\text{child}})
- ขั้นตอนของอัลกอริทึม ID3
- คำนวณ Entropy ของแต่ละคุณลักษณะ
- แบ่งชุดข้อมูลด้วยเกณฑ์การแบ่งหลายแบบและคำนวณ Information Gain
- เลือกการแบ่งที่มี Information Gain สูงสุดเพื่อสร้างโหนดตัดสินใจ
- เมื่อไม่สามารถแบ่งต่อได้อีก ให้สร้างโหนดใบ
- ทำซ้ำแบบเรียกซ้ำกับทุกชุดย่อย แต่หยุดเมื่อองค์ประกอบทั้งหมดเป็นคลาสเดียวกัน
- ตัวอย่างเช่น เงื่อนไข Diameter ≤ 0.45 ถูกเลือกเป็นการแบ่งครั้งแรก เพราะมี Information Gain สูงสุดที่ 0.574
Gini impurity และตัวชี้วัดทางเลือก
- Gini impurity เป็นอีกทางเลือกหนึ่งแทน Entropy สำหรับวัดความไม่บริสุทธิ์ของข้อมูล
- ไม่มีการคำนวณลอการิทึม จึง คำนวณได้เร็วกว่า
- ในชุดข้อมูลที่ไม่สมดุล Entropy อาจเป็นตัวเลือกที่รอบคอบกว่า
- โดยทั่วไปทั้งสองวิธีให้ผลลัพธ์คล้ายกัน
ปัญหา overfitting และความไม่เสถียร
- อัลกอริทึม ID3 จะทำการแบ่งต่อเนื่องเพื่อทำให้ Entropy ต่ำที่สุด จึงอาจทำให้ ต้นไม้ลึกเกินไป
- สิ่งนี้ก่อให้เกิด overfitting และทำให้ความสามารถในการทำให้เป็นนัยทั่วไปกับข้อมูลใหม่ลดลง
- นอกจากนี้ยังมีปัญหา ความไม่เสถียร (high variance) ที่โครงสร้างต้นไม้อาจเปลี่ยนไปมากแม้ข้อมูลเปลี่ยนเพียงเล็กน้อย
- ตัวอย่าง: แม้เพิ่ม Gaussian noise เล็กน้อยให้กับข้อมูลฝึกเพียง 5% ก็อาจได้ต้นไม้ที่แตกต่างออกไปโดยสิ้นเชิง
- แนวทางแก้คือใช้ pruning เพื่อจำกัดความลึกของต้นไม้ จำนวนใบ หรือจำนวนตัวอย่างขั้นต่ำ เป็นต้น
การขยายไปสู่ Random Forest
- เพื่อลดความไม่เสถียรของต้นไม้การตัดสินใจเดี่ยว จึงมีการใช้วิธี ฝึกหลายต้นไม้ด้วยตัวอย่างข้อมูลที่แตกต่างกัน แล้วรวมผลการทำนายเข้าด้วยกัน
- แนวทางนี้เรียกว่า Random Forest ซึ่งให้ทั้งความเสถียรและความสามารถในการทำให้เป็นนัยทั่วไปที่สูง
- วิธีนี้ช่วยชดเชยข้อเสียของต้นไม้การตัดสินใจ และได้รับการประเมินว่าเป็นหนึ่งในอัลกอริทึมแมชชีนเลิร์นนิงที่ประสบความสำเร็จมากที่สุดจนถึงปัจจุบัน
บทสรุปและการเรียนรู้เพิ่มเติม
- ต้นไม้การตัดสินใจเป็น โมเดลที่ตีความได้ง่าย เรียนรู้ได้รวดเร็ว และมีการเตรียมข้อมูลไม่ซับซ้อน
- อย่างไรก็ตาม เพื่อแก้ปัญหา overfitting และความไม่เสถียร จำเป็นต้องใช้ pruning หรือ เทคนิค ensemble
- บทความนี้ไม่ได้กล่าวถึงต้นไม้สำหรับการถดถอย ความชอบแบบ end-cut ไฮเปอร์พารามิเตอร์ เป็นต้น และแนะนำให้ศึกษาต่อจากแหล่งข้อมูลที่เกี่ยวข้อง
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ตอนเรียนรู้ตัวจำแนกประเภท อาวุธลับ ที่ได้ผลดีกับผมมากคือฝึกตัวจำแนกเชิงเส้นที่ดีให้ได้ก่อน
จากนั้นใช้ ค่าเอาต์พุตที่ยังไม่ผ่าน threshold ของตัวจำแนกเชิงเส้นนั้นเป็นมิติคุณลักษณะเพิ่มเติมหนึ่งตัวเพื่อฝึก decision tree แล้วครอบมันด้วยระบบ boosted tree
วิธีนี้ทำให้โมเดลเชิงเส้นมาชดเชยจุดอ่อนของ decision tree และในทางกลับกัน tree ก็จัดการส่วนที่โมเดลเชิงเส้นทำได้ยาก
จะพิจารณาการหมุนข้อมูลหรือการทำ normalization ตามแกนก็ได้ แต่ส่วนใหญ่ไม่จำเป็น
อย่างไรก็ตาม ถ้าคุณลักษณะมีความ sparse มาก tree จะหาจุดแบ่งได้ยาก
คือเอาสถานะดิบ (raw state) มาคำนวณเพิ่มเพื่อสร้างเป็น สถานะที่สังเกตได้ (observed state) แล้วค่อยเรียนรู้
ตัวอย่างเช่น ในเกมงู นอกจากพิกัดของงูแล้วก็ยังคำนวณคุณลักษณะอนุพันธ์อย่างจำนวนเส้นทางหนีเพื่อนำมาใช้เรียนรู้
ถ้าไม่ทำความสะอาดข้อมูลและออกแบบคุณลักษณะให้ดี ผลลัพธ์จะออกมาแย่กว่าโมเดลกล่องดำอย่าง neural network มาก
ที่น่าขันคือ neural network กลับค้นหาคุณลักษณะแฝงเหล่านี้ได้เอง แต่ก็อธิบายได้ยากว่าทำไมมันถึงทำงานแบบนั้น
ตัวอย่างเช่น Oblique Decision Tree, Model Tree (M5), Logistic Model Tree (LMT), Hierarchical Mixture of Experts (HME)
ตอนทำงานที่ CERN ราวปี 2010 Boosted Decision Tree เป็นตัวจำแนกที่ได้รับความนิยมมากที่สุด
เพราะมันสมดุลดีระหว่างความอธิบายได้กับความสามารถในการแทนรูปแบบ และในตอนนั้นก็มีแรงต้านทางวัฒนธรรมต่อการใช้ neural network ในการวิเคราะห์ฟิสิกส์
ตอนนี้ยุคสมัยเปลี่ยนไปมากแล้ว
ในฟิสิกส์ สิ่งสำคัญไม่ใช่แค่การ fit curve ให้ดี แต่คือการเข้าใจ กลไกเชิงเหตุและผล
เหมือนกับที่ระบบ epicycle ของปโตเลมีทำนายการเคลื่อนที่ของวัตถุท้องฟ้าได้ดีกว่า แต่ไม่ได้อธิบายสาเหตุ
พอลึกขึ้นอีกนิดมันก็กลายเป็น ป่ารก ที่ตีความแทบไม่ไหว
neural network ก็คล้ายกัน คือคุณไล่ดูการคำนวณภายในได้ แต่สุดท้ายก็ยังไม่รู้ว่าทำไมมันถึงตัดสินใจแบบนั้น
ในเว็บเดียวกันมีคำอธิบาย Random Forest ด้วย → mlu-explain/random-forest
ข้อเท็จจริงที่น่าสนใจ: single-bit neural network แท้จริงแล้วก็คือ decision tree
ในทางทฤษฎี neural network ส่วนใหญ่สามารถ “คอมไพล์” เป็นสายโซ่ if-else ได้ แต่ยังไม่ชัดเจนว่ามันใช้ได้ดีเมื่อไร
มันเหมือนเป็นการขยายแนวคิดมากกว่า จึงแมปตรง ๆ ได้ยาก
ถ้าช่วยอธิบายเพิ่มว่าเขาหมายถึงอะไรในเชิงรูปธรรมก็น่าจะดี
ข้อดีใหญ่ที่สุด ของ decision tree คือความเร็ว
ในสภาพแวดล้อมที่ต้องการ latency ต่ำ ผมเคยพยายามแทนที่ตัวจำแนกแบบ tree-based ด้วย neural network ขนาดเล็ก แต่แม้ neural network จะให้ความแม่นยำสูงขึ้นเล็กน้อย latency ตอนอนุมาน (inference) ก็สูงกว่าเกิน 100 เท่า
แต่ tree ที่ผ่าน boosting หรือ bagging จะซับซ้อนขึ้น และอัลกอริทึม ML แบบดั้งเดิมอื่น ๆ ก็พกพาไปใช้ได้ยากกว่า
ในตำรา ML เล่มหนึ่ง (น่าจะเป็น ESL) อธิบาย decision tree ไว้ว่า
“มันอธิบายได้ เร็ว ใช้ได้ดีกับข้อมูลหลากหลายประเภท ไม่ค่อยไวต่อการสเกล และมีพารามิเตอร์ให้จูนไม่มาก... แต่ มันทำงานได้ไม่ดี”
อย่างไรก็ตาม สามารถชดเชยข้อเสียนี้ได้ด้วย bagging หรือ boosting แต่ก็ต้องแลกกับการสูญเสียข้อดีเดิมบางส่วนไป
ผมชอบ decision tree มาก มันเป็น อัลกอริทึม ML แบบดั้งเดิม ที่ผมชอบที่สุด
ผมเคยทำ implementation แบบฟังก์ชันล้วนและขนานได้ด้วย GNU Guile → ลิงก์โค้ด
แต่ Guile ไม่มีอะไรอย่าง NumPy หรือ DataFrame เลย ทำให้การแทนข้อมูลไม่มีประสิทธิภาพ
Guile เหมาะกับการจัดการ tree อยู่แล้ว จึงดูเป็นธรรมชาติสำหรับการทำ decision tree
แต่ถ้า คอมไพล์เป็น machine code ก็น่าจะมีประสิทธิภาพมากขึ้น
สำหรับอ้างอิง อาจลองดู Lush(https://lush.sourceforge.net/) หรือ aiscm(https://wedesoft.github.io/aiscm/) ด้วย
การ ตัดสินใจแบบกำกวม ของผู้เชี่ยวชาญก็มักโมเดลได้ด้วย decision tree หรือ decision chain แบบง่าย ๆ
ตัวผู้เชี่ยวชาญเองอาจคิดว่ามันซับซ้อน แต่ในความเป็นจริง tree ง่าย ๆ มักอธิบายได้ดีกว่า
เมื่อก่อน regression หรือ clustering แบบอิงระยะทางอาจดูหรูหรากว่า แต่ tree มีประสิทธิภาพกว่ามาก
เรื่องนี้อธิบายไว้อย่างละเอียดในบทที่ 7 ของ Oxford Handbook of Expertise
ท้ายที่สุด decision tree ก็คือโครงสร้างที่แบ่งปริภูมิความเป็นไปได้เหมือน kD-Tree แล้วกำหนดพฤติกรรมให้แต่ละบริเวณ
การตัดสินใจอันละเอียดอ่อนของผู้เชี่ยวชาญมาจากความประณีตของเส้นขอบเขต แต่ tree ก็ยังให้ค่าประมาณที่ดีได้มาก
เว็บนี้น่าสนใจและงานนำเสนอก็ดีมาก
แต่สีของข้อความบางส่วน คอนทราสต์ต่ำ จนอ่านยาก
accessibility ไม่ได้มีไว้เพื่อคนพิการเท่านั้น แต่เป็นองค์ประกอบพื้นฐานของ ความอ่านง่าย
ในยุค deep learning ทุกวันนี้ decision tree ถูกประเมินค่าต่ำเกินไป
แต่มันก็ยัง อธิบายได้ เร็ว และใช้งานได้จริงเพียงพอ
ผมเคยสร้างระบบให้คะแนนสำหรับวิเคราะห์เว็บไซต์โดยใช้ tree-based model
มันประเมินเงื่อนไขอย่าง “มี meta description หรือไม่?”, “โหลดภายใน 3 วินาทีหรือไม่?”, “รองรับมือถือหรือไม่?”
ผู้ใช้จึงเข้าใจได้ทันทีว่าทำไมถึงได้คะแนนแบบนั้น
เป็นไปไม่ได้ที่จะอธิบายว่าทำไม neural network ถึงให้ 73 คะแนน แต่ tree ทำได้ง่าย
ต้นไม้การวินิจฉัยของ Esagil-kin-apli ราว 1000 ปีก่อนคริสตกาลคือจุดเริ่มต้นของเรื่องนี้