Làm thế nào để đo lường / xếp hạng tầm quan trọng của biến số nghiêm trọng khi sử dụng GIỎ HÀNG? (cụ thể sử dụng {rpart} từ R)


27

Khi xây dựng mô hình GIỎ HÀNG (cụ thể là cây phân loại) bằng rpart (trong R), thường rất thú vị khi biết tầm quan trọng của các biến khác nhau được giới thiệu cho mô hình là gì.

Vì vậy, câu hỏi của tôi là: Những biện pháp phổ biến nào tồn tại để xếp hạng / đo lường tầm quan trọng của biến tham gia trong mô hình GIỎI? Và làm thế nào điều này có thể được tính bằng R (ví dụ: khi sử dụng gói rpart)

Ví dụ, đây là một số mã giả, được tạo để bạn có thể hiển thị các giải pháp của mình trên đó. Ví dụ này được cấu trúc sao cho rõ ràng biến x1 và x2 là "quan trọng" trong khi (về mặt nào đó) x1 quan trọng hơn x2 (vì x1 nên áp dụng cho nhiều trường hợp hơn, do đó ảnh hưởng nhiều hơn đến cấu trúc của dữ liệu, thì x2).

set.seed(31431)
n <- 400
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
x5 <- rnorm(n)

X <- data.frame(x1,x2,x3,x4,x5)

y <- sample(letters[1:4], n, T)
y <- ifelse(X[,2] < -1 , "b", y)
y <- ifelse(X[,1] < 0 , "a", y)

require(rpart)
fit <- rpart(y~., X)
plot(fit); text(fit)

info.gain.rpart(fit) # your function - telling us on each variable how important it is

(tài liệu tham khảo luôn được hoan nghênh)


Câu hỏi này khác với stats.stackexchange.com/questions/5443/ như thế nào?
steffen

Câu hỏi đó đề cập đến việc biết dự đoán nào có liên quan đến một giá trị phân loại cụ thể của biến phụ thuộc. Câu hỏi này rộng hơn (tầm quan trọng thay đổi / xếp hạng mà không phát hiện ra giá trị danh nghĩa mà nó ảnh hưởng). Vì câu hỏi đó chưa được trả lời, tôi nghĩ rằng nó đáng để diễn đạt nó một cách tổng quát hơn với hy vọng ai đó có thể giúp đỡ ...
Tal Galili

Câu trả lời:


42

Tầm quan trọng của biến thường có thể được tính dựa trên mức giảm độ chính xác dự đoán tương ứng khi loại bỏ yếu tố dự đoán quan tâm (với kỹ thuật hoán vị, như trong Rừng ngẫu nhiên) hoặc một số biện pháp giảm tạp chất nút, nhưng xem (1) để biết tổng quan về phương pháp có sẵn. Một sự thay thế rõ ràng cho GIỎI là RF tất nhiên ( RandomForest , nhưng cũng xem bên ). Với RF, chỉ số quan trọng của Gini được định nghĩa là mức giảm Gini trung bình của tạp chất nút trên tất cả các cây trong rừng (xuất phát từ thực tế là chỉ số tạp chất Gini cho nút cha đã cho lớn hơn giá trị của biện pháp đó đối với hai nút đó nút con gái, xem ví dụ (2)).

Tôi biết rằng Carolin Strobl và coll. đã đóng góp rất nhiều nghiên cứu mô phỏng và thử nghiệm về tầm quan trọng của biến (có điều kiện) trong RF và GIỎI (ví dụ (3-4), nhưng có nhiều nghiên cứu khác, hoặc luận điểm của cô ấy, Các vấn đề thống kê trong học máy - Hướng tới lựa chọn phân tách đáng tin cậy và Các biện pháp quan trọng thay đổi ).

Theo hiểu biết của tôi, gói caret (5) chỉ xem xét hàm mất cho trường hợp hồi quy (nghĩa là lỗi bình phương). Có thể nó sẽ được thêm vào trong tương lai gần (dù sao, một ví dụ với trường hợp phân loại theo k-NN có sẵn trong trợ giúp trực tuyến cho dotPlot).

Tuy nhiên, Noel M O'Boyle dường như có một số mã R cho tầm quan trọng của Biến trong GIỎI .

Tài liệu tham khảo

  1. Sandri và Zuccolotto. Một thuật toán hiệu chỉnh sai lệch cho thước đo tầm quan trọng của biến Gini trong cây phân loại . 2008
  2. Izenman. Kỹ thuật thống kê đa biến hiện đại . Mùa xuân 2008
  3. Đột quỵ, Hothorn và Zeilis. Tiệc tùng! . Tạp chí R 2009 1/2
  4. Đột quỵ, Boulesteix, Kneib, Augustin và Zeilis. Tầm quan trọng của biến có điều kiện đối với rừng ngẫu nhiên . BMC Tin sinh học 2008, 9: 307
  5. Kuhn. Xây dựng mô hình dự đoán trong R Sử dụng gói caret . JSS 2008 28 (5)

1
Thực sự - xứng đáng nhiều phiếu bầu hơn nó có.
Matt Parker

+1 cho câu trả lời tuyệt vời. Và cập nhật cho những người đến muộn (như bản thân tôi) importance()trong RandomForest thực hiện tầm quan trọng của từng cá nhân với mức giảm trung bình của acccuracy và giảm gini trung bình.
Zhubarb

3

Hàm sau (từ gói Caret) có thể được sử dụng để đánh giá tầm quan trọng của biến trong cây rpart. Tôi đã sửa một lỗi trong hàm Caret khi nút gốc này chỉ trong cây.

varImp <- function(object, surrogates = FALSE, competes = TRUE, ...)
  {
tmp <- rownames(object$splits)

 allVars <- colnames(attributes(object$terms)$factors)
if(is.null(tmp))
  {
  out<-NULL
    zeros <- data.frame(x = rep(0, length(allVars)),
                        Variable = allVars)
    out <- rbind(out, zeros)
  }

else {

rownames(object$splits) <- 1:nrow(object$splits)
splits <- data.frame(object$splits)
    splits$var <- tmp
splits$type <- ""

frame <- as.data.frame(object$frame)
    index <- 0
    for(i in 1:nrow(frame))
      {
        if(frame$var[i] != "<leaf>")
          {
            index <- index + 1
            splits$type[index] <- "primary"
            if(frame$ncompete[i] > 0)
              {
                for(j in 1:frame$ncompete[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "competing"
                  }
              }
            if(frame$nsurrogate[i] > 0)
              {
                for(j in 1:frame$nsurrogate[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "surrogate"
                  }
              }
          }
      }
    splits$var <- factor(as.character(splits$var))
    if(!surrogates) splits <- subset(splits, type != "surrogate")
    if(!competes) splits <- subset(splits, type != "competing")
    out <- aggregate(splits$improve,
                 list(Variable = splits$var),
                 sum,
                 na.rm = TRUE)

allVars <- colnames(attributes(object$terms)$factors)
if(!all(allVars %in% out$Variable))
      {
        missingVars <- allVars[!(allVars %in% out$Variable)]
        zeros <- data.frame(x = rep(0, length(missingVars)),
                            Variable = missingVars)
        out <- rbind(out, zeros)
      }
    }
    out2 <- data.frame(Overall = out$x)
rownames(out2) <- out$Variable
out2

}

Mã r sau đây sẽ tạo ra điểm số quan trọng cho cây rpart "phù hợp"

 varImp(fit)

Cảm ơn. Bạn đã báo cáo lỗi cho Max? (người duy trì gói caret)
Tal Galili

1

Tôi nghĩ rằng chl đã trả lời khá nhiều phần đầu tiên:

Những biện pháp phổ biến nào tồn tại để xếp hạng / đo lường tầm quan trọng của các biến tham gia trong mô hình GIỎI?

Đối với phần thứ hai của câu hỏi của bạn:

Và làm thế nào điều này có thể được tính bằng R (ví dụ: khi sử dụng gói rpart)

Bạn có thể tìm thấy tầm quan trọng của biến bằng cách sử dụng rpart bằng cách sử dụng tóm tắt (phù hợp). Điều này tạo ra tầm quan trọng khác nhau giữa một số thứ khác. Bạn có thể đọc thêm về nó ở đây: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Tham khảo trang 25.


0

names(result) trình diễn variable.importance

result$variable.importance nên giúp?


3
Tôi tin rằng câu hỏi có liên quan nhiều hơn đến lợi thế hoặc mức độ phổ biến của một số biện pháp có tầm quan trọng khác nhau so với cách in những cái có sẵn trong R cho một phương pháp cụ thể.
chl 26/03/13
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.