Tầm quan trọng tương đối của một nhóm các yếu tố dự báo trong phân loại rừng ngẫu nhiên ở R


31

Tôi muốn xác định tầm quan trọng tương đối của các bộ biến đối với randomForestmô hình phân loại trong R. importanceHàm cung cấp MeanDecreaseGinisố liệu cho từng dự đoán riêng lẻ - có đơn giản như việc tính tổng này qua từng bộ dự báo trong một bộ không?

Ví dụ:

# 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?

Câu trả lời:


46

Đầ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(1pi)
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: Gini impurity for 2 class

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=GparentGsplit1Gsplit2

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.sharenhư đượ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

Cảm ơn câu trả lời rõ ràng và nghiêm ngặt! Nếu bạn không phiền khi thêm chức năng cho các nhóm quan trọng, điều đó sẽ rất tuyệt.
Max Ghenis

Cảm ơn câu trả lời đó! Hai câu hỏi, nếu bạn có một phút: (1) Tầm quan trọng sau đó được tính là ... : đối với định nghĩa của Breiman, tôi là "giảm gini" ở đó, và tầm quan trọng sẽ là tổng của giảm, đúng ? (2) tính trung bình trên tất cả các phân chia trong rừng liên quan đến yếu tố dự đoán được đề cập : Tôi có thể thay thế điều này bằng tất cả các nút liên quan đến phân chia trên tính năng cụ thể đó không? Để chắc chắn tôi hoàn toàn hiểu được;)
Remi Mélisson

1
Bạn nhận xét khiến tôi suy nghĩ thêm một chút về các định nghĩa vì vậy tôi đã tìm hiểu mã RandomForest được sử dụng trong R để trả lời đúng. Tôi đã hơi tắt để thành thật. Trung bình được thực hiện trên tất cả các cây và không phải tất cả các nút. Tôi sẽ cập nhật câu trả lời ngay khi tôi có thời gian cho nó. Dưới đây là câu trả lời cho câu hỏi của bạn: (1) có. Đây là cách nó được xác định trên cấp độ cây. Tổng số giảm sau đó được tính trung bình trên tất cả các cây. (2) Vâng, đó là những gì tôi muốn nói, nhưng nó không thực sự giữ được.
trong khi

4

Hàm được định nghĩa ở trên là G = sum trên các lớp [pi (1 − pi)] thực sự là entropy, đây là một cách khác để đánh giá sự phân chia. Sự khác biệt giữa entropy trong các nút con và nút cha là Thông tin đạt được. Hàm tạp chất GINI là G = 1- tổng trên các lớp [pi ^ 2].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.