ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล
สร้างและแสดงภาพต้นไม้ตัดสินใจด้วย rpart พร้อมทำความเข้าใจความแลกเปลี่ยนระหว่างไบแอสกับความแปรปรวน
ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
วิธีที่ต้นไม้ตัดสินใจแบ่งข้อมูล
ต้นไม้ตัดสินใจจะแบ่งพื้นที่คุณลักษณะออกเป็นบริเวณรูปสี่เหลี่ยมซ้ำ ๆ กัน ในแต่ละโหนด อัลกอริทึมจะค้นหาคุณลักษณะทั้งหมดและจุดแบ่งที่เป็นไปได้ทั้งหมด เพื่อหาจุดแบ่งที่แยกตัวแปรเป้าหมายได้ดีที่สุด ผลลัพธ์คือต้นไม้ของกฎแบบถ้า-มิฉะนั้น
library(rpart)
# Fit a classification tree
tree <- rpart(
Species ~ .,
data = iris,
method = 'class' # use 'anova' for regression
)
print(tree)เกณฑ์การแบ่งแบบ GINI เทียบกับเอนโทรปี
เกณฑ์การแบ่งใช้วัดความไม่บริสุทธิ์ของโหนด ความไม่บริสุทธิ์แบบ Gini วัดความน่าจะเป็นที่จะจำแนกองค์ประกอบที่สุ่มเลือกผิดประเภท ส่วน เอนโทรปี (การเพิ่มขึ้นของสารสนเทศ) วัดการลดลงของความไม่เป็นระเบียบด้านสารสนเทศ โดยทั่วไปทั้งสองวิธีให้ต้นไม้ที่คล้ายกัน แต่ GINI คำนวณได้เร็วกว่าและเป็นค่าเริ่มต้นของ rpart
# Default: Gini impurity (parms = list(split = 'gini'))
tree_gini <- rpart(Species ~ ., data = iris, method = 'class')
# Using information gain (entropy)
tree_entropy <- rpart(
Species ~ ., data = iris, method = 'class',
parms = list(split = 'information')
)
cat('Gini root split:', tree_gini$frame$var[1])
cat('Entropy root split:', tree_entropy$frame$var[1])printcp() — ตารางความซับซ้อน
printcp(tree) แสดงตารางพารามิเตอร์ความซับซ้อน (CP) แต่ละแถวแสดงขนาดของต้นไม้ (จำนวนการแบ่ง) ค่าความคลาดเคลื่อนสัมพัทธ์บนข้อมูลฝึก และค่าความคลาดเคลื่อนจากการตรวจสอบไขว้ (xerror) ตาราง CP ใช้สำหรับหาระดับการตัดแต่งที่เหมาะสมที่สุด
tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova',
control = rpart.control(minsplit = 5, cp = 0.001))
printcp(tree)
# Identify the CP with minimum cross-validated error
best_cp <- tree$cptable[
which.min(tree$cptable[, 'xerror']),
'CP'
]
cat('Best CP:', best_cp)prune() — ตัดแต่งต้นไม้
prune(tree, cp) ตัดแต่งต้นไม้ให้กลับมาอยู่ที่ระดับความซับซ้อนที่ระบุโดย cp การตัดแต่งช่วยป้องกันการเรียนรู้มากเกินไปโดยยุบกิ่งที่ให้ประโยชน์ในการพยากรณ์เพียงเล็กน้อย แนวทางมาตรฐานคือหา CP ที่ทำให้ค่าความคลาดเคลื่อนจาก CV ต่ำที่สุด แล้วจึงตัดแต่งต้นไม้
best_cp <- tree$cptable[
which.min(tree$cptable[, 'xerror']), 'CP'
]
pruned_tree <- prune(tree, cp = best_cp)
cat('Original tree nodes:', nrow(tree$frame))
cat('Pruned tree nodes:', nrow(pruned_tree$frame))rpart.plot() — แสดงภาพต้นไม้
rpart.plot(tree) จากแพ็กเกจ rpart.plot สร้างภาพต้นไม้ตัดสินใจที่ดูสะอาดตาและมีการใช้สี แต่ละโหนดภายในจะแสดงกฎการแบ่ง ส่วนใบไม้แต่ละใบจะแสดงคลาสที่พยากรณ์และสัดส่วนของตัวอย่างฝึก
library(rpart.plot)
tree <- rpart(Species ~ ., data = iris, method = 'class')
pruned <- prune(tree, cp = 0.02)
rpart.plot(
pruned,
type = 4, # split labels on branches
extra = 104, # show class + probability
fallen.leaves = TRUE
)การแลกเปลี่ยนระหว่างอคติกับความแปรปรวน
ต้นไม้ที่ลึกและไม่ได้ตัดแต่งมีอคติต่ำ (เข้ากับข้อมูลฝึกได้เกือบสมบูรณ์) แต่มีความแปรปรวนสูง (การเปลี่ยนแปลงข้อมูลเพียงเล็กน้อยอาจทำให้ได้ต้นไม้ที่แตกต่างกันมาก) ต้นไม้ที่ตื้นหรือตัดแต่งแล้วมีอคติสูงกว่า แต่มีความแปรปรวนต่ำกว่า ต้นไม้ที่เหมาะสมต้องสร้างสมดุลระหว่างแหล่งที่มาของความคลาดเคลื่อนทั้งสองนี้
วิธีการแบบกลุ่ม เช่น ป่าไม้สุ่มและการบูสต์ จัดการกับการแลกเปลี่ยนนี้โดยตรง
# Deep tree = low bias, high variance (overfits)
deep_tree <- rpart(medv ~ ., data = MASS::Boston,
control = rpart.control(minsplit = 2, cp = 0))
# Shallow tree = high bias, low variance (underfits)
shallow_tree <- rpart(medv ~ ., data = MASS::Boston,
control = rpart.control(maxdepth = 2))
cat('Deep nodes:', nrow(deep_tree$frame))
cat('Shallow nodes:', nrow(shallow_tree$frame))การเรียนรู้มากเกินไปของต้นไม้ตัดสินใจ
ต้นไม้ที่ไม่ได้ตัดแต่งอาจทำให้ค่าความคลาดเคลื่อนบนข้อมูลฝึกเป็นศูนย์ได้ด้วยการจดจำตัวอย่างฝึกทุกตัว เมื่อประเมินต้นไม้เดียวกันกับข้อมูลที่ไม่เคยเห็นมาก่อน ประสิทธิภาพจะลดลงอย่างมาก นี่คือตัวอย่างคลาสสิกของการเรียนรู้มากเกินไปในการเรียนรู้แบบมีผู้สอน
set.seed(42)
train_idx <- sample(nrow(MASS::Boston), 400)
train_bos <- MASS::Boston[train_idx, ]
test_bos <- MASS::Boston[-train_idx, ]
# Fully grown tree
full <- rpart(medv ~ ., data = train_bos,
control = rpart.control(cp = 0, minsplit = 2))
train_pred <- predict(full, train_bos)
test_pred <- predict(full, test_bos)
cat('Train RMSE:', sqrt(mean((train_pred - train_bos$medv)^2)))
cat('Test RMSE:', sqrt(mean((test_pred - test_bos$medv)^2)))ความสำคัญของตัวแปรจาก rpart
rpart บันทึกค่า variable.importance สำหรับตัวแปรทำนายแต่ละตัว ซึ่งคือผลรวมของการปรับปรุงเกณฑ์การแบ่งที่เป็นผลจากตัวแปรนั้นตลอดการแบ่งทั้งหมด ค่านี้ช่วยบ่งชี้ได้อย่างรวดเร็วว่าคุณลักษณะใดมีอิทธิพลต่อการตัดสินใจของแบบจำลอง
tree <- rpart(medv ~ ., data = MASS::Boston, method = 'anova')
# Variable importance (sorted)
imp <- sort(tree$variable.importance, decreasing = TRUE)
print(imp)
# Quick barplot
barplot(imp, las = 2, main = 'Variable Importance',
col = 'steelblue', cex.names = 0.8)จากต้นไม้สู่แบบจำลองกลุ่ม
ต้นไม้ตัดสินใจต้นเดียวไม่เสถียร: การสุ่มตัวอย่างข้อมูลใหม่ทำให้ได้ต้นไม้ที่แตกต่างกันมาก วิธีการแบบกลุ่มใช้ประโยชน์จากความไม่เสถียรนี้:
- การรวมแบบแบ็กกิง / ป่าไม้สุ่ม: หาค่าเฉลี่ยจากต้นไม้จำนวนมากที่สร้างบนตัวอย่างบูตสแตรป
- การบูสต์: สร้างต้นไม้ต่อเนื่องกัน โดยแต่ละต้นแก้ไขข้อผิดพลาดของต้นก่อนหน้า
- ทั้งสองวิธีลดความแปรปรวน ขณะยังคงความสามารถในการแสดงรูปแบบที่ซับซ้อนของต้นไม้ไว้
# Demonstrating instability of a single tree
set.seed(1); t1 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
set.seed(2); t2 <- rpart(medv ~ ., data = MASS::Boston[sample(506, 400), ])
# Root split may differ between trees
cat('Tree 1 root split:', t1$frame$var[1])
cat('Tree 2 root split:', t2$frame$var[1])พารามิเตอร์ควบคุม rpart
rpart.control() ควบคุมวิธีการเติบโตของต้นไม้ พารามิเตอร์สำคัญ ได้แก่ cp (ค่าปรับความซับซ้อน), minsplit (จำนวนข้อสังเกตขั้นต่ำที่จะลองแบ่ง), minbucket (ขนาดใบไม้ขั้นต่ำ) และ maxdepth การทำความเข้าใจพารามิเตอร์เหล่านี้เป็นสิ่งจำเป็นสำหรับการปรับแต่งแบบจำลองที่ใช้ต้นไม้
ctrl <- rpart.control(
cp = 0.005, # complexity penalty
minsplit = 20, # min obs to try a split
minbucket = 7, # min obs in any leaf
maxdepth = 10 # max tree depth
)
tree <- rpart(medv ~ ., data = MASS::Boston,
method = 'anova', control = ctrl)
printcp(tree)การประเมินประสิทธิภาพของต้นไม้
หลังการตัดแต่ง ให้ประเมินต้นไม้กับชุดทดสอบที่กันไว้นอกการฝึก สำหรับการถดถอย ให้คำนวณ RMSE และ R-squared ส่วนการจำแนกประเภท ให้คำนวณความแม่นยำและเมทริกซ์ความสับสน เปรียบเทียบตัวชี้วัดเหล่านี้กับแบบจำลองมาตรฐานเพื่อทำความเข้าใจว่าต้นไม้ต้นเดียวให้ประโยชน์มากน้อยเพียงใด
pruned_tree <- prune(tree, cp = best_cp)
test_pred <- predict(pruned_tree, newdata = test_bos)
rmse <- sqrt(mean((test_pred - test_bos$medv)^2))
ss_res <- sum((test_pred - test_bos$medv)^2)
ss_tot <- sum((test_bos$medv - mean(test_bos$medv))^2)
r2 <- 1 - ss_res / ss_tot
cat('RMSE:', round(rmse, 3))
cat('R2:', round(r2, 3))ตรวจสอบความเข้าใจ
ข้อความใดอธิบายจุดประสงค์ของการเรียกใช้ prune(tree, cp = best_cp) ได้ดีที่สุด
ทบทวนต้นไม้ตัดสินใจ
ประเด็นสำคัญจากต้นไม้ตัดสินใจ — รากฐานของแบบจำลองกลุ่ม:
- ต้นไม้แบ่งพื้นที่ของคุณลักษณะแบบเวียนเกิด การแบ่งใช้เกณฑ์ Gini หรือเอนโทรปี
rpart(y ~ ., data, method)ใช้สร้างต้นไม้ ส่วนprintcp()แสดงตารางความซับซ้อน- หา CP ที่ทำให้ค่าความคลาดเคลื่อนจากการตรวจสอบไขว้ต่ำที่สุด แล้วใช้
prune(tree, cp) rpart.plot()แสดงโครงสร้างต้นไม้เป็นภาพ- ต้นไม้ที่ลึกเรียนรู้มากเกินไป (อคติต่ำ ความแปรปรวนสูง) ส่วนต้นไม้ที่ตื้นเรียนรู้ไม่เพียงพอ
tree$variable.importanceจัดอันดับตัวแปรทำนายตามผลรวมการปรับปรุงจากการแบ่ง- วิธีการแบบกลุ่ม (ป่าไม้สุ่มและการบูสต์) แก้ปัญหาความไม่เสถียรของต้นไม้ต้นเดียว
# Standard rpart workflow
tree <- rpart(y ~ ., data = train, method = 'anova',
control = rpart.control(cp = 0.001))
best_cp <- tree$cptable[which.min(tree$cptable[, 'xerror']), 'CP']
pruned <- prune(tree, cp = best_cp)
test_pred <- predict(pruned, newdata = test)
rmse <- sqrt(mean((test_pred - test$y)^2))
cat('Pruned Tree RMSE:', rmse)คำถามที่พบบ่อย
บทเรียน “ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล”
สร้างและแสดงภาพต้นไม้ตัดสินใจด้วย rpart พร้อมทำความเข้าใจความแลกเปลี่ยนระหว่างไบแอสกับความแปรปรวน คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล
- ป่าสุ่มด้วย ranger
- การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost
- ความสำคัญของคุณลักษณะและการตีความโมเดล