ก่อนอื่นฉันต้องการชี้แจงว่าการวัดความสำคัญจริง ๆ อย่างไร
MeanDecreaseGiniเป็นการวัดความสำคัญของตัวแปรตามดัชนีมลทิน Gini ที่ใช้สำหรับการคำนวณการแยกระหว่างการฝึก ความเข้าใจผิดที่พบบ่อยคือการวัดความสำคัญของตัวแปรหมายถึง Gini ที่ใช้ในการประเมินประสิทธิภาพของแบบจำลองซึ่งเกี่ยวข้องกับ AUC อย่างใกล้ชิด แต่นี่เป็นสิ่งที่ผิด นี่คือคำอธิบายจากแพ็คเกจสุ่มป่าไม้ที่เขียนโดย Breiman และ Cutler:
ความสำคัญของ Gini
ทุกครั้งที่มีการแบ่งโหนดบนตัวแปร m เกณฑ์การปนเปื้อนของ gini สำหรับสองโหนดที่สืบทอดจะน้อยกว่าโหนดหลัก การเพิ่มค่า Gini จะลดลงสำหรับตัวแปรแต่ละตัวของต้นไม้ทุกต้นในป่าให้ความสำคัญของตัวแปรที่รวดเร็วซึ่งมักจะสอดคล้องกับการวัดความสำคัญของการเปลี่ยนรูป
ดัชนีสิ่งเจือปน Giniถูกกำหนดให้เป็น
ที่ไหนn คเป็นจำนวนของการเรียนในตัวแปรเป้าหมายและP ฉันคืออัตราส่วนของชั้นนี้
G = ∑ผม = 1nคพีผม( 1) - pผม)
nคพีผม
สำหรับปัญหาสองระดับผลลัพธ์นี้ในกราฟต่อไปนี้ซึ่งขยายให้ใหญ่สุดสำหรับตัวอย่าง 50-50 และย่อเล็กสุดสำหรับชุดที่เป็นเนื้อเดียวกัน:
ความสำคัญที่มีการคำนวณแล้วเป็น
เฉลี่ยแยกทั้งหมดในป่าที่เกี่ยวข้องกับการทำนายในคำถาม เนื่องจากนี่เป็นค่าเฉลี่ยจึงสามารถขยายได้อย่างง่ายดายเพื่อหาค่าเฉลี่ยของการแยกทั้งหมดของตัวแปรที่อยู่ในกลุ่ม
ผม= Gp a r e n t- ชs p l i t 1- ชs p l i t 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