ยินดีต้อนรับสู่โลกของต้นไม้!
สวัสดีครับ! วันนี้เราจะมาทำความรู้จักกับส่วนที่เข้าใจง่ายและเห็นภาพชัดเจนที่สุดส่วนหนึ่งของข้อสอบ Exam PA นั่นคือ Decision Trees (ต้นไม้ตัดสินใจ) หากคุณเคยเล่นเกม "ทายคำถาม 20 ข้อ" หรือเคยไล่ดูแผนผัง (flowchart) เพื่อแก้ปัญหาอินเทอร์เน็ตที่บ้าน คุณก็เข้าใจตรรกะพื้นฐานของต้นไม้เรียบร้อยแล้วครับ ในบทนี้เราจะมาเรียนรู้วิธีสร้างต้นไม้ วิธีป้องกันไม่ให้มัน "แตกกิ่งก้านสาขามากเกินไป" และวิธีทำให้มั่นใจว่ามันสามารถใช้งานกับข้อมูลที่ไม่เคยเห็นมาก่อนได้จริง ถ้าตอนแรกๆ รู้สึกว่ามันดูเป็นวิชาการไปหน่อยไม่ต้องกังวลนะครับ เราจะค่อยๆ เจาะลึกไปทีละขั้นตอน!
1. การสร้างต้นไม้: การแยกข้อมูลแบบทวิภาค (Recursive Binary Splitting)
เวลาที่เราสร้างต้นไม้ เรากำลังพยายามแบ่งข้อมูลของเราออกเป็นกลุ่มย่อยๆ ที่มีความ "บริสุทธิ์" มากขึ้น กระบวนการนี้เรียกว่า Recursive Binary Splitting ให้ลองนึกภาพการแยกผ้าซักครับ คุณอาจจะเริ่มจากการแยกผ้าสีขาวออกจากผ้าสีอื่นๆ จากนั้นจึงค่อยแยกผ้าสีเหล่านั้นตามประเภทของเนื้อผ้าอีกที
วิธีการทำงาน (ทีละขั้นตอน):
1. เริ่มจากจุดบนสุด (Root Node): เราเริ่มจากข้อมูลทั้งหมดที่มีอยู่ในกลุ่มก้อนเดียวกัน
2. หาจุดแยกที่ดีที่สุด (The Best Split): เราพิจารณาตัวแปรต้นทุกตัวและ "จุดตัด" ที่เป็นไปได้ทั้งหมด (เช่น อายุ < 30 เทียบกับ อายุ ≥ 30)
3. เป้าหมาย: เราจะเลือกจุดตัดที่ทำให้ "ความไม่บริสุทธิ์ (impurity)" ลดลงมากที่สุด เราต้องการให้กลุ่มย่อยที่ได้ (ใบไม้/leaves) มีความคล้ายคลึงกันในกลุ่มให้มากที่สุดเท่าที่จะทำได้
4. ทำซ้ำ (Repeat): เราทำขั้นตอนเดิมซ้ำกับกิ่งใหม่แต่ละกิ่งที่เกิดขึ้น นี่คือสาเหตุที่เรียกว่าการแยกข้อมูลแบบ "recursive" (เรียกซ้ำ)
การวัดความสำเร็จ (ส่วนที่เป็นคณิตศาสตร์):
เราจะรู้ได้อย่างไรว่าการแยกข้อมูลนั้น "ดี" หรือไม่? ขึ้นอยู่กับว่าเรากำลังทำนายอะไรครับ:
สำหรับ Regression Trees (การทำนายตัวเลข):
เราใช้ค่า Residual Sum of Squares (RSS) เราต้องการหาจุดแยกที่ทำให้ค่านี้ต่ำที่สุด:
\( \sum (y_i - \hat{y}_{R})^2 \)
คำอธิบาย: เราต้องการให้ค่าจริงในกลุ่มนั้นอยู่ใกล้เคียงกับค่าเฉลี่ยของกลุ่มมากที่สุดนั่นเองครับ
สำหรับ Classification Trees (การทำนายหมวดหมู่):
เราใช้การวัดค่าอย่าง Gini Index หรือ Entropy
- Gini Index: \( G = \sum_{k=1}^{K} \hat{p}_{mk}(1 - \hat{p}_{mk}) \)
- Entropy: \( D = -\sum_{k=1}^{K} \hat{p}_{mk} \log \hat{p}_{mk} \)
ค่าทั้งสองนี้จะต่ำถ้าโหนดนั้นมีความ "บริสุทธิ์" (หมายความว่าเกือบทุกคนในกลุ่มนั้นอยู่ในหมวดหมู่เดียวกัน)
ทบทวนสั้นๆ: การแยกข้อมูลเป็นแบบ greedy (ตะกละ) ซึ่งหมายความว่าโมเดลจะเลือกตัดสินใจในสิ่งที่ "ดีที่สุด" สำหรับขั้นตอนปัจจุบัน โดยไม่สนใจว่าการแยกนั้นจะนำไปสู่ต้นไม้ที่ดีกว่าในอีก 5 ขั้นข้างหน้าหรือไม่
2. อันตรายจากการที่ต้นไม้เติบโตมากเกินไป: การทำนายที่เกินพอดี (Overfitting)
ถ้าเราปล่อยให้ต้นไม้เติบโตจนข้อมูลทุกตัวถูกแยกไปอยู่ในใบของตัวเองเป๊ะๆ เราจะมีค่าความผิดพลาดเป็น 0% ในชุดข้อมูลฝึกฝน (training data) ฟังดูเหมือนจะดีใช่ไหมครับ? คิดผิดถนัดครับ! นี่คือกรณีคลาสสิกของ Overfitting
เปรียบเทียบ: ลองนึกถึงการจำคำถามและคำตอบจากข้อสอบเก่าทุกข้อแบบเป๊ะๆ แทนที่จะเข้าใจแนวคิดพื้นฐาน เมื่อข้อสอบจริงเปลี่ยนแนวไปนิดหน่อย คุณก็จะทำไม่ได้ เพราะคุณไม่ได้เรียนรู้ "รูปแบบ" (patterns) ของมัน แต่คุณดันไปจำ "สัญญาณรบกวน" (noise) แทน
กฎการหยุด (Hyperparameters):
เพื่อป้องกันไม่ให้ต้นไม้กลายเป็นความวุ่นวายที่ overfit เราจึงใช้ "กฎการหยุด":
- minbucket: จำนวนข้อมูลขั้นต่ำที่อนุญาตให้มีในใบหนึ่งใบ ถ้าการแยกจะทำให้เกิดกลุ่มที่เล็กกว่านี้ ระบบจะไม่ยอมให้แยก
- maxdepth: จำนวน "ชั้น" สูงสุดที่ต้นไม้จะมีได้
- cp (Complexity Parameter): เกณฑ์ที่กำหนดว่าค่าความผิดพลาดต้องลดลงเท่าไหร่ถึงจะคุ้มค่าที่จะแตกกิ่งใหม่
3. การตัดแต่งกิ่ง (Pruning): การเล็มต้นไม้ให้เข้าที่
แม้จะมีกฎการหยุดแล้ว แต่มักจะดีกว่าหากเราปล่อยให้ต้นไม้เติบโตจนเต็มที่ก่อนแล้วค่อย "ตัดแต่งกิ่ง" ทีหลัง กระบวนการนี้เรียกว่า Cost Complexity Pruning (หรือ Weakest Link Pruning)
เราใช้สูตรคำนวณคะแนนของต้นไม้ดังนี้:
\( R_{\alpha}(T) = R(T) + \alpha |T| \)
- \( R(T) \) คือค่าความผิดพลาด (เช่น RSS)
- \( |T| \) คือจำนวนใบสุดท้าย (ขนาดของต้นไม้)
- \( \alpha \) (Alpha): คือ "บทลงโทษ" สำหรับความซับซ้อนของต้นไม้
การแลกเปลี่ยน:
- ถ้า \( \alpha = 0 \), จะไม่มีบทลงโทษ ทำให้เราได้ต้นไม้ที่ใหญ่และซับซ้อนมาก
- เมื่อ \( \alpha \) เพิ่มขึ้น บทลงโทษสำหรับการมีใบมากเกินไปจะสูงขึ้น บังคับให้ต้นไม้เล็กลงและเรียบง่ายขึ้น
รู้หรือไม่? ในแพ็กเกจ rpart ของภาษา R นั้น ค่า complexity parameter cp มีความสัมพันธ์โดยตรงกับ \(\alpha\) นี้เลยครับ ค่า cp ที่สูงขึ้น หมายถึงต้นไม้ที่เล็กลงนั่นเอง!
4. การตรวจสอบความถูกต้อง (Validation): เลือกต้นไม้ที่ดีที่สุด
เราจะเลือกระดับการตัดแต่งกิ่งที่สมบูรณ์แบบ (ค่า \(\alpha\) ที่ดีที่สุด) ได้อย่างไร? เราใช้ K-fold Cross-Validation ครับ
กระบวนการ:
1. แบ่งข้อมูลออกเป็น 10 ส่วน (folds)
2. ฝึกสอนต้นไม้ด้วยข้อมูล 9 ส่วน และทดสอบด้วยส่วนที่ 10
3. ทำซ้ำแบบนี้กับต้นไม้ขนาดต่างๆ
4. เลือกขนาดที่มีค่าความผิดพลาดจากการทำ cross-validation ต่ำที่สุด
กฎ 1-SE Rule:
ในการสอบ Exam PA คุณมักจะได้ยินเรื่อง 1-SE Rule แทนที่จะเลือกต้นไม้ที่ทำผลงานได้ดีที่สุดแบบเป๊ะๆ เราจะเลือก ต้นไม้ที่เล็กที่สุด (เรียบง่ายที่สุด) ที่มีค่าความผิดพลาดอยู่ภายในระยะหนึ่งค่าความคลาดเคลื่อนมาตรฐาน (standard error) จากค่าความผิดพลาดต่ำสุดนั้น
ทำไมถึงทำแบบนั้น? เพราะในโลกของนักคณิตศาสตร์ประกันภัย เราชอบ parsimony (ความกระชับ/เรียบง่าย) โมเดลที่เรียบง่ายกว่ามีโอกาส overfit น้อยกว่า และอธิบายให้ผู้มีส่วนได้ส่วนเสียฟังได้ง่ายกว่าครับ!
5. สรุปและประเด็นสำคัญ
- ต้นไม้ (Trees) สร้างขึ้นโดยใช้ Recursive Binary Splitting ซึ่งเป็นแนวทางแบบ "greedy"
- Regression trees จะทำให้ค่า RSS ต่ำที่สุด ส่วน Classification trees จะทำให้ Gini หรือ Entropy ต่ำที่สุด
- Overfitting เกิดขึ้นเมื่อต้นไม้ซับซ้อนเกินไปและไปเก็บเอาสัญญาณรบกวน (noise) แทนที่จะเป็นรูปแบบหลัก
- Pruning ใช้ Cost Complexity เพื่อหาจุดสมดุลระหว่างความแม่นยำและความเรียบง่าย
- Cross-validation ช่วยให้เราเลือกต้นไม้เวอร์ชันที่ดีที่สุดได้
- จำไว้ว่า: cp สูง = ต้นไม้เล็ก, cp ต่ำ = ต้นไม้ใหญ่
ข้อผิดพลาดที่พบบ่อย: อย่าจำสับสนระหว่าง minbucket กับ minsplit นะครับ Minsplit คือจำนวนข้อมูลขั้นต่ำที่ต้องมีก่อนที่จะ พยายาม แยกกิ่ง ส่วน minbucket คือจำนวนข้อมูลที่ต้อง เหลืออยู่ ในใบผลลัพธ์สุดท้าย
สู้ต่อไปครับ! โมเดลประเภทต้นไม้เป็นรากฐานสำหรับเทคนิคขั้นสูงอย่าง Random Forests และ Boosting ถ้าคุณแม่นยำพื้นฐานเหล่านี้ ก็ถือว่าผ่านครึ่งทางไปแล้ว!