Các dự đoán của mô hình Rừng ngẫu nhiên có khoảng dự đoán không?


52

Nếu tôi chạy một randomForestmô hình, thì tôi có thể đưa ra dự đoán dựa trên mô hình đó. Có cách nào để có được một khoảng dự đoán của từng dự đoán để tôi biết mô hình đó "chắc chắn" như thế nào về câu trả lời của nó không. Nếu điều này là có thể thì nó chỉ đơn giản dựa trên sự thay đổi của biến phụ thuộc cho toàn bộ mô hình hoặc nó sẽ có các khoảng rộng hơn và hẹp hơn tùy thuộc vào cây quyết định cụ thể được theo dõi cho một dự đoán cụ thể?


3
AFAIK, tất cả các thư viện RF có một số loại scorechức năng để đánh giá hiệu suất. Vì đầu ra dựa trên đa số phiếu của các cây trong rừng, nên trong trường hợp phân loại, nó sẽ cho bạn xác suất kết quả này là đúng, dựa trên phân phối phiếu. Tôi không chắc chắn về hồi quy mặc dù .... Bạn sử dụng thư viện nào?
sashkello

1
Bạn nên đọc bài này: stats.stackexchange.com/questions/12425/iêu
0asa

Câu trả lời:


40

Đây là một phần phản hồi cho @Sashikanth Dareddy (vì nó không phù hợp với một bình luận) và một phần là phản hồi cho bài viết gốc.

Hãy nhớ một khoảng dự đoán là gì, đó là một khoảng hoặc tập hợp các giá trị mà chúng tôi dự đoán rằng các quan sát trong tương lai sẽ nằm. Nói chung, khoảng dự đoán có 2 phần chính xác định độ rộng của nó, một phần biểu thị độ không đảm bảo về giá trị trung bình dự đoán (hoặc tham số khác) đây là phần khoảng tin cậy và phần đại diện cho tính biến thiên của các quan sát riêng lẻ xung quanh giá trị trung bình đó. Khoảng tin cậy là cổ tích mạnh mẽ do Định lý giới hạn trung tâm và trong trường hợp là một khu rừng ngẫu nhiên, bootstrapping cũng giúp. Nhưng khoảng dự đoán hoàn toàn phụ thuộc vào các giả định về cách dữ liệu được phân phối cho các biến dự đoán, CLT và bootstrapping không ảnh hưởng đến phần đó.

Khoảng dự đoán phải rộng hơn trong đó khoảng tin cậy tương ứng cũng sẽ rộng hơn. Những thứ khác có thể ảnh hưởng đến độ rộng của khoảng dự đoán là các giả định về phương sai bằng nhau hay không, điều này phải xuất phát từ kiến ​​thức của nhà nghiên cứu, chứ không phải mô hình rừng ngẫu nhiên.

Một khoảng dự đoán không có ý nghĩa đối với một kết quả phân loại (bạn có thể thực hiện một bộ dự đoán thay vì một khoảng, nhưng hầu hết thời gian có thể sẽ không có nhiều thông tin).

Chúng ta có thể thấy một số vấn đề xung quanh các khoảng dự đoán bằng cách mô phỏng dữ liệu nơi chúng ta biết sự thật chính xác. Hãy xem xét các dữ liệu sau:

set.seed(1)

x1 <- rep(0:1, each=500)
x2 <- rep(0:1, each=250, length=1000)

y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

Dữ liệu cụ thể này tuân theo các giả định cho hồi quy tuyến tính và khá đơn giản để phù hợp với rừng ngẫu nhiên. Chúng ta biết từ mô hình "đúng" khi cả hai yếu tố dự đoán bằng 0, giá trị trung bình là 10, chúng ta cũng biết rằng các điểm riêng lẻ tuân theo phân phối chuẩn với độ lệch chuẩn là 1. Điều này có nghĩa là khoảng dự đoán 95% dựa trên kiến ​​thức hoàn hảo cho những điểm này sẽ từ 8 đến 12 (thực tế là 8,04 đến 11,96, nhưng làm tròn giúp đơn giản hơn). Bất kỳ khoảng dự đoán ước tính nào cũng phải rộng hơn khoảng này (không có thông tin hoàn hảo sẽ thêm chiều rộng để bù) và bao gồm phạm vi này.

Hãy xem xét các khoảng thời gian từ hồi quy:

fit1 <- lm(y ~ x1 * x2)

newdat <- expand.grid(x1=0:1, x2=0:1)

(pred.lm.ci <- predict(fit1, newdat, interval='confidence'))
#        fit       lwr      upr
# 1 10.02217  9.893664 10.15067
# 2 14.90927 14.780765 15.03778
# 3 20.02312 19.894613 20.15162
# 4 21.99885 21.870343 22.12735

(pred.lm.pi <- predict(fit1, newdat, interval='prediction'))
#        fit      lwr      upr
# 1 10.02217  7.98626 12.05808
# 2 14.90927 12.87336 16.94518
# 3 20.02312 17.98721 22.05903
# 4 21.99885 19.96294 24.03476

Chúng ta có thể thấy có một số sự không chắc chắn trong các phương tiện ước tính (khoảng tin cậy) và điều đó mang lại cho chúng ta một khoảng dự đoán rộng hơn (nhưng bao gồm) phạm vi 8 đến 12.

Bây giờ chúng ta hãy xem xét khoảng thời gian dựa trên các dự đoán riêng lẻ của từng cây riêng lẻ (chúng ta nên kỳ vọng chúng sẽ rộng hơn vì rừng ngẫu nhiên không được hưởng lợi từ các giả định (mà chúng ta biết là đúng với dữ liệu này) mà hồi quy tuyến tính thực hiện):

library(randomForest)
fit2 <- randomForest(y ~ x1 + x2, ntree=1001)

pred.rf <- predict(fit2, newdat, predict.all=TRUE)

pred.rf.int <- apply(pred.rf$individual, 1, function(x) {
  c(mean(x) + c(-1, 1) * sd(x), 
  quantile(x, c(0.025, 0.975)))
})

t(pred.rf.int)
#                           2.5%    97.5%
# 1  9.785533 13.88629  9.920507 15.28662
# 2 13.017484 17.22297 12.330821 18.65796
# 3 16.764298 21.40525 14.749296 21.09071
# 4 19.494116 22.33632 18.245580 22.09904

Các khoảng rộng hơn các khoảng dự đoán hồi quy, nhưng chúng không bao gồm toàn bộ phạm vi. Chúng bao gồm các giá trị thực và do đó có thể là hợp pháp như các khoảng tin cậy, nhưng chúng chỉ dự đoán giá trị trung bình (giá trị dự đoán) ở đâu, không có phần bổ sung cho phân phối xung quanh giá trị trung bình đó. Đối với trường hợp đầu tiên có x1 và x2 đều bằng 0, các khoảng không đi xuống dưới 9,7, điều này rất khác với khoảng dự đoán thực sự giảm xuống 8. Nếu chúng ta tạo các điểm dữ liệu mới thì sẽ có một vài điểm (nhiều hơn nữa hơn 5%) trong các khoảng thời gian thực và hồi quy, nhưng không rơi vào các khoảng rừng ngẫu nhiên.

Để tạo khoảng dự đoán, bạn sẽ cần đưa ra một số giả định mạnh mẽ về phân bố các điểm riêng lẻ xung quanh các phương tiện dự đoán, sau đó bạn có thể lấy dự đoán từ các cây riêng lẻ (đoạn khoảng tin cậy khởi động) sau đó tạo giá trị ngẫu nhiên từ giả định phân phối với trung tâm đó. Các lượng tử cho những mảnh được tạo ra có thể tạo thành khoảng dự đoán (nhưng tôi vẫn sẽ kiểm tra nó, bạn có thể cần lặp lại quá trình nhiều lần nữa và kết hợp lại).

Dưới đây là một ví dụ về việc thực hiện điều này bằng cách thêm độ lệch bình thường (vì chúng ta biết dữ liệu gốc đã sử dụng độ lệch bình thường) cho các dự đoán với độ lệch chuẩn dựa trên MSE ước tính từ cây đó:

pred.rf.int2 <- sapply(1:4, function(i) {
  tmp <- pred.rf$individual[i, ] + rnorm(1001, 0, sqrt(fit2$mse))
  quantile(tmp, c(0.025, 0.975))
})
t(pred.rf.int2)
#           2.5%    97.5%
# [1,]  7.351609 17.31065
# [2,] 10.386273 20.23700
# [3,] 13.004428 23.55154
# [4,] 16.344504 24.35970

Những khoảng này chứa những cái dựa trên kiến ​​thức hoàn hảo, vì vậy nhìn hợp lý. Nhưng, chúng sẽ phụ thuộc rất lớn vào các giả định được đưa ra (các giả định có giá trị ở đây vì chúng tôi đã sử dụng kiến ​​thức về cách dữ liệu được mô phỏng, chúng có thể không hợp lệ trong các trường hợp dữ liệu thực). Tôi vẫn sẽ lặp lại các mô phỏng nhiều lần cho dữ liệu trông giống dữ liệu thực của bạn (nhưng được mô phỏng để bạn biết sự thật) nhiều lần trước khi hoàn toàn tin tưởng phương pháp này.


11

Tôi nhận ra đây là một bài viết cũ nhưng tôi đã chạy một số mô phỏng về điều này và nghĩ rằng tôi sẽ chia sẻ những phát hiện của mình.

@GregSnow đã thực hiện một bài viết rất chi tiết về điều này nhưng tôi tin rằng khi tính toán khoảng thời gian bằng cách sử dụng các dự đoán từ từng cây mà anh ấy đang xem chỉ là khoảng dự đoán 70%. Chúng ta cần phải nhìn vào để có được những khoảng thời gian dự đoán 95%.[ μ + 1,96 * σ , μ - 1,96 * σ ][μ+σ,μσ][μ+1.96σ,μ1.96σ]

Thực hiện thay đổi này thành mã @GregSnow, chúng tôi nhận được các kết quả sau

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000)

library(randomForest)
fit2 <- randomForest(y~x1+x2)
pred.rf <- predict(fit2, newdat, predict.all=TRUE)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))

pred.rf.int
                          2.5%    97.5%
1  7.826896 16.05521  9.915482 15.31431
2 11.010662 19.35793 12.298995 18.64296
3 14.296697 23.61657 14.749248 21.11239
4 18.000229 23.73539 18.237448 22.10331

Bây giờ, so sánh các khoảng này với các khoảng được tạo bằng cách thêm độ lệch bình thường vào các dự đoán với độ lệch chuẩn như MSE như @GregSnow đề xuất chúng tôi nhận được,

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
          2.5%    97.5%
[1,]  7.486895 17.21144
[2,] 10.551811 20.50633
[3,] 12.959318 23.46027
[4,] 16.444967 24.57601

Khoảng cách của cả hai phương pháp này hiện đang rất gần nhau. Vẽ khoảng thời gian dự đoán cho ba phương pháp chống lại phân phối lỗi trong trường hợp này trông như dưới đây

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

  • Đường màu đen = khoảng dự đoán từ hồi quy tuyến tính,
  • Đường màu đỏ = Khoảng rừng ngẫu nhiên được tính theo Dự đoán riêng lẻ,
  • Đường màu xanh = Khoảng rừng ngẫu nhiên được tính bằng cách thêm độ lệch bình thường vào dự đoán

Bây giờ, chúng ta hãy chạy lại mô phỏng nhưng lần này làm tăng phương sai của thuật ngữ lỗi. Nếu tính toán khoảng dự đoán của chúng tôi là tốt, chúng tôi sẽ kết thúc với khoảng rộng hơn so với những gì chúng tôi nhận được ở trên.

set.seed(1)
x1 <- rep( 0:1, each=500 )
x2 <- rep( 0:1, each=250, length=1000 )
y <- 10 + 5*x1 + 10*x2 - 3*x1*x2 + rnorm(1000,mean=0,sd=5)

fit1 <- lm(y~x1+x2)
newdat <- expand.grid(x1=0:1,x2=0:1)
predict(fit1,newdata=newdat,interval = "prediction")
      fit       lwr      upr
1 10.75006  0.503170 20.99695
2 13.90714  3.660248 24.15403
3 19.47638  9.229490 29.72327
4 22.63346 12.386568 32.88035

set.seed(1)
fit2 <- randomForest(y~x1+x2,localImp=T)
pred.rf.int <- t(apply( pred.rf$individual, 1, function(x){ 
  c( mean(x) + c(-1.96,1.96)*sd(x), quantile(x, c(0.025,0.975)) )}))
pred.rf.int
                          2.5%    97.5%
1  7.889934 15.53642  9.564565 15.47893
2 10.616744 18.78837 11.965325 18.51922
3 15.024598 23.67563 14.724964 21.43195
4 17.967246 23.88760 17.858866 22.54337

pred.rf.int2 <- sapply(1:4, function(i) {
   tmp <- pred.rf$individual[i,] + rnorm(1000, 0, sqrt(fit2$mse))
   quantile(tmp, c(0.025, 0.975))
   })
t(pred.rf.int2)
         2.5%    97.5%
[1,] 1.291450 22.89231
[2,] 4.193414 25.93963
[3,] 7.428309 30.07291
[4,] 9.938158 31.63777

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

Bây giờ, điều này cho thấy rõ rằng việc tính toán các khoảng dự đoán theo cách tiếp cận thứ hai chính xác hơn nhiều và cho kết quả khá gần với khoảng dự đoán từ hồi quy tuyến tính.

Lấy giả định về tính quy tắc, có một cách khác dễ dàng hơn để tính các khoảng dự đoán từ rừng ngẫu nhiên. Từ mỗi cây riêng lẻ, chúng ta có giá trị dự đoán ( ) cũng như lỗi bình phương trung bình ( ). Vì vậy, dự đoán từ mỗi cây riêng lẻ có thể được coi là . Sử dụng các thuộc tính phân phối bình thường, dự đoán của chúng tôi từ khu rừng ngẫu nhiên sẽ có phân phối . Áp dụng điều này vào ví dụ chúng ta đã thảo luận ở trên, chúng ta nhận được kết quả dưới đâyμi N ( μ i , R M S E i ) N ( Σ μ i / n , Σ R M S E i / n )MSEiN(μi,RMSEi)N(μi/n,RMSEi/n)

mean.rf <- pred.rf$aggregate
sd.rf <- mean(sqrt(fit2$mse))
pred.rf.int3 <- cbind(mean.rf - 1.96*sd.rf, mean.rf + 1.96*sd.rf)
pred.rf.int3
1  1.332711 22.09364
2  4.322090 25.08302
3  8.969650 29.73058
4 10.546957 31.30789

Những kiểm đếm này rất tốt với các khoảng mô hình tuyến tính và cả cách tiếp cận @GregSnow đề xuất. Nhưng lưu ý rằng giả định cơ bản trong tất cả các phương pháp mà chúng ta đã thảo luận là các lỗi tuân theo phân phối chuẩn.


10

Nếu bạn sử dụng R, bạn có thể dễ dàng tạo ra các khoảng dự đoán cho các dự đoán về hồi quy rừng ngẫu nhiên: Chỉ cần sử dụng gói quantregForest(có sẵn tại CRAN ) và đọc bài báo của N. Meinshausen về cách các lượng tử có điều kiện có thể được suy ra với các rừng hồi quy lượng tử và cách chúng có thể được sử dụng để xây dựng các khoảng dự đoán. Rất nhiều thông tin ngay cả khi bạn không làm việc với R!


Có vẻ như giấy đã được chuyển đến đây: jmlr.org/ con / volume7 / musshausen06a / musshausen06a.pdf
Tái lập Monica

2
Đây có vẻ như là câu trả lời thích hợp và không yêu cầu các giả định phân phối liên quan đến khoảng dự đoán. Có một hướng dẫn về cách thực hiện điều này trong python tại đây: blog.datadive.net/prediction-inter đạn
colin

6

Điều này là dễ dàng để giải quyết với RandomForest.

Trước tiên hãy để tôi giải quyết nhiệm vụ hồi quy (giả sử rừng của bạn có 1000 cây). Trong predicthàm, bạn có tùy chọn trả về kết quả từ các cây riêng lẻ. Điều này có nghĩa là bạn sẽ nhận được 1000 cột đầu ra. Chúng ta có thể lấy trung bình 1000 cột cho mỗi hàng - đây là đầu ra RF thông thường sẽ được tạo ra bằng mọi cách. Bây giờ để có được khoảng dự đoán, hãy nói +/- 2 std. độ lệch tất cả những gì bạn cần làm là, cho mỗi hàng, từ 1000 giá trị tính toán +/- 2 std. sai lệch và làm cho những giới hạn trên và dưới của bạn trên dự đoán của bạn.

Thứ hai, trong trường hợp phân loại, hãy nhớ rằng mỗi cây xuất ra 1 hoặc 0 (theo mặc định) và tổng trên tất cả 1000 cây được chia cho 1000 sẽ cho xác suất của lớp (trong trường hợp phân loại nhị phân). Để đặt một khoảng dự đoán về xác suất bạn cần sửa đổi tối thiểu. tùy chọn nút kích thước (xem tài liệu ngẫu nhiên ngẫu nhiên cho tên chính xác của tùy chọn đó) khi bạn đặt giá trị >> 1 thì các cây riêng lẻ sẽ xuất các số từ 1 đến 0. Bây giờ, từ đây, bạn có thể lặp lại quy trình tương tự như được mô tả ở trên cho nhiệm vụ hồi quy.

Tôi hy vọng điều đó đúng.


Tôi đã không thử nó nhưng nó có vẻ có ý nghĩa. Cảm ơn đã trả lời câu hỏi cũ của tôi.
Dean MacGregor

1
Tôi nghĩ rằng phương pháp này sẽ cung cấp một cái gì đó giống như một khoảng tin cậy hơn là một khoảng dự đoán. Các kết quả nên được so sánh với một mô hình tuyến tính trong đó lý thuyết về các khoảng dự đoán được thiết lập tốt. Tốt nhất trên một số dữ liệu mô phỏng trong đó sự thật được biết đến và tất cả các giả định nắm giữ.
Greg Snow

1
@GregSnow: Những gì bạn sẽ nhận được từ những gì tôi mô tả ở trên là chắc chắn khoảng dự đoán. Lưu ý rằng khoảng dự đoán thường rộng hơn nhiều so với khoảng tin cậy vì khoảng tin cậy thực sự xác định rõ thống kê trung bình của quanitiy nằm ở đâu khi dự đoán chỉ liên quan đến một quan sát do đó không chắc chắn hơn và do đó khoảng rộng hơn. 1000 dự đoán bạn nhận được từ 1000 cây có thể được coi là một mẫu đã được khởi động và bạn không cần phải áp dụng các giả định quy tắc ở đây. Ngay cả phân tích decile đơn giản sẽ cho kết quả tốt.

5
@SashikanthDareddy, Những gì bạn sẽ nhận được từ những gì bạn mô tả chắc chắn không phải là một khoảng dự đoán. Một khoảng dự đoán được xác định bởi nhiều hơn là chỉ rộng hơn. Có, các cây riêng lẻ tạo thành một bootstrap, nhưng bootstrap ước tính các tham số, không phải các giá trị riêng lẻ. Khoảng dự đoán rất phụ thuộc vào sự phân bố của các điểm riêng lẻ. Thực tế là phương pháp của bạn đưa ra một khoảng cho các tỷ lệ với kết quả phân loại thay vì các danh mục cho thấy điều này. Xem ví dụ của tôi trong câu trả lời thêm.
Greg Snow

0

Tôi đã thử một số tùy chọn (tất cả là WIP):

  1. Tôi thực sự đã biến biến phụ thuộc thành một vấn đề phân loại với kết quả là phạm vi, thay vì một giá trị duy nhất. Kết quả tôi nhận được rất kém, so với việc sử dụng một giá trị đơn giản. Tôi đã từ bỏ phương pháp này.

  2. Sau đó, tôi đã chuyển đổi nó thành nhiều vấn đề phân loại, mỗi vấn đề được giới hạn dưới cho phạm vi (kết quả của mô hình là liệu nó có vượt qua giới hạn dưới hay không) và sau đó chạy tất cả các mô hình (~ 20), và sau đó kết hợp kết quả để có được câu trả lời cuối cùng dưới dạng phạm vi. Điều này hoạt động tốt hơn 1 ở trên nhưng không tốt như tôi cần. Tôi vẫn đang làm việc để cải thiện phương pháp này.

Tôi đã sử dụng OOB và các ước tính bỏ qua để quyết định mức độ tốt / xấu của các mô hình của tôi.


0

Vấn đề xây dựng các khoảng dự đoán cho các dự đoán rừng ngẫu nhiên đã được đề cập trong bài viết sau:

Zhang, Haozhe, Joshua Zimmerman, Dan Nettleton và Daniel J. Nordman. "Khoảng dự đoán rừng ngẫu nhiên." Thống kê người Mỹ, 2019.

Gói R "rfinterval" là triển khai có sẵn tại CRAN.

Cài đặt

Để cài đặt gói R rfinterval :

#install.packages("devtools")
#devtools::install_github(repo="haozhestat/rfinterval")
install.packages("rfinterval")
library(rfinterval)
?rfinterval

Sử dụng

Bắt đầu nhanh:

train_data <- sim_data(n = 1000, p = 10)
test_data <- sim_data(n = 1000, p = 10)

output <- rfinterval(y~., train_data = train_data, test_data = test_data,
                     method = c("oob", "split-conformal", "quantreg"),
                     symmetry = TRUE,alpha = 0.1)

### print the marginal coverage of OOB prediction interval
mean(output$oob_interval$lo < test_data$y & output$oob_interval$up > test_data$y)

### print the marginal coverage of Split-conformal prediction interval
mean(output$sc_interval$lo < test_data$y & output$sc_interval$up > test_data$y)

### print the marginal coverage of Quantile regression forest prediction interval
mean(output$quantreg_interval$lo < test_data$y & output$quantreg_interval$up > test_data$y)

Ví dụ dữ liệu:

oob_interval <- rfinterval(pm2.5 ~ .,
                            train_data = BeijingPM25[1:1000, ],
                            test_data = BeijingPM25[1001:2000, ],
                            method = "oob",
                            symmetry = TRUE,
                            alpha = 0.1)
str(oob_interval)

1
Chào mừng bạn đến với trang web, @ xiaolongmao. Bạn có thể muốn thực hiện chuyến tham quan của chúng tôi . Xin vui lòng không gửi câu trả lời giống hệt nhau cho nhiều chủ đề. Cố gắng tùy chỉnh câu trả lời của bạn cho câu hỏi cụ thể trên mỗi chủ đề. Nếu bạn có một trường hợp mà bạn thực sự tin rằng một câu trả lời giống hệt hoàn toàn trả lời câu hỏi, thì điều đó có nghĩa là câu hỏi đó là một bản sao. Khi bạn đạt 50 danh tiếng, bạn có thể đăng bình luận lên OP. Tạm thời, bạn có thể gắn cờ Q để đóng dưới dạng trùng lặp.
gung - Tái lập Monica
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.