R Academy · บทเรียน

ป่าสุ่มด้วย ranger

ฝึกโมเดลป่าสุ่ม ปรับค่า mtry และ ntrees และประเมินข้อผิดพลาด OOB

บทเรียน 2 จาก 413 ขั้นตอน

ป่าสุ่มด้วย ranger เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

ป่าไม้สุ่มคืออะไร

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

library(ranger)

# Minimal random forest: 500 trees, auto mtry
rf <- ranger(
  medv ~ .,
  data      = MASS::Boston,
  num.trees = 500
)

print(rf)

พารามิเตอร์ mtry

mtry คือจำนวนคุณลักษณะที่สุ่มนำมาพิจารณาในแต่ละการแบ่ง การใช้คุณลักษณะน้อยกว่าจำนวนทั้งหมดช่วยลดความสัมพันธ์ระหว่างต้นไม้ จึงลดความแปรปรวน กฎโดยประมาณคือ mtry = sqrt(p) สำหรับการจำแนกประเภท และ mtry = p/3 สำหรับการถดถอย โดย p คือจำนวนตัวแปรทำนาย

p <- ncol(MASS::Boston) - 1  # number of predictors

rf_class <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = floor(sqrt(4))  # sqrt(p) for classification
)

rf_reg <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = floor(p / 3)    # p/3 for regression
)

cat('Classification OOB Error:', rf_class$prediction.error)
cat('Regression OOB RMSE:', sqrt(rf_reg$prediction.error))

ค่าความคลาดเคลื่อน OOB — การตรวจสอบความถูกต้องโดยไม่เสียค่าใช้จ่าย

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

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = 4
)

# OOB MSE
cat('OOB MSE:', rf$prediction.error)

# OOB RMSE
cat('OOB RMSE:', sqrt(rf$prediction.error))

# For classification: OOB error rate
rf_cl <- ranger(Species ~ ., data = iris)
cat('OOB Error Rate:', rf_cl$prediction.error)

ความสำคัญของตัวแปร

การตั้งค่า importance = 'impurity' จะบันทึกผลรวมการลดความไม่บริสุทธิ์ของโหนด (Gini หรือ MSE) สำหรับคุณลักษณะแต่ละตัวตลอดต้นไม้ทั้งหมด การตั้งค่า importance = 'permutation' จะวัดการสูญเสียความแม่นยำเมื่อสุ่มสลับคุณลักษณะแต่ละตัว วิธีนี้น่าเชื่อถือกว่าแต่ช้ากว่า

rf_imp <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'impurity'
)

# Sorted importance scores
imp <- sort(rf_imp$variable.importance, decreasing = TRUE)
print(imp)

# Quick plot
barplot(imp, las = 2, col = 'steelblue',
        main = 'Random Forest Variable Importance')

การพยากรณ์ด้วย ranger

ใช้ predict(rf, data = test) เพื่อสร้างผลการพยากรณ์ ผลลัพธ์เป็นรายการ ให้เข้าถึงผลการพยากรณ์ด้วย $predictions สำหรับการจำแนกประเภท ผลการพยากรณ์จะเป็นระดับของ factor โดยค่าเริ่มต้น

set.seed(1)
idx   <- sample(nrow(MASS::Boston), 400)
train <- MASS::Boston[idx, ]
test  <- MASS::Boston[-idx, ]

rf <- ranger(medv ~ ., data = train, num.trees = 500)

pred <- predict(rf, data = test)
test_rmse <- sqrt(mean((pred$predictions - test$medv)^2))
cat('Test RMSE:', round(test_rmse, 3))

แนวคิดเมทริกซ์ความสับสน

สำหรับการจำแนกประเภท เมทริกซ์ความสับสนจะแสดงตารางไขว้ระหว่างคลาสจริงกับคลาสที่พยากรณ์ ตัวชี้วัดสำคัญที่คำนวณได้จากเมทริกซ์นี้ ได้แก่ ความแม่นยำ ความเที่ยง (TP / (TP + FP)) ความครอบคลุม (TP / (TP + FN)) และคะแนน F1 ranger มีเมทริกซ์ความสับสน OOB ให้โดยตรง

rf_cl <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = 2
)

# OOB confusion matrix
print(rf_cl$confusion.matrix)

# OOB error rate
cat('OOB Error Rate:', rf_cl$prediction.error)

# Manual accuracy on OOB predictions
# (1 - error rate)
cat('OOB Accuracy:', 1 - rf_cl$prediction.error)

การปรับแต่ง mtry และ num.trees

การเพิ่มจำนวนต้นไม้จะลดความแปรปรวนเสมอ (จนผลที่ได้เริ่มลดลงเมื่อมีประมาณ 300–500 ต้น) พารามิเตอร์ mtry มีค่าที่เหมาะสมช่วงหนึ่ง วงรอบการปรับแต่งอย่างง่ายจะประเมินค่าความคลาดเคลื่อน OOB บนชุดค่าของ mtry เพื่อหาค่าที่เหมาะสม โดยไม่ต้องใช้การตรวจสอบไขว้

mtry_vals <- c(2, 4, 6, 8, 10)
oob_errors <- sapply(mtry_vals, function(m) {
  rf <- ranger(
    medv ~ ., data = MASS::Boston,
    num.trees = 300, mtry = m
  )
  rf$prediction.error
})

best_mtry <- mtry_vals[which.min(oob_errors)]
cat('Best mtry:', best_mtry)
plot(mtry_vals, sqrt(oob_errors), type = 'b',
     xlab = 'mtry', ylab = 'OOB RMSE')

ranger สำหรับการจำแนกประเภท

สำหรับการจำแนกประเภท ให้ตั้งค่า probability = TRUE เพื่อรับผลการพยากรณ์ความน่าจะเป็นของคลาสแทนป้ายกำกับแบบตายตัว ซึ่งจำเป็นสำหรับการคำนวณเส้นโค้ง ROC และค่าประมาณความน่าจะเป็นที่ผ่านการปรับเทียบแล้ว อีกทั้งยังตรงกับรูปแบบผลลัพธ์ที่ตัวชี้วัดของ yardstick คาดไว้

# Ensure the target is a factor
iris$Species <- as.factor(iris$Species)

rf_prob <- ranger(
  Species ~ ., data = iris,
  num.trees   = 300,
  probability = TRUE  # output class probabilities
)

# Predictions are a matrix of probabilities
pred_prob <- predict(rf_prob, data = iris[1:5, ])
print(pred_prob$predictions)

การประมวลผลแบบขนานใน ranger

ranger ได้รับการออกแบบมาให้รวดเร็วและรองรับการประมวลผลแบบขนาน ตั้งค่า num.threads เพื่อใช้แกนประมวลผล CPU ที่มีอยู่ทั้งหมด วิธีนี้อาจเพิ่มความเร็วได้อย่างมากเมื่อเทียบกับแพ็กเกจ randomForest รุ่นเก่า โดยเฉพาะกับชุดข้อมูลขนาดใหญ่ที่มีต้นไม้จำนวนมาก

# Use all available cores
rf_fast <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 1000,
  mtry       = 4,
  num.threads = parallel::detectCores()
)

cat('Trees:', rf_fast$num.trees)
cat('Threads used:', rf_fast$num.threads)
cat('OOB RMSE:', sqrt(rf_fast$prediction.error))

ranger ผ่าน tidymodels

คุณสามารถใช้ ranger ผ่านส่วนติดต่อของ tidymodels ซึ่งมีรูปแบบไวยากรณ์ที่สอดคล้องกันและผสานการทำงานเข้ากับเวิร์กโฟลว์ การตรวจสอบไขว้ และการปรับแต่งได้ ให้ระบุเอนจินเป็น 'ranger' และส่งอาร์กิวเมนต์เฉพาะของเอนจินด้วย set_engine()

library(parsnip)
library(workflows)

rf_spec <- rand_forest(
  mtry  = tune(),
  trees = 500,
  min_n = tune()
) |>
  set_engine('ranger', importance = 'impurity') |>
  set_mode('regression')

wf <- workflow() |>
  add_recipe(rec) |>
  add_model(rf_spec)

print(wf)

การตีความผลลัพธ์ของ ranger

แบบจำลอง ranger ที่พิมพ์ออกมาจะแสดงจำนวนต้นไม้ ตัวแปรเป้าหมาย จำนวนคุณลักษณะที่ใช้ ค่าความคลาดเคลื่อนการพยากรณ์ OOB และค่า R-squared (สำหรับการถดถอย) ควรตรวจสอบค่าความคลาดเคลื่อน OOB เป็นการตรวจสอบเบื้องต้นเสมอ หากค่าดังกล่าวต่ำมากผิดปกติในชุดข้อมูลขนาดใหญ่ ให้สงสัยว่าข้อมูลรั่วไหล

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500, mtry = 4,
  importance = 'impurity'
)

# Key output fields
cat('OOB MSE:      ', rf$prediction.error, '\n')
cat('OOB RMSE:     ', sqrt(rf$prediction.error), '\n')
cat('R-squared:    ', rf$r.squared, '\n')
cat('Num trees:    ', rf$num.trees, '\n')
cat('Num features: ', rf$num.independent.variables, '\n')

ตรวจสอบความเข้าใจ

ในป่าไม้สุ่มที่สร้างด้วย ranger ค่าความคลาดเคลื่อน OOB (อยู่นอกถุง) ใช้ประมาณค่าใด

ทบทวนป่าไม้สุ่ม

ประเด็นสำคัญจากป่าไม้สุ่มด้วย ranger:

  • ป่าไม้สุ่มรวมต้นไม้จำนวนมากที่สร้างบนตัวอย่างบูตสแตรปเข้ากับการสุ่มเลือกคุณลักษณะในแต่ละการแบ่ง
  • mtry: sqrt(p) สำหรับการจำแนกประเภท และ p/3 สำหรับการถดถอย ควรปรับแต่งพารามิเตอร์นี้
  • ค่าความคลาดเคลื่อน OOB ให้ค่าประมาณการตรวจสอบความถูกต้องที่แทบไม่เอนเอียงโดยไม่ต้องเสียค่าใช้จ่ายเพิ่มเติม
  • importance = 'impurity' หรือ 'permutation' ให้คะแนนความสำคัญของตัวแปร
  • ตั้งค่า probability = TRUE เพื่อรับผลลัพธ์ความน่าจะเป็นของคลาสในการจำแนกประเภท
  • ranger รองรับการประมวลผลแบบขนานอย่างมาก ให้ใช้ num.threads กับชุดข้อมูลขนาดใหญ่
  • ผสานเข้ากับ tidymodels ด้วย rand_forest() |> set_engine('ranger')
rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  mtry       = 4,
  importance = 'impurity',
  num.threads = parallel::detectCores()
)

cat('OOB RMSE:', sqrt(rf$prediction.error))
cat('R2:', rf$r.squared)

print(sort(rf$variable.importance, decreasing = TRUE))
เริ่มต้นได้ฟรี

เรียนรู้ R ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
43
บทเรียน
159

คำถามที่พบบ่อย

บทเรียน “ป่าสุ่มด้วย ranger” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ป่าสุ่มด้วย ranger” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ป่าสุ่มด้วย ranger”

ฝึกโมเดลป่าสุ่ม ปรับค่า mtry และ ntrees และประเมินข้อผิดพลาด OOB คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ป่าสุ่มด้วย ranger” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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