ความสำคัญเชิงสัมพัทธ์ของชุดพยากรณ์ในการจำแนกประเภทป่าสุ่มใน R


31

ฉันต้องการพิจารณาความสำคัญสัมพัทธ์ของชุดของตัวแปรที่มีต่อการrandomForestจำแนกประเภทในอาร์importanceฟังก์ชั่นนี้ให้MeanDecreaseGiniตัวชี้วัดสำหรับตัวทำนายแต่ละตัว - มันง่ายเหมือนการรวมสิ่งนี้กับตัวทำนายแต่ละตัวในเซตหรือไม่?

ตัวอย่างเช่น:

# Assumes df has variables a1, a2, b1, b2, and outcome
rf <- randomForest(outcome ~ ., data=df)
importance(rf)
# To determine whether the "a" predictors are more important than the "b"s,
# can I sum the MeanDecreaseGini for a1 and a2 and compare to that of b1+b2?

คำตอบ:


46

ก่อนอื่นฉันต้องการชี้แจงว่าการวัดความสำคัญจริง ๆ อย่างไร

MeanDecreaseGiniเป็นการวัดความสำคัญของตัวแปรตามดัชนีมลทิน Gini ที่ใช้สำหรับการคำนวณการแยกระหว่างการฝึก ความเข้าใจผิดที่พบบ่อยคือการวัดความสำคัญของตัวแปรหมายถึง Gini ที่ใช้ในการประเมินประสิทธิภาพของแบบจำลองซึ่งเกี่ยวข้องกับ AUC อย่างใกล้ชิด แต่นี่เป็นสิ่งที่ผิด นี่คือคำอธิบายจากแพ็คเกจสุ่มป่าไม้ที่เขียนโดย Breiman และ Cutler:

ความสำคัญของ Gini
ทุกครั้งที่มีการแบ่งโหนดบนตัวแปร m เกณฑ์การปนเปื้อนของ gini สำหรับสองโหนดที่สืบทอดจะน้อยกว่าโหนดหลัก การเพิ่มค่า Gini จะลดลงสำหรับตัวแปรแต่ละตัวของต้นไม้ทุกต้นในป่าให้ความสำคัญของตัวแปรที่รวดเร็วซึ่งมักจะสอดคล้องกับการวัดความสำคัญของการเปลี่ยนรูป

ดัชนีสิ่งเจือปน Giniถูกกำหนดให้เป็น ที่ไหนn เป็นจำนวนของการเรียนในตัวแปรเป้าหมายและP ฉันคืออัตราส่วนของชั้นนี้

G=Σผม=1nพีผม(1-พีผม)
nพีผม

สำหรับปัญหาสองระดับผลลัพธ์นี้ในกราฟต่อไปนี้ซึ่งขยายให้ใหญ่สุดสำหรับตัวอย่าง 50-50 และย่อเล็กสุดสำหรับชุดที่เป็นเนื้อเดียวกัน: Gini มลทินสำหรับ 2 ชั้น

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

ผม=GพีaRอีnเสื้อ-Gsพีล.ผมเสื้อ1-Gsพีล.ผมเสื้อ2

E[E[X|Y]]=E[X]

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

นี่เป็นสคริปต์ง่ายๆในการรับสิ่งเหล่านี้จากวัตถุฟอเรสต์แบบสุ่มใน R:

var.share <- function(rf.obj, members) {
  count <- table(rf.obj$forest$bestvar)[-1]
  names(count) <- names(rf.obj$forest$ncat)
  share <- count[members] / sum(count[members])
  return(share)
}

เพียงส่งผ่านชื่อของตัวแปรในกลุ่มเป็นพารามิเตอร์สมาชิก

ฉันหวังว่านี้ตอบคำถามของคุณ. ฉันสามารถเขียนฟังก์ชั่นเพื่อให้ได้ความสำคัญของกลุ่มโดยตรงหากเป็นที่สนใจ

แก้ไข:
นี่คือฟังก์ชั่นที่ให้ความสำคัญกลุ่มที่กำหนดrandomForestวัตถุและรายการของเวกเตอร์ที่มีชื่อตัวแปร มันใช้var.shareตามที่กำหนดไว้ก่อนหน้า ฉันยังไม่ได้ทำการตรวจสอบอินพุตดังนั้นคุณต้องแน่ใจว่าคุณใช้ชื่อตัวแปรที่ถูกต้อง

group.importance <- function(rf.obj, groups) {
  var.imp <- as.matrix(sapply(groups, function(g) {
    sum(importance(rf.obj, 2)[g, ]*var.share(rf.obj, g))
  }))
  colnames(var.imp) <- "MeanDecreaseGini"
  return(var.imp)
}

ตัวอย่างการใช้งาน:

library(randomForest)                                                          
data(iris)

rf.obj <- randomForest(Species ~ ., data=iris)

groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"), 
               Petal=c("Petal.Width", "Petal.Length"))

group.importance(rf.obj, groups)

>

      MeanDecreaseGini
Sepal         6.187198
Petal        43.913020

นอกจากนี้ยังใช้งานได้กับกลุ่มที่ทับซ้อนกัน:

overlapping.groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"), 
                           Petal=c("Petal.Width", "Petal.Length"),
                           Width=c("Sepal.Width", "Petal.Width"), 
                           Length=c("Sepal.Length", "Petal.Length"))

group.importance(rf.obj, overlapping.groups)

>

       MeanDecreaseGini
Sepal          6.187198
Petal         43.913020
Width          30.513776
Length        30.386706

ขอบคุณสำหรับคำตอบที่ชัดเจนและเข้มงวด! หากคุณไม่คิดที่จะเพิ่มฟังก์ชั่นสำหรับการนำเข้ากลุ่มสิ่งนี้จะดีมาก
Max Ghenis

ขอบคุณสำหรับคำตอบ! คำถามสองข้อหากคุณมีเวลาสักครู่: (1) ความสำคัญจะถูกคำนวณเป็น ... : ตามคำจำกัดความของ Breiman ฉันคือ "gini ลด" และความสำคัญจะเป็นผลรวมของการลดลงถูกต้อง ? (2) ค่าเฉลี่ยของการแยกทั้งหมดในฟอเรสต์ที่เกี่ยวข้องกับตัวทำนายที่เป็นปัญหา : ฉันสามารถแทนที่สิ่งนี้โดยโหนดทั้งหมดที่เกี่ยวข้องกับการแบ่งในคุณสมบัติเฉพาะนั้นหรือไม่ เพื่อให้แน่ใจว่าฉันเข้าใจอย่างถ่องแท้;)
Remi Mélisson

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

4

ฟังก์ชั่นที่กำหนดไว้ข้างต้นเป็น G = ผลรวมเหนือคลาส [pi (1 − pi)] เป็นเอนโทรปีซึ่งเป็นอีกวิธีหนึ่งในการประเมินการแบ่ง ความแตกต่างระหว่างเอนโทรปีในโหนดลูกและโหนดหลักคือได้รับข้อมูล ฟังก์ชันมลทิน GINI คือ G = 1- ผลรวมเหนือคลาส [pi ^ 2]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.