Đầu tiên tôi muốn làm rõ những gì số liệu quan trọng thực sự đo lường.
MeanDecreasGini là thước đo tầm quan trọng thay đổi dựa trên chỉ số tạp chất Gini được sử dụng để tính toán các phần tách trong quá trình đào tạo. Một quan niệm sai lầm phổ biến là số liệu quan trọng thay đổi đề cập đến Gini được sử dụng để khẳng định hiệu suất mô hình có liên quan chặt chẽ với AUC, nhưng điều này là sai. Dưới đây là lời giải thích từ gói RandomForest được viết bởi Breiman và Cutler:
Tầm quan trọng của Gini
Mỗi lần phân chia một nút được thực hiện trên biến m, tiêu chí tạp chất gini cho hai nút con cháu nhỏ hơn nút cha. Cộng các mức giảm gini cho từng biến riêng lẻ trên tất cả các cây trong rừng mang lại tầm quan trọng biến nhanh, thường rất phù hợp với thước đo tầm quan trọng hoán vị.
Các chỉ số tạp chất Gini được định nghĩa là
Trong trường hợp n c là số của các tầng lớp trong biến mục tiêu và p i là tỷ số của lớp này.
G=∑i=1ncpi(1−pi)
ncpi
Đối với bài toán hai lớp, điều này dẫn đến đường cong sau được tối đa hóa cho mẫu 50-50 và được tối thiểu hóa cho các bộ đồng nhất:
Tầm quan trọng sau đó được tính là
tính trung bình trên tất cả các phân chia trong rừng liên quan đến dự đoán trong câu hỏi. Vì đây là mức trung bình, nó có thể dễ dàng được mở rộng để lấy trung bình trên tất cả các phân chia trên các biến có trong một nhóm.
I=Gparent−Gsplit1−Gsplit2
E[E[X|Y]]=E[X]
Bây giờ, để trả lời trực tiếp câu hỏi của bạn, không đơn giản chỉ là tổng hợp tất cả các yếu tố quan trọng trong mỗi nhóm để có được MeanDecreasGini kết hợp nhưng tính toán mức trung bình có trọng số sẽ giúp bạn có câu trả lời mà bạn đang tìm kiếm. Chúng ta chỉ cần tìm tần số thay đổi trong mỗi nhóm.
Đây là một tập lệnh đơn giản để lấy những thứ này từ một đối tượng rừng ngẫu nhiên trong 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)
}
Chỉ cần chuyển tên của các biến trong nhóm làm tham số thành viên.
Tôi mong bạn trả lời câu hỏi này. Tôi có thể viết lên một hàm để có được các nhóm quan trọng trực tiếp nếu nó được quan tâm.
EDIT:
Đây là một hàm cung cấp tầm quan trọng của nhóm cho một randomForest
đối tượng và danh sách các vectơ có tên biến. Nó sử dụng var.share
như được xác định trước đó. Tôi chưa thực hiện bất kỳ kiểm tra đầu vào nào nên bạn cần chắc chắn rằng mình sử dụng đúng tên biến.
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)
}
Ví dụ về cách sử dụng:
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
Nó cũng hoạt động cho các nhóm chồng chéo:
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