0. ทบทวนพื้นฐานก่อนเรียน Random Forest
Machine Learning Model คือแบบจำลองที่สร้างขึ้นเพื่อให้คอมพิวเตอร์เรียนรู้รูปแบบจากข้อมูลเดิม แล้วนำรูปแบบนั้นไปใช้ทำนายหรือจำแนกข้อมูลใหม่ เช่น ทำนายราคาบ้าน จำแนกอีเมลสแปม หรือทำนายโอกาสเกิดโรค
Random Forest อยู่ในกลุ่ม Supervised Learning เพราะต้องใช้ข้อมูลที่มีคำตอบหรือป้ายกำกับ เช่น ข้อมูลคุณลักษณะของดอกไม้พร้อมชนิดดอกไม้ หรือข้อมูลสภาพอากาศพร้อมคำตอบว่าฝนตกหรือไม่
Learning Objectives
บทนี้ช่วยให้ผู้เรียนต่อยอดจาก Decision Tree ไปสู่โมเดล Ensemble ที่เสถียรขึ้น และสามารถนำไปใช้กับข้อมูลจริงได้หลากหลาย
ภาพที่ 1 กระบวนการพื้นฐานของ Supervised Learning ก่อนเข้าสู่ Random Forest
Supervised Learning
เรียนรู้จากข้อมูลที่มี Label ใช้ได้กับ Classification และ Regression
Unsupervised Learning
เรียนรู้จากข้อมูลที่ไม่มี Label เช่น การจัดกลุ่มลูกค้าตามพฤติกรรม
Train/Test Split
แบ่งข้อมูลเป็นชุดฝึกและชุดทดสอบ เช่น 70/30, 80/20 หรือ 90/10
K-Fold Cross-Validation
แบ่งข้อมูลเป็น K ส่วน วนฝึกและทดสอบหลายรอบ แล้วเฉลี่ยผลลัพธ์
Training Set, Test Set และ Cross-Validation
Training Set คือข้อมูลที่ใช้ให้โมเดลเรียนรู้รูปแบบและความสัมพันธ์ระหว่าง Features กับ Labels ส่วน Test Set คือข้อมูลที่โมเดลไม่เคยเห็นมาก่อน ใช้ประเมินความสามารถในการทำนายข้อมูลใหม่ หรือ Generalization
K-Fold Cross-Validation ช่วยให้การประเมินน่าเชื่อถือขึ้น โดยแบ่งข้อมูลเป็น K ส่วน แล้วสลับกันใช้แต่ละส่วนเป็นชุดทดสอบ ค่า K ที่นิยมใช้คือ 5 หรือ 10
7.1 ความหมายของ Random Forest
Random Forest หรือ ป่าแบบสุ่ม เป็นอัลกอริทึม Machine Learning แบบ Supervised Learning ใช้ได้ทั้งงาน Classification และ Regression โดยสร้าง Decision Tree หลายต้น แล้วรวมผลลัพธ์ของต้นไม้เหล่านั้นเพื่อให้ได้คำตอบที่แม่นยำและเสถียรกว่าการใช้ Decision Tree เพียงต้นเดียว
ถ้า Decision Tree เปรียบเหมือน “ผู้เชี่ยวชาญ 1 คน” Random Forest จะเปรียบเหมือน “คณะกรรมการผู้เชี่ยวชาญหลายคน” ที่แต่ละคนเห็นข้อมูลบางส่วนและใช้มุมมองต่างกัน จากนั้นนำคำตอบมารวมกันเพื่อหาคำตอบสุดท้าย
สูตรจำง่าย
Random Forest = Decision Tree หลายต้น + Bootstrap Sampling + Random Feature Selection + Majority Vote / Average
แนวคิด Ensemble Learning, Bagging และ Randomness
Random Forest เป็นเทคนิคในกลุ่ม Ensemble Learning คือการนำโมเดลหลายตัวมาทำงานร่วมกัน เพื่อให้ผลลัพธ์สุดท้ายดีกว่าโมเดลเดี่ยว จุดสำคัญคือทำให้ต้นไม้แต่ละต้นมีความหลากหลาย ไม่เหมือนกันจนเกินไป
ภาพที่ 2 Random Forest ใช้ Decision Tree หลายต้น แล้วรวมผลลัพธ์ด้วยเสียงข้างมาก
7.2 คุณสมบัติหลักของ Random Forest
Ensemble Method
ใช้โมเดลหลายตัวร่วมกัน โดย Random Forest รวม Decision Tree หลายต้นเพื่อเพิ่มความแม่นยำ
Bagging
ใช้ Bootstrap Aggregating โดยสุ่มตัวอย่างข้อมูลหลายชุดเพื่อสร้างต้นไม้หลายต้น
Random Feature Selection
ในแต่ละจุดแตกกิ่ง จะสุ่มเลือกเฉพาะบาง Feature เพื่อลดความเหมือนกันของต้นไม้
ลด Overfitting
การรวมผลจากหลายต้นไม้ช่วยลดการยึดติดกับข้อมูลฝึกมากเกินไป
Feature Importance
สามารถประเมินได้ว่า Feature ใดมีผลต่อการตัดสินใจของโมเดลมากที่สุด
รองรับงานหลายรูปแบบ
ใช้ได้กับ Classification, Regression และข้อมูลที่มีความสัมพันธ์ไม่เป็นเชิงเส้น
7.3 กระบวนการทำงานของ Random Forest
Random Forest สร้างต้นไม้หลายต้นจากข้อมูลที่สุ่มแตกต่างกัน จากนั้นให้ต้นไม้แต่ละต้นทำนายผล แล้วนำผลทำนายมารวมกัน
ภาพที่ 3 ขั้นตอนหลักของ Random Forest ตั้งแต่ข้อมูลฝึกสอนไปจนถึงการรวมผลลัพธ์
Bootstrap Sampling
สุ่มตัวอย่างข้อมูลจากชุดฝึกสอน โดยบางรายการอาจถูกเลือกซ้ำและบางรายการอาจไม่ถูกเลือก
Random Feature Selection
ในแต่ละจุดแตกกิ่งของต้นไม้ จะสุ่มใช้เฉพาะบาง Feature ทำให้ต้นไม้แต่ละต้นแตกต่างกัน
สร้าง Decision Tree หลายต้น
แต่ละต้นเรียนรู้จากข้อมูลสุ่มและ Feature สุ่ม ทำให้มีมุมมองหลากหลาย
รวมผลลัพธ์
Classification ใช้ Majority Vote ส่วน Regression ใช้ค่าเฉลี่ยของผลทำนาย
7.4 การจำแนกข้อมูลด้วยวิธี Random Forest
การจำแนกข้อมูลด้วย Random Forest คือการใช้ต้นไม้ตัดสินใจหลายต้นเพื่อทำนายว่าข้อมูลใหม่ควรอยู่ในคลาสใด เช่น ดอกไม้ชนิดใด ฝนตกหรือไม่ อีเมลเป็นสแปมหรือไม่ หรือผู้ป่วยมีแนวโน้มเป็นโรคเบาหวานหรือไม่
ข้อดีสำคัญคือ Random Forest มักให้ผลลัพธ์เสถียรกว่า Decision Tree เดี่ยว เพราะไม่ได้พึ่งพาต้นไม้เพียงต้นเดียว แต่ใช้การตัดสินใจร่วมกันจากหลายต้นไม้
ภาพที่ 4 ตัวอย่างการรวมผลแบบ Majority Vote สำหรับงาน Classification
| งานจำแนกข้อมูล | Feature ตัวอย่าง | Label ที่ต้องการทำนาย |
|---|---|---|
| Iris Classification | sepal length, sepal width, petal length, petal width | Setosa, Versicolor, Virginica |
| Weather Prediction | Temperature, Humidity, Wind Speed, Pressure | Rain: Yes / No |
| Spam Detection | คำสำคัญ ความยาวข้อความ คำที่พบบ่อยในสแปม | Spam / Not Spam |
| Diabetes Classification | Glucose, BloodPressure, BMI, Age และตัวแปรสุขภาพอื่น | Normal / Diabetic |
7.5 ขั้นตอนในการจำแนกข้อมูลด้วย Random Forest
กำหนดโจทย์และรวบรวมข้อมูล
ระบุว่าต้องการจำแนกอะไร เช่น ฝนตก/ไม่ตก หรือประเภทดอกไม้ แล้วรวบรวมข้อมูลให้เพียงพอ
เตรียมข้อมูล
จัดข้อมูลเป็นตาราง แยก Feature และ Label ตรวจสอบค่าว่าง ข้อมูลซ้ำ และค่าผิดปกติ
แบ่ง Train/Test หรือใช้ Cross-Validation
แบ่งข้อมูลเพื่อประเมินโมเดลอย่างเป็นธรรม ไม่ให้โมเดลทดสอบกับข้อมูลที่ใช้ฝึก
สร้างโมเดล Random Forest
กำหนดจำนวนต้นไม้ เช่น n_estimators=100 และกำหนดพารามิเตอร์อื่นตามความเหมาะสม
ฝึกสอนและทำนายผล
ใช้ Training Set ฝึกโมเดล แล้วใช้ Test Set ทำนายผล
ประเมินและตีความ
ดู Accuracy, Precision, Recall, F1-score, Confusion Matrix และ Feature Importance
7.6 ข้อดีและข้อจำกัดของ Random Forest
ข้อดี
- ความแม่นยำสูงและเสถียร
- ลดปัญหา Overfitting เมื่อเทียบกับ Decision Tree เดี่ยว
- รองรับข้อมูลซับซ้อนและไม่เป็นเชิงเส้น
- ทนต่อ Noise ได้พอสมควร
- วัด Feature Importance ได้
ข้อจำกัด
- ตีความยากกว่า Decision Tree เดี่ยว
- ใช้ทรัพยากรมากขึ้นเมื่อจำนวนต้นไม้มาก
- โมเดลมีขนาดใหญ่กว่า
- อาจไม่เหมาะกับงานที่ต้องการอธิบายกฎแบบง่ายมาก ๆ
พารามิเตอร์สำคัญ
| พารามิเตอร์ | ความหมาย | คำแนะนำเบื้องต้น |
|---|---|---|
n_estimators | จำนวนต้นไม้ในป่า | เริ่มที่ 100 แล้วเพิ่มหากต้องการความเสถียร |
max_depth | ความลึกสูงสุดของต้นไม้ | จำกัดความลึกเพื่อลด Overfitting |
max_features | จำนวน Feature ที่สุ่มพิจารณาแต่ละ split | ค่าเริ่มต้นมักเหมาะสม แต่สามารถปรับเพื่อเพิ่มความหลากหลาย |
min_samples_split | จำนวนตัวอย่างขั้นต่ำก่อนแตกกิ่ง | เพิ่มค่านี้เพื่อลดความซับซ้อนของต้นไม้ |
random_state | กำหนดค่าการสุ่มให้ได้ผลซ้ำได้ | ใช้ในการสอนและทดลองเพื่อให้เปรียบเทียบผลได้ |
7.7 ตัวอย่างการประยุกต์ใช้ Random Forest
Iris Classification
จำแนกชนิดดอกไม้จากความยาวและความกว้างของกลีบเลี้ยงและกลีบดอก
Weather Prediction
ทำนายฝนตกจากอุณหภูมิ ความชื้น ความเร็วลม และความกดอากาศ
Spam Detection
จำแนกอีเมลหรือ SMS ว่าเป็น Spam หรือ Not Spam
Health Analytics
จำแนกความเสี่ยงโรค เช่น เบาหวานหรือโรคอื่นจากข้อมูลสุขภาพ
ต้องการนำ Random Forest ไปใช้กับข้อมูลจริง?
Siam2Dev ช่วยออกแบบชุดข้อมูล สร้างโมเดล Classification / Regression ทำ Dashboard วิเคราะห์ Feature Importance และจัดทำรายงานผลสำหรับธุรกิจ งานวิจัย และการเรียนการสอน
ตัวอย่าง Python: Random Forest กับ Iris Dataset
ตัวอย่างนี้ใช้ RandomForestClassifier จาก scikit-learn เพื่อสร้างโมเดลจำแนกชนิดดอกไม้ Iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.datasets import load_iris
# โหลดข้อมูล Iris
data = load_iris()
X = data.data
y = data.target
# แบ่งข้อมูลเป็นชุดฝึกสอนและชุดทดสอบ
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.30, random_state=42, stratify=y
)
# สร้างโมเดล Random Forest
model = RandomForestClassifier(
n_estimators=100,
max_depth=None,
random_state=42
)
# ฝึกสอนโมเดล
model.fit(X_train, y_train)
# ทำนายผล
y_pred = model.predict(X_test)
# ประเมินผล
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100))
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, target_names=data.target_names))ตัวอย่างการทำนายข้อมูลใหม่
unknown_data = [
[5.1, 3.5, 1.4, 0.2],
[6.2, 3.4, 5.4, 2.3],
[5.9, 3.0, 4.2, 1.5]
]
for i, sample in enumerate(unknown_data, start=1):
prediction = model.predict([sample])[0]
flower_name = data.target_names[prediction]
print(f"Unknown data {i}: {sample} -> Predicted class: {flower_name}")ตัวอย่าง Python: Random Forest กับ Weather Dataset
ตัวอย่างนี้สร้างข้อมูลสภาพอากาศแบบง่าย เพื่อทำนายว่าฝนตกหรือไม่ เหมาะสำหรับการสอนแนวคิด Classification
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
data = {
'Temperature': [30, 25, 20, 28, 22, 19, 35, 24, 31, 21, 29, 18],
'Humidity': [70, 80, 90, 60, 85, 75, 55, 88, 62, 92, 65, 96],
'WindSpeed': [5, 3, 8, 6, 7, 2, 9, 4, 6, 10, 5, 8],
'Pressure': [1010, 1020, 1005, 1015, 1008, 1012, 1013, 1007, 1014, 1004, 1011, 1003],
'Rain': ['No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'No', 'Yes', 'No', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(data)
df['Rain'] = df['Rain'].map({'No': 0, 'Yes': 1})
X = df.drop('Rain', axis=1)
y = df['Rain']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.30, random_state=42, stratify=y
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy: %.2f%%" % (accuracy_score(y_test, y_pred) * 100))
print(classification_report(y_test, y_pred))
unknown_data = pd.DataFrame({
'Temperature': [27, 18, 32],
'Humidity': [65, 95, 60],
'WindSpeed': [4, 10, 7],
'Pressure': [1011, 1006, 1014]
})
predictions = model.predict(unknown_data)
predicted_classes = ['No' if pred == 0 else 'Yes' for pred in predictions]
print(predicted_classes)การประเมินผลโมเดล Random Forest
หลังจากสร้างโมเดลแล้วต้องประเมินผลเพื่อดูว่าโมเดลใช้งานได้ดีหรือไม่ โดยเฉพาะงาน Classification ควรดูมากกว่า Accuracy เพียงค่าเดียว
| ตัวชี้วัด | ความหมาย | เหมาะกับกรณีใด |
|---|---|---|
| Accuracy | สัดส่วนที่ทำนายถูกทั้งหมด | ข้อมูลแต่ละคลาสมีจำนวนใกล้เคียงกัน |
| Precision | ทำนายว่าเป็นคลาสนั้นแล้วถูกกี่ครั้ง | ต้องการลด False Positive |
| Recall | ข้อมูลที่เป็นคลาสนั้นจริง โมเดลจับได้กี่ครั้ง | ต้องการลด False Negative เช่น งานสุขภาพ |
| F1-score | ค่าเฉลี่ยแบบสมดุลของ Precision และ Recall | ข้อมูลไม่สมดุลหรืออยากดูภาพรวมของแต่ละคลาส |
| Confusion Matrix | ตารางเปรียบเทียบค่าจริงและค่าที่โมเดลทำนาย | ตรวจสอบว่าคลาสใดถูกสับสนกับคลาสใด |
Feature Importance: ตัวแปรใดสำคัญที่สุด?
Random Forest สามารถประเมินความสำคัญของ Feature ได้ ช่วยให้ผู้สอนหรือผู้วิจัยอธิบายได้ว่าตัวแปรใดมีผลต่อการตัดสินใจของโมเดลมาก เช่น ใน Iris Dataset มักพบว่าความยาวและความกว้างของกลีบดอกมีผลต่อการจำแนกชนิดดอกไม้สูง
ภาพที่ 5 ตัวอย่างการแสดง Feature Importance จาก Random Forest
import pandas as pd
importance_df = pd.DataFrame({
'Feature': data.feature_names,
'Importance': model.feature_importances_
}).sort_values(by='Importance', ascending=False)
print(importance_df)เปรียบเทียบ Random Forest กับ Decision Tree
| ประเด็น | Decision Tree | Random Forest |
|---|---|---|
| จำนวนโมเดล | ต้นไม้ 1 ต้น | ต้นไม้หลายต้น |
| ความเข้าใจง่าย | เข้าใจง่ายกว่า เห็นกฎชัดเจน | อธิบายยากกว่า เพราะมีหลายต้นไม้ |
| Overfitting | เสี่ยง Overfitting สูงกว่า | ลด Overfitting ได้ดีกว่า |
| ความแม่นยำ | ขึ้นกับข้อมูลและการตัดกิ่ง | มักแม่นยำและเสถียรกว่า |
| การใช้งานจริง | เหมาะกับการอธิบายกฎ | เหมาะกับงานที่ต้องการประสิทธิภาพสูงขึ้น |
7.8 สรุปบทเรียน
Random Forest เป็นเทคนิค Machine Learning ที่ได้รับความนิยมสูงสำหรับงานจำแนกข้อมูลและการทำนายค่า จุดเด่นคือใช้ Decision Tree หลายต้นร่วมกันผ่านแนวคิด Ensemble Learning, Bagging, Bootstrap Sampling และ Random Feature Selection ทำให้มีความแม่นยำสูง ลด Overfitting และรองรับข้อมูลที่มีความซับซ้อนได้ดี
ในการใช้งานจริง ควรให้ความสำคัญกับการเตรียมข้อมูล การแบ่ง Train/Test หรือ Cross-Validation การเลือกจำนวนต้นไม้ การปรับพารามิเตอร์ และการประเมินผลด้วยหลายตัวชี้วัด เพื่อให้โมเดลมีความน่าเชื่อถือและสามารถนำผลไปใช้สนับสนุนการตัดสินใจได้จริง
ใจความสำคัญของบทที่ 7
Random Forest เหมาะสำหรับผู้เรียนที่เข้าใจ Decision Tree แล้ว และต้องการโมเดลที่เสถียรขึ้น แม่นยำขึ้น และนำไปใช้กับข้อมูลจริงได้หลากหลายกว่า Decision Tree เดี่ยว
แบบฝึกหัดท้ายบท
- อธิบายความหมายของ Random Forest ด้วยภาษาของตนเอง
- เปรียบเทียบ Decision Tree กับ Random Forest อย่างน้อย 4 ประเด็น
- อธิบายความหมายของ Bootstrap Sampling และ Majority Vote
- ทดลองเปลี่ยนค่า
n_estimatorsเป็น 10, 50, 100 และ 200 แล้วเปรียบเทียบ Accuracy - สร้างโมเดล Random Forest กับชุดข้อมูล Weather แล้วรายงาน Accuracy, Precision, Recall และ F1-score
- แสดง Feature Importance ของโมเดลและอธิบายว่าตัวแปรใดสำคัญที่สุด