Cách tốt nhất để trình bày một khu rừng ngẫu nhiên trong một ấn phẩm?


75

Tôi đang sử dụng thuật toán rừng ngẫu nhiên như một bộ phân loại mạnh mẽ của hai nhóm trong một nghiên cứu microarray với 1000 tính năng.

  • Cách tốt nhất để trình bày khu rừng ngẫu nhiên để có đủ thông tin để làm cho nó có thể tái tạo trong một bài báo là gì?
  • Có một phương thức cốt truyện trong R để thực sự vẽ cây, nếu có một số lượng nhỏ các tính năng?
  • Là ước tính OOB về tỷ lệ lỗi là thống kê tốt nhất để trích dẫn?

2
Không có một cây nào cả ... Nhưng hãy xem phản hồi của @ Shane để vẽ một trong số chúng cho mục đích minh họa.
chl

Tôi chắc chắn giá trị xem xét randomForest :: partialPlot, stats.stackexchange.com/questions/92150/...
Soren Havelund Welling

1
bạn có thể thử gói hình ảnh rừng ngẫu nhiên của tôi, ForestFloor - Forestfloor.dk
Soren Havelund Welling

Câu trả lời:


48

Về việc làm cho nó có thể tái tạo, cách tốt nhất là cung cấp nghiên cứu có thể tái tạo (tức là mã và dữ liệu) cùng với bài báo. Làm cho nó có sẵn trên trang web của bạn, hoặc trên một trang web lưu trữ (như github).

Về trực quan hóa, Leo Breiman đã thực hiện một số công việc thú vị về điều này (xem trang chủ của anh ấy , đặc biệt là phần về đồ họa ).

Nhưng nếu bạn đang sử dụng R, thì randomForestgói có một số chức năng hữu ích:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Tôi không biết một cách đơn giản để thực sự vẽ cây, nhưng bạn có thể sử dụng getTreehàm để lấy cây và vẽ riêng nó.

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

Bài thuyết trình Strobl / Zeileis về "Tại sao và làm thế nào để sử dụng các biện pháp quan trọng của biến rừng ngẫu nhiên (và cách bạn không nên)" có các ví dụ về cây phải được sản xuất theo cách này. Bài đăng blog này trên các mô hình cây có một số ví dụ hay về các lô cây GIỎI mà bạn có thể sử dụng chẳng hạn.

Như @chl đã nhận xét, một cây duy nhất không có ý nghĩa đặc biệt trong bối cảnh này, vì vậy, sử dụng nó để giải thích một khu rừng ngẫu nhiên là gì, tôi sẽ không bao gồm điều này trong một bài báo.


4
Phần mở rộng nhỏ về các ô: plot.randomForestcho thấy lỗi OOB và lỗi OOB trong lớp phát triển như thế nào với số lượng cây tăng lên; varImpPlothiển thị các số đo tầm quan trọng thuộc tính cho các thuộc tính hàng đầu và MDSplottất cả các đối tượng được vẽ trên hình chiếu 2D của thước đo độ gần đối tượng RF.

+1 để trích dẫn MDSplot()chức năng. Tôi phải thừa nhận rằng tôi thường sử dụng RF như một cách để làm nổi bật các cụm cá nhân (dựa trên thước đo độ gần RF) thay vì chọn các tính năng tốt nhất. Các bác sĩ lâm sàng thường đọc các lô như vậy dễ dàng hơn so với dotplot của var. tầm quan trọng ...
chl

18
  1. Như Shane đã viết; làm cho nó nghiên cứu tái sản xuất + bao gồm các hạt ngẫu nhiên, bởi vì RF là ngẫu nhiên.
  2. Trước hết, âm mưu cây đơn hình thành RF là vô nghĩa; đây là một bộ phân loại đồng bộ, nó chỉ có ý nghĩa như một toàn thể. Nhưng ngay cả việc vẽ toàn bộ khu rừng là vô nghĩa - đó là một bộ phân loại hộp đen, vì vậy nó không nhằm giải thích dữ liệu với cấu trúc của nó, thay vào đó để sao chép quy trình ban đầu. Thay vào đó, hãy thực hiện một số âm mưu mà Shane đề xuất.
  3. Trong thực tế, OOB là một xấp xỉ lỗi rất tốt; Tuy nhiên, đây không phải là một thực tế được chấp nhận rộng rãi, vì vậy để xuất bản, tốt hơn là nên làm một CV để xác nhận nó.

Vì vậy, @mbq khi thực hiện CV là hợp lệ trước tiên hãy thực hiện một rừng ngẫu nhiên với tất cả các mẫu được chọn; thực hiện hai lần một lần với tất cả và lần thứ hai với 10 biến hàng đầu (có thể được trích dẫn trong một bài báo). Sau đó, thực hiện xác thực chéo một lần (chọn 10 gen hàng đầu mỗi lần thử) và trích dẫn lỗi CV từ đó?
danielsbrewer

1
@danielsbrewer Tôi sẽ làm điều này theo một cách khác (chú ý hơn đến lựa chọn tính năng), nhưng điều này là chính xác; tuy nhiên, chủ đề về lựa chọn tính năng RF chuẩn hơn là chọn các điểm đánh dấu tốt nhất cho vấn đề sinh học của bạn.

2
Vấn đề chính là rất khó để so sánh hai mô hình (mô hình = phương pháp học tập + phương pháp lựa chọn tính năng), nhưng để đơn giản, bạn có thể giả sử một cái gì đó (như tôi sẽ sử dụng RF và chọn 10 thuộc tính hàng đầu) và thừa nhận rằng bạn biết rằng điều này có thể là tối ưu, nhưng bạn đồng ý rằng trong khi bạn hài lòng với độ chính xác. Trong trường hợp đó, vấn đề duy nhất của bạn là loại bỏ sự thiên vị của lựa chọn thuộc tính. tbc.

2
Vì vậy, tôi sẽ thực hiện một cách đóng gói đơn giản: bạn tạo 10 (hoặc 30 nếu bạn có một máy tính tốt) các mẫu con ngẫu nhiên (giả sử bằng cách chọn ngẫu nhiên với thay thế), huấn luyện RF trên mỗi, nhận mức độ quan trọng và trả lại thứ hạng cho từng đối tượng thuộc tính trung bình trên tất cả các lần lặp lại (thuộc tính tốt nhất được xếp hạng 1, tốt nhất thứ 2, v.v. nó có thể được tính trung bình để thuộc tính gấp 12 lần 1 và 18 lần 2 có thứ hạng 1.6), cuối cùng chọn 10 với thứ hạng tốt nhất và gọi chúng điểm đánh dấu của bạn. Sau đó sử dụng CV (LOO, 10 lần hoặc tốt nhất là lấy mẫu ngẫu nhiên) để lấy xấp xỉ lỗi RF bằng các điểm đánh dấu của bạn. tbc.

2
Báo cáo thứ hạng (hy vọng chúng sẽ khá gần 1,2,3 ...), lỗi CV với độ lệch của nó (chỉ tính độ lệch chuẩn của kết quả của mỗi vòng CV) và lỗi OOB (có thể sẽ giống với lỗi CV). TUYÊN BỐ TỪ CHỐI: Đây không phải là phương pháp để chọn số lượng thuộc tính tối ưu - bạn cần RFE và CV lồng nhau để làm điều đó. DISCLAIMER2: Tôi chưa làm việc với dữ liệu như vậy, vì vậy tôi không đảm bảo rằng các trọng tài của bạn sẽ hài lòng với dữ liệu đó (mặc dù tôi tin rằng họ nên làm vậy).

13

Hãy ghi nhớ những cảnh báo trong các câu trả lời khác về cốt truyện nhất thiết phải có ý nghĩa. Nhưng nếu bạn muốn một cốt truyện cho mục đích minh họa / sư phạm, đoạn trích sau của R có thể hữu ích. Không khó để thêm "điểm chia" vào văn bản cạnh nếu bạn cần.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))

1
Mã sản xuất lô cây rất tốt. Nhưng các giá trị không được hiển thị. Có lẽ một hàm text () cần được thêm vào sau câu lệnh (cốt truyện) cuối cùng.
rnso
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.