0Pricing
R Academy · บทเรียน

ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล

สร้างและแสดงภาพต้นไม้ตัดสินใจด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ต้นไม้ตัดสินใจ: พื้นฐานของโมเดล ансамбเบิล
  2. ป่าสุ่มด้วย ranger
  3. การเพิ่มพูนแบบเกรเดียนต์ด้วย xgboost
  4. ความสำคัญของคุณลักษณะและการตีความโมเดล
← กลับไปที่ R Academy