Thu thập kiến ​​thức từ một khu rừng ngẫu nhiên


127

Rừng ngẫu nhiên được coi là hộp đen, nhưng gần đây tôi đã nghĩ những kiến ​​thức nào có thể thu được từ một khu rừng ngẫu nhiên?

Điều rõ ràng nhất là tầm quan trọng của các biến, trong biến thể đơn giản nhất, nó có thể được thực hiện chỉ bằng cách tính số lần xuất hiện của một biến.
Điều thứ hai tôi đã nghĩ đến là sự tương tác. Tôi nghĩ rằng nếu số lượng cây đủ lớn thì số lần xuất hiện của các cặp biến có thể được kiểm tra (đại loại như độc lập chi bình phương). Điều thứ ba là phi tuyến của các biến. Ý tưởng đầu tiên của tôi chỉ là nhìn vào biểu đồ của điểm Vs thay đổi, nhưng tôi không chắc liệu nó có ý nghĩa gì không.

Đã thêm 23.01.2012
Động lực

Tôi muốn sử dụng kiến ​​thức này để cải thiện mô hình logit. Tôi nghĩ (hoặc ít nhất là tôi hy vọng) rằng có thể tìm thấy các tương tác và phi tuyến đã bị bỏ qua.


1
Sử dụng R, bạn có thể tạo ra một Dotchart có tầm quan trọng khác nhau được đo bằng Rừng ngẫu nhiên.
George Dontas

1
một chủ đề liên quan về cách các biện pháp quan trọng khác nhau được tính toán cho việc tăng cường cây dốc ngẫu nhiên
Antoine

Tôi nhận ra điều này có lẽ đã quá muộn, nhưng nếu bạn chỉ muốn cải thiện mô hình logit, tại sao bạn không sử dụng hồi quy logistic sau lasso? Bạn chỉ có thể chỉnh lại mô hình bằng các hệ số đã chọn sau khi chọn mà không bị phạt / co rút. Bạn sẽ phải điều chỉnh thủ tục điều chỉnh một chút, nhưng đây là một tùy chọn trực tiếp hơn nhiều, thực hiện chính xác những gì bạn muốn.
ilprincipe

Câu trả lời:


122

Rừng ngẫu nhiên hầu như không phải là một hộp đen. Chúng dựa trên các cây quyết định, rất dễ diễn giải:

#Setup a binary classification problem
require(randomForest)
data(iris)
set.seed(1)
dat <- iris
dat$Species <- factor(ifelse(dat$Species=='virginica','virginica','other'))
trainrows <- runif(nrow(dat)) > 0.3
train <- dat[trainrows,]
test <- dat[!trainrows,]

#Build a decision tree
require(rpart)
model.rpart <- rpart(Species~., train)

Điều này dẫn đến một cây quyết định đơn giản:

> model.rpart
n= 111 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 111 35 other (0.68468468 0.31531532)  
  2) Petal.Length< 4.95 77  3 other (0.96103896 0.03896104) *
  3) Petal.Length>=4.95 34  2 virginica (0.05882353 0.94117647) *

Nếu Petal.Lipse <4.95, cây này phân loại quan sát là "khác". Nếu nó lớn hơn 4,95, nó phân loại quan sát là "virginica". Một khu rừng ngẫu nhiên là một tập hợp nhiều cây như vậy, trong đó mỗi cây được huấn luyện trên một tập hợp con ngẫu nhiên của dữ liệu. Mỗi cây sau đó "bỏ phiếu" cho phân loại cuối cùng của mỗi quan sát.

model.rf <- randomForest(Species~., train, ntree=25, proximity=TRUE, importance=TRUE, nodesize=5)
> getTree(model.rf, k=1, labelVar=TRUE)
  left daughter right daughter    split var split point status prediction
1             2              3  Petal.Width        1.70      1       <NA>
2             4              5 Petal.Length        4.95      1       <NA>
3             6              7 Petal.Length        4.95      1       <NA>
4             0              0         <NA>        0.00     -1      other
5             0              0         <NA>        0.00     -1  virginica
6             0              0         <NA>        0.00     -1      other
7             0              0         <NA>        0.00     -1  virginica

Bạn thậm chí có thể kéo từng cây riêng lẻ ra khỏi rf và xem cấu trúc của chúng. Định dạng hơi khác so với rpartmô hình, nhưng bạn có thể kiểm tra từng cây nếu bạn muốn và xem cách mô hình hóa dữ liệu.

Hơn nữa, không có mô hình nào thực sự là một hộp đen, bởi vì bạn có thể kiểm tra các phản hồi dự đoán so với phản hồi thực tế cho từng biến trong bộ dữ liệu. Đây là một ý tưởng tốt cho dù bạn đang xây dựng mô hình nào:

library(ggplot2)
pSpecies <- predict(model.rf,test,'vote')[,2]
plotData <- lapply(names(test[,1:4]), function(x){
  out <- data.frame(
    var = x,
    type = c(rep('Actual',nrow(test)),rep('Predicted',nrow(test))),
    value = c(test[,x],test[,x]),
    species = c(as.numeric(test$Species)-1,pSpecies)
    )
  out$value <- out$value-min(out$value) #Normalize to [0,1]
  out$value <- out$value/max(out$value)
  out
})
plotData <- do.call(rbind,plotData)
qplot(value, species, data=plotData, facets = type ~ var, geom='smooth', span = 0.5)

âm mưu

Tôi đã bình thường hóa các biến số (chiều dài và chiều rộng cánh hoa và cánh hoa) thành phạm vi 0-1. Phản hồi cũng là 0-1, trong đó 0 là khác và 1 là virginica. Như bạn có thể thấy rừng ngẫu nhiên là một mô hình tốt, ngay cả trên bộ thử nghiệm.

Ngoài ra, một khu rừng ngẫu nhiên sẽ tính toán các mức độ quan trọng khác nhau, có thể rất nhiều thông tin:

> importance(model.rf, type=1)
             MeanDecreaseAccuracy
Sepal.Length           0.28567162
Sepal.Width           -0.08584199
Petal.Length           0.64705819
Petal.Width            0.58176828

Bảng này biểu thị mức độ loại bỏ từng biến làm giảm độ chính xác của mô hình. Cuối cùng, có nhiều mảnh đất khác bạn có thể thực hiện từ một mô hình rừng ngẫu nhiên, để xem những gì đang diễn ra trong hộp đen:

plot(model.rf)
plot(margin(model.rf)) 
MDSplot(model.rf, iris$Species, k=5)
plot(outlier(model.rf), type="h", col=c("red", "green", "blue")[as.numeric(dat$Species)])

Bạn có thể xem các tệp trợ giúp cho từng chức năng này để hiểu rõ hơn về những gì chúng hiển thị.


6
Cảm ơn câu trả lời, có rất nhiều thông tin hữu ích, nhưng nó không chính xác là những gì tôi đang tìm kiếm. Có lẽ tôi cần làm rõ hơn động lực đằng sau câu hỏi này. Tôi muốn sử dụng một rừng ngẫu nhiên để cải thiện mô hình logit, bằng cách cải thiện tôi có nghĩa là thêm một số tương tác hoặc sử dụng một chuyển đổi phi tuyến.
Tomek Tarczynski

@TomekTarczynski đó là một vấn đề thú vị và tương tự như vấn đề tôi đang giải quyết ngay bây giờ. Tôi giả sử theo "mô hình logit" bạn có nghĩa là hồi quy logistic hoặc một cái gì đó tương tự? Tôi đang sử dụng hồi quy logistic lasso (từ gói glmnet R) để chọn các yếu tố dự đoán từ một mô hình có tương tác giữa tất cả các cặp biến. Tôi chưa thêm vào bất kỳ thuật ngữ phi tuyến nào - nhưng về nguyên tắc điều đó cũng có thể xảy ra. Vấn đề duy nhất tôi đoán là quyết định thử thuật ngữ phi tuyến nào (thuật ngữ đa thức, biến đổi hàm mũ, v.v?). Ngoài ra, tôi không chọn bất kỳ tương tác bậc cao nào nhưng điều đó cũng dễ dàng.
Anne Z.

2
@Tomek, bạn không nhận được gì từ câu trả lời này? Nếu bạn đang sử dụng gói RandomForest trong R thì các ô mà Zach mô tả sẽ rất hữu ích. Cụ thể, bạn có thể sử dụng varImpPlot để lựa chọn tính năng trong mô hình logit của bạn và partPlot để ước tính loại chuyển đổi để thử các dự đoán liên tục trong mô hình logit. Tôi sẽ đề nghị rằng biểu đồ sau được sử dụng để xác định nơi tồn tại mối quan hệ phi tuyến giữa yếu tố dự đoán và phản hồi và sau đó cho phép bạn thực hiện chuyển đổi đó một cách rõ ràng hoặc sử dụng một spline trên biến đó.
B_Miner

2
@b_miner - chỉ là một phỏng đoán, nhưng có vẻ như tomek đang hỏi làm thế nào để tìm các tương tác phi tuyến tính giữa các biến vì hồi quy logistic đã nắm bắt các mối quan hệ tuyến tính.
rm999

@ rm999 Làm thế nào để bạn xác định một tương tác phi tuyến tính trong mô hình logit? Thuật ngữ tương tác được tạo ra giữa các biến được chuyển đổi?
B_Miner

52

Cách đây một thời gian, tôi đã phải chứng minh một mô hình RF phù hợp với một số nhà hóa học trong công ty của tôi. Tôi đã dành khá nhiều thời gian để thử các kỹ thuật hình dung khác nhau. Trong quá trình này, tôi cũng vô tình tìm ra một số kỹ thuật mới mà tôi đưa vào gói R ( ForestFloor ) dành riêng cho trực quan rừng ngẫu nhiên.

Cách tiếp cận cổ điển là các biểu đồ phụ thuộc một phần được hỗ trợ bởi: Rminer (phân tích độ nhạy dựa trên dữ liệu được phát minh lại phụ thuộc một phần) hoặc partPlot trong gói RandomForest . Tôi tìm thấy gói phụ thuộc một phần iceBOX như một cách thanh lịch để khám phá các tương tác. Chưa sử dụng gói edarf , nhưng dường như có một số hình ảnh trực quan tốt dành riêng cho RF. Các ggRandomForest gói cũng chứa một tập hợp lớn các visualizations hữu ích.

Hiện tại ForestFloor hỗ trợ các đối tượng RandomForest (hỗ trợ cho các triển khai RF khác đang trên đường). Ngoài ra các đóng góp tính năng có thể được tính toán cho các cây được tăng cường độ dốc, vì những cây này sau khi đào tạo không khác nhiều so với cây rừng ngẫu nhiên. Vì vậy, ForestFloor có thể hỗ trợ XGBoost trong tương lai. Các ô phụ thuộc một phần là mô hình bất biến hoàn toàn.

y=F(X)f1(x1)+f2(x2)+...+fd(xd)

Trong bài báo này , tôi đã sử dụng một phiên bản rất sớm của ForestFloor để giải thích mối quan hệ sinh hóa thực tế mà một mô hình RF rất nhỏ đã nắm bắt được. Và trong bài báo này, chúng tôi mô tả kỹ lưỡng trực quan hóa các đóng góp tính năng, Trực quan hóa tầng rừng của rừng ngẫu nhiên .

y=x12+sin(x2π)+2x3x4+

#1 - Regression example:
set.seed(1234)
library(forestFloor)
library(randomForest)

#simulate data y = x1^2+sin(x2*pi)+x3*x4 + noise
obs = 5000 #how many observations/samples
vars = 6   #how many variables/features
#create 6 normal distr. uncorr. variables
X = data.frame(replicate(vars,rnorm(obs)))
#create target by hidden function
Y = with(X, X1^2 + sin(X2*pi) + 2 * X3 * X4 + 0.5 * rnorm(obs)) 

#grow a forest
rfo = randomForest(
  X, #features, data.frame or matrix. Recommended to name columns.
  Y, #targets, vector of integers or floats
  keep.inbag = TRUE,  # mandatory,
  importance = TRUE,  # recommended, else ordering by giniImpurity (unstable)
  sampsize = 1500 ,   # optional, reduce tree sizes to compute faster
  ntree = if(interactive()) 500 else 50 #speedup CRAN testing
)

#compute forestFloor object, often only 5-10% time of growing forest
ff = forestFloor(
  rf.fit = rfo,       # mandatory
  X = X,              # mandatory
  calc_np = FALSE,    # TRUE or FALSE both works, makes no difference
  binary_reg = FALSE  # takes no effect here when rfo$type="regression"
)


#plot partial functions of most important variables first
plot(ff,                       # forestFloor object
     plot_seq = 1:6,           # optional sequence of features to plot
     orderByImportance=TRUE    # if TRUE index sequence by importance, else by X column  
)

nhập mô tả hình ảnh ở đây

#Non interacting features are well displayed, whereas X3 and X4 are not
#by applying color gradient, interactions reveal themself 
#also a k-nearest neighbor fit is applied to evaluate goodness-of-fit
Col=fcol(ff,3,orderByImportance=FALSE) #create color gradient see help(fcol)
plot(ff,col=Col,plot_GOF=TRUE) 

nhập mô tả hình ảnh ở đây

#feature contributions of X3 and X4 are well explained in the context of X3 and X4
# as GOF R^2>.8


show3d(ff,3:4,col=Col,plot_GOF=TRUE,orderByImportance=FALSE)

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Cuối cùng, mã cho các ô phụ thuộc một phần được mã hóa bởi A.Liaw được mô tả bởi J.Friedman. Mà làm tốt cho các hiệu ứng chính.

par(mfrow=c(2,3))
for(i in 1:6) partialPlot(rfo,X,x.var=names(X)[i])

nhập mô tả hình ảnh ở đây


Tôi đã yêu cầu trước đó rằng các đóng góp tính năng cũng có thể được tính toán cho các cây được tăng cường. Tôi đã viết một thuật toán thử nghiệm và nó có thể. Thật không may, các đóng góp tính năng cho cây được tăng cường, không hiển thị các đặc tính có lợi tương tự như đối với cây được đóng bao. Hiệu ứng của một tính năng có xu hướng phân tán trên tất cả các đóng góp tính năng, do đó việc trực quan hóa trở nên khá khó hiểu.
Soren Havelund Welling

Ôi! Tôi đã tìm thấy một lỗi trong thuật toán thử nghiệm của mình, điều này làm cho tất cả các vấn đề tan biến. ForestFloor có thể được cập nhật để hoạt động tốt đối với các cây được tăng cường độ dốc.
Soren Havelund Welling

3
ForestFloor có được cập nhật để chấp nhận các đối tượng gbm không?
Misha

Cho đến nay, tôi đã thực hiện một triển khai ngược, bao bọc việc triển khai RandomForest thành một máy tăng cường độ dốc đầy đủ chức năng và xác định một số phương pháp để tính toán các đóng góp tính năng. Tôi nghĩ rằng việc thực hiện là hiệu quả hợp lý. Bạn có thể tìm mã ở đây: github.com/sorhawell/forestFloor/blob/master/inst/examples/...
Soren Havelund Welling

Để làm cho một cổng đầy đủ là công việc khó khăn :) Việc thực hiện này được thực hiện trong một vài dòng.
Soren Havelund Welling

24

Để bổ sung cho các phản hồi tốt này, tôi sẽ đề cập đến việc sử dụng các cây được tăng cường độ dốc (ví dụ Gói GBM trong R ). Trong R, tôi thích điều này hơn các khu rừng ngẫu nhiên vì các giá trị bị thiếu được cho phép so với RandomForest khi yêu cầu phải cắt bỏ. Tầm quan trọng thay đổi và các ô một phần có sẵn (như trong RandomForest) để hỗ trợ lựa chọn tính năng và thăm dò chuyển đổi phi tuyến trong mô hình logit của bạn. Hơn nữa, tương tác biến được giải quyết với thống kê H ( interact.gbm) của Friedman với tham chiếu được đưa ra là J.H. Friedman and B.E. Popescu (2005). “Predictive Learning via Rule Ensembles.” Section 8.1. Một phiên bản thương mại có tên TreeNet có sẵn từ Salford Systems và bản trình bày video này nói về việc họ thực hiện Video ước tính tương tác thay đổi .


2
Tôi đồng ý, GBM là bước tiếp theo hợp lý từ các khu rừng ngẫu nhiên.
Zach

@B_miner: Tuyệt vời! Tôi không biết làm thế nào, nhưng tôi đã bỏ qua GBM. Có vẻ như sử dụng GBM, thật dễ dàng để phát hiện các tương tác và phi tuyến.
Tomek Tarczynski

15

Trả lời muộn, nhưng tôi đã bắt gặp một gói R gần đây forestFloor(2015) giúp bạn thực hiện nhiệm vụ "unblackboxing" này theo cách tự động. Có vẻ rất hứa hẹn!

library(forestFloor)
library(randomForest)
#simulate data
obs=1000
vars = 18
X = data.frame(replicate(vars,rnorm(obs)))
Y = with(X, X1^2 + sin(X2*pi) + 2 * X3 * X4 + 1 * rnorm(obs))
#grow a forest, remeber to include inbag
rfo=randomForest(X,Y,keep.inbag = TRUE,sampsize=250,ntree=50)
#compute topology
ff = forestFloor(rfo,X)
#ggPlotForestFloor(ff,1:9)
plot(ff,1:9,col=fcol(ff))

Sản xuất các lô sau:

nhập mô tả hình ảnh ở đây

Nó cũng cung cấp hình ảnh ba chiều nếu bạn đang tìm kiếm sự tương tác.


4
Tôi đã xóa hỗ trợ cho ggplot2, thay vì thử dòng cuối cùng, ví dụ: cốt truyện (ff, 1: 9, col = fcol (ff, 1: 4))
Soren Havelund Welling

9

Như Zach đã đề cập, một cách để hiểu một mô hình là vẽ sơ đồ phản hồi khi các yếu tố dự đoán khác nhau. Bạn có thể thực hiện điều này một cách dễ dàng cho mô hình "bất kỳ" với gói âm mưu R. Ví dụ

library(randomForest)
data <- iris
data$Species <- factor(ifelse(data$Species=='virginica','virginica','other'))
mod <- randomForest(Species~Sepal.Length+Sepal.Width, data=data)
library(plotmo)
plotmo(mod, type="prob")

cái nào cho

âm mưu

Điều này thay đổi một biến trong khi giữ các biến khác ở các giá trị trung bình của chúng. Đối với các ô tương tác, nó thay đổi hai biến. (Lưu ý thêm vào tháng 11 năm 2016: plotmohiện tại cũng hỗ trợ các lô phụ thuộc một phần.)

Ví dụ trên chỉ sử dụng hai biến; các mô hình phức tạp hơn có thể được hình dung theo kiểu từng phần bằng cách nhìn vào một hoặc hai biến tại một thời điểm. Do các biến "khác" được giữ ở các giá trị trung bình của chúng, nên điều này chỉ hiển thị một lát dữ liệu, nhưng vẫn có thể hữu ích. Một số ví dụ có trong họa tiết cho gói cốt truyện . Các ví dụ khác nằm trong Chương 10 của Vẽ biểu đồ cây rpart với gói rpart.plot .


4

Bản thân tôi rất thích những câu hỏi kiểu này. Tôi nghĩ có rất nhiều thông tin chúng ta có thể thoát ra khỏi một khu rừng ngẫu nhiên.

Về tương tác, có vẻ như Breiman và Cultier đã cố gắng xem xét nó, đặc biệt là đối với các RF phân loại.

Theo hiểu biết của tôi, điều này đã không được thực hiện trong gói RandomForest R. Có lẽ bởi vì nó có thể không đơn giản và bởi vì ý nghĩa của "tương tác biến" phụ thuộc rất nhiều vào vấn đề của bạn.

Về tính phi tuyến, tôi không chắc bạn đang tìm kiếm gì, rừng hồi quy được sử dụng cho các vấn đề hồi quy đa tuyến mà không có bất kỳ mục sư nào sử dụng loại hàm phi tuyến nào.


3

Cuối trò chơi nhưng có một số phát triển mới ở mặt trận này, ví dụ LIMESHAP . Ngoài ra, một gói đáng để kiểm tra là DALEX (đặc biệt nếu sử dụng R nhưng trong mọi trường hợp có chứa các cheatheets tốt, v.v.), mặc dù dường như không bao gồm các tương tác tại thời điểm này. Và đây là tất cả các mô hình bất khả tri nên sẽ hoạt động cho các khu rừng ngẫu nhiên, GBM, mạng lưới thần kinh, v.v.


(+1) Tài nguyên tốt đẹp!
mkt

2

Một sửa đổi nhỏ của các khu rừng ngẫu nhiên cung cấp thêm thông tin về dữ liệu là các phương pháp rừng nhân quả được phát triển gần đây. Xem gói GRF R và giấy động lực ở đây . Ý tưởng là sử dụng các phương pháp đường cơ sở rừng ngẫu nhiên để tìm ra sự không đồng nhất trong các hiệu ứng nhân quả.

Một bài báo trước đó ( ở đây ) đưa ra một cách tiếp cận chi tiết về một khu rừng nhân quả đơn giản. Trang 9 của bài viết đưa ra quy trình từng bước để trồng cây nhân quả, sau đó có thể được mở rộng thành rừng theo những cách thông thường.Lấy từ Trang 9 của Athey và Wager 2017

Phương trình 4:

Phương trình 4

Phương trình 5: Phương trình 5


1
Cập nhật với các liên kết đến giấy trước đó và ảnh chụp màn hình từ giấy đó để hiển thị thủ tục cây nhân quả.
gannawag

1

Câu trả lời muộn liên quan đến câu hỏi của tôi ở đây ( Chúng ta có thể làm cho Rừng ngẫu nhiên 100% có thể hiểu được bằng cách sửa hạt giống không? ):

z1z2

  1. z1mD1(z1)D2(z1)D3(z1)Dm(z1)
  2. mT1(z1,z2)T2(z1,z2)T3(z1,z2)Tm(z1,z2)
  3. jth(j=1,2,...,m)xif^j(xi)(in,jm)
    F^(xi)=>1mj=1mf^j(xi)
  4. F^(xi)(z1,z2)xi
  5. xi
    x1F^(x1) - which is fixed> thanks to (z1,z2)
    x2F^(x2) -> which is fixed thanks to (z1,z2)
    x3→>F^(x3) - which is fixed thanks to (z1,z2)
    x4>→F^(x4) - which is fixed thanks to (z1,>z2)
    ....
  6. x1x2

Điều này cũng hoạt động cho mọi phương pháp tập hợp dựa trên tổng hợp của cây.

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.