ml/ library Learn by doing
ALGORITHM 53 · PYTHON / JAVASCRIPT

Extra Trees

เพิ่มความสุ่มให้ต้นไม้แตกต่างกันยิ่งขึ้น

LEARNING LEVEL3
ผสานหลายแนวคิดควรรู้มาก่อน · Decision Tree และ Bagging
ลองใน Playground

01Overall Concept

OVERALL CONCEPT

ไอเดียหลัก — Extra Trees คล้าย Random Forest แต่เพิ่มความสุ่มตอนเลือกจุดตัดของคำถาม แทนที่จะค้นหาจุดที่ดีที่สุดทุกครั้ง โมเดลลองจุดตัดแบบสุ่มหลายจุดแล้วเลือกจากตัวเลือกเหล่านั้น จึงฝึกเร็วและได้ต้นไม้ที่แตกต่างกันมาก

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

ตัวอย่างการนำไปใช้ — จำแนกหรือทำนายจากข้อมูลตาราง สร้าง baseline ที่ฝึกเร็ว และเปรียบเทียบกับ Random Forest เมื่ออยากเพิ่มความหลากหลายของต้นไม้

02อธิบายภาษาคนเข้าใจง่ายๆ

เล่าแบบไม่ใช้ศัพท์ยาก

Extra Trees หรือ Extremely Randomized Trees คล้าย Random Forest มาก แต่ใส่ความสุ่มเข้าไปเยอะกว่าอีก

Random Forest ตอนแตกกิ่งยังพยายามหาจุดแบ่งที่ดีในกลุ่มตัวแปรที่สุ่มมา

Extra Trees บอกประมาณว่า

“สุ่มจุดแบ่งไปเลยหลายๆ แบบ แล้วดูผลรวม”

ดูเหมือนจะมั่วกว่า แต่ความมั่วนี้มีประโยชน์

เพราะปัญหาหนึ่งของ Machine Learning คือโมเดลอาจ “พยายามฉลาดกับข้อมูลเก่ามากเกินไป”

Extra Trees บังคับให้แต่ละต้นมีความแตกต่างกันสูงมาก จึงลดโอกาสที่ทั้งป่าจะหลง pattern เดียวกัน

บาง dataset ทำงานได้ดีกว่า Random Forest และมัก Train เร็วด้วย

แต่แลกกับ Bias ที่อาจเพิ่มขึ้น เพราะมันไม่ได้พยายามหาจุดแบ่งดีที่สุดทุกครั้ง

ภาพจำ: Random Forest คือกรรมการหลายคน ส่วน Extra Trees คือกรรมการหลายคนที่จงใจให้แต่ละคนใช้มุมมองคนละแบบแบบสุดๆ

03How it works

ค่อยๆ ทำไปด้วยกัน ตั้งแต่ข้อมูลแถวแรกจนถึงการตรวจคำตอบ

  1. เตรียมโจทย์เดียวกับ Random Forest เพื่อเทียบกัน

    ให้ X เป็น feature ลูกค้าและ y เป็นซื้อซ้ำ/ไม่ซื้อซ้ำ ใช้ train/test ชุดเดียวกับป่าเดิม รวมถึง encoder ชุดเดียวกัน เราจะเปลี่ยนวิธีสร้างต้นไม้ เพื่อดูว่าการเพิ่มความสุ่มช่วยกับข้อมูลนี้หรือไม่

  2. สุ่มถึงระดับจุดตัด

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

  3. ข้อมูลที่ต้นไม้เห็นต่างจาก Bagging ตรงไหน

    ExtraTreesClassifier ตั้งต้น bootstrap=False จึงใช้แถวฝึกทั้งหมดกับแต่ละต้นได้ ความหลากหลายมาจาก feature และ threshold ที่สุ่ม หากตั้ง bootstrap=True จึงค่อยเพิ่มการสุ่มแถวแบบใส่คืนเข้ามา ประเด็นนี้ช่วยให้เข้าใจว่าชื่อ ensemble ไม่ได้แปลว่าต้องสร้างถุงข้อมูลเสมอ

  4. ตั้งค่าที่ทดลองต่อได้

    เริ่ม ExtraTreesClassifier(n_estimators=100, max_features='sqrt', min_samples_leaf=2, random_state=42) แล้ว fit(X_train, y_train) n_estimators เพิ่มจำนวนต้น min_samples_leaf ช่วยคุมการแตกกิ่งละเอียด และ max_features คุมผู้สมัครต่อ node ตอน predict จะเฉลี่ย probability ของต้นไม้แล้วเลือกคลาส ส่วนรุ่น Regressor เฉลี่ยตัวเลข

  5. ตัดสินจากผลรวม ไม่ใช่ความสุ่ม

    เทียบคะแนน test และเวลาฝึกกับ Random Forest โดยปรับค่าบน validation เท่านั้น ลองเพิ่ม min_samples_leaf ถ้าทายข้อมูลใหม่ไม่นิ่ง หรือเพิ่ม n_estimators ถ้าผลเปลี่ยนมากเมื่อเปลี่ยน random_state ถ้าทั้ง train และ validation แย่ อาจแบ่งหยาบเกินไปหรือข้อมูลยังไม่พอ ความสุ่มมากขึ้นจึงไม่ได้รับประกันว่าจะดีขึ้นทุกชุด

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

ข้อมูล พารามิเตอร์ และภาพรวมการคำนวณ

DATA INX · featuresy · targetX = ตารางลูกค้าเดียวกับ Random Forest · y = ซื้อซ้ำ / ไม่ซื้อซ้ำ
CALCULATEExtra Trees
n_estimatorsmax_featuresmin_samples_leaf
RESULT0.800.150.05class / probabilityสุ่ม feature + threshold → เฉลี่ย probability ของทุกต้น
เส้นทางของข้อมูล: จากค่าที่รับเข้า ผ่านการคำนวณด้วยพารามิเตอร์ ไปเป็นผลลัพธ์
INPUT

ข้อมูลที่รับเข้ามา

รับ X และ y แบบ Random Forest แต่สร้างต้นไม้ที่สุ่มมากขึ้นเพื่อให้สมาชิกแตกต่างและลดเวลาหาจุดแบ่ง

X = ตารางลูกค้าเดียวกับ Random Forest · y = ซื้อซ้ำ / ไม่ซื้อซ้ำ
PARAMETERS

พารามิเตอร์ที่ใช้

n_estimators
จำนวนต้นไม้แบบสุ่มที่นำมารวม
max_features
จำนวน feature ที่สุ่มมาพิจารณาต่อ node
min_samples_leaf
จำนวนตัวอย่างขั้นต่ำที่ปลายกิ่งต้องเก็บ
OUTPUT

ผลลัพธ์ที่ได้

ได้คำทำนายรวม probability และ feature importance คล้าย Random Forest แต่มีความสุ่มมากกว่า

สุ่ม feature + threshold → เฉลี่ย probability ของทุกต้น
CALCULATION

คำนวณทีละขั้น

  1. 01

    ค่าเริ่มต้นใช้แถวฝึกทั้งหมด (bootstrap=False) แล้วสุ่ม feature ที่ node ปัจจุบัน

  2. 02

    สุ่ม threshold ให้แต่ละ feature แทนการไล่ค้นทุกจุด แล้วเลือกตัวที่ดีที่สุดในกลุ่มสุ่ม

  3. 03

    สร้างต้นไม้หลายต้นแล้วเฉลี่ย probability สำหรับ Classifier หรือเฉลี่ยค่าตัวเลขสำหรับ Regressor

ควรรู้อีกนิด — ความสุ่มมากอาจเพิ่ม bias และโมเดลรวมยังอธิบายยากกว่าต้นไม้เดี่ยว

04Make it yours

Python · scikit-learn
# ติดตั้ง: pip install numpy scikit-learn matplotlibfrom sklearn.ensemble import ExtraTreesClassifierfrom sklearn.metrics import accuracy_score from sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_split X, y = make_classification(    n_samples=150, n_features=2, n_redundant=0,    n_informative=2, n_classes=3, n_clusters_per_class=1,    class_sep=1.4, random_state=42,)X_train, X_test, y_train, y_test = train_test_split(    X, y, test_size=0.2, random_state=42, stratify=y) model = ExtraTreesClassifier(n_estimators=15, random_state=42)model.fit(X_train, y_train)pred = model.predict(X_test)print("Accuracy:", accuracy_score(y_test, pred))

โค้ดเปลี่ยนตามค่าที่เลือกใน Playground · แต่ละภาษาใช้ข้อมูลตัวอย่างตามที่ระบุในโค้ด

05Learn by playing

ปรับ จำนวน estimators แล้วสังเกตรูปแบบคำทำนายและตัวชี้วัดที่คำนวณใหม่ทันที

Sample dataset / Three classes● คำนวณใหม่เมื่อปรับค่า
เพิ่มต้นไม้เพื่อเฉลี่ยความสุ่มของ threshold
พื้นที่สีคือคำทำนาย จุดคือคำตอบจริงFeature x → · Feature y ↑ · ขอบเข้ม = ชุดทดสอบ
Test accuracy93.3%
ลักษณะการรวมเสียงข้างมาก
พารามิเตอร์ที่ลอง15

Playground เป็น implementation เพื่อการเรียนรู้ที่คำนวณในเบราว์เซอร์ ส่วนโค้ด Python ใช้ scikit-learn จึงอาจให้ค่าต่างกันเล็กน้อยจากรายละเอียดการ optimize และค่าเริ่มต้นของไลบรารี ผลนี้ไม่ใช่ benchmark บนข้อมูลจริง