Thời gian tính toán rừng ngẫu nhiên trong R


49

Tôi đang sử dụng gói tiệc trong R với 10.000 hàng và 34 tính năng và một số tính năng yếu tố có hơn 300 cấp độ. Thời gian tính toán quá dài. (Đã mất 3 giờ cho đến nay và nó vẫn chưa kết thúc.)

Tôi muốn biết những yếu tố nào có ảnh hưởng lớn đến thời gian tính toán của một khu rừng ngẫu nhiên. Là nó có các yếu tố với quá nhiều cấp độ? Có phương pháp tối ưu hóa nào để cải thiện thời gian tính toán RF không?

Câu trả lời:


65

Độ phức tạp tổng thể của RF là một cái gì đó như ; nếu bạn muốn tăng tốc tính toán của mình lên, bạn có thể thử như sau:ntreemtry(# objects)log(# objects)

  1. Sử dụng randomForestthay vì party, hoặc, thậm chí tốt hơn, rangerhoặc Rborist(mặc dù cả hai chưa được thử nghiệm chiến đấu).
  2. Đừng sử dụng công thức, tức là gọi randomForest(predictors,decision)thay vì randomForest(decision~.,data=input).
  3. Sử dụng do.traceđối số để xem lỗi OOB trong thời gian thực; bằng cách này bạn có thể phát hiện ra rằng bạn có thể hạ thấp ntree.
  4. Về các yếu tố; RF (và tất cả các phương thức cây) cố gắng tìm một tập hợp con tối ưu của các cấp do đó quét các khả năng ; cuối cùng, yếu tố này có thể cung cấp cho bạn rất nhiều thông tin - chưa kể đến việc RandomForest sẽ không ăn các yếu tố với hơn 32 cấp độ. Có lẽ bạn chỉ đơn giản có thể coi nó là một thứ tự (và do đó tương đương với một biến số, bình thường cho RF) hoặc gom nó trong một số nhóm, tách một thuộc tính này thành nhiều thuộc tính?2(# of levels-1)
  5. Kiểm tra xem máy tính của bạn chưa hết RAM và nó đang sử dụng không gian trao đổi. Nếu vậy, mua một máy tính lớn hơn.
  6. Cuối cùng, bạn có thể trích xuất một số tập hợp con ngẫu nhiên của các đối tượng và thực hiện một số thử nghiệm ban đầu về điều này.

2
Cảm ơn bạn, tôi học được rất nhiều từ câu trả lời của bạn và đã làm một bài kiểm tra như bạn đã nói, bên cạnh đó, tại sao đề xuất thứ hai hoạt động?
Chenghao Liu

4
@ChenghaoLiu Công thức được thiết kế cho các khung mô hình lót nhỏ nhưng phức tạp và do đó chúng không hiệu quả khi sao chép bộ trở nên đắt tiền.

1
Tại sao gọi RandomForest (dự đoán, quyết định) giảm thời gian chạy?
JenSCDC

mtry

1
@AndyBlankertz Giải thích công thức trong RandomForest dường như dẫn đến việc sao chép toàn bộ đầu vào.

12

Bởi vì RandomForest là một tập hợp các giỏ hàng độc lập được đào tạo dựa trên một tập hợp con các tính năng ngẫu nhiên và ghi lại nó cho vay để song song hóa. Các combine()chức năng trong gói randomForest sẽ khâu lại với nhau rừng được đào tạo một cách độc lập. Dưới đây là một ví dụ đồ chơi. Vì câu trả lời của @mpq nói rằng bạn không nên sử dụng ký hiệu công thức, mà chuyển vào một khung dữ liệu / ma trận các biến và một vectơ kết quả. Tôi không biết xấu hổ nhấc những thứ này khỏi tài liệu.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

Tôi đã chuyển hàm kết hợp RandomForest cho tham số .combine có tên tương tự (điều khiển hàm trên đầu ra của vòng lặp. Mặt trái là bạn không có tỷ lệ lỗi OOB hoặc tầm quan trọng của biến số bi thảm hơn.

Biên tập:

Sau khi đọc lại bài đăng tôi nhận ra rằng tôi không nói gì về vấn đề 34+. Một câu trả lời không suy nghĩ có thể là đại diện cho chúng dưới dạng các biến nhị phân. Đó là mỗi yếu tố một cột được mã hóa 0/1 -level Fact về sự hiện diện / không hiện diện của nó. Bằng cách thực hiện một số lựa chọn khác nhau về các yếu tố không quan trọng và loại bỏ chúng, bạn có thể giữ cho không gian của bạn phát triển quá lớn.


Chào mừng đến với trang web, @jdennison. Đây có vẻ là một đóng góp thực sự tốt đẹp (mặc dù tôi thực sự không biết quá nhiều về RF & không có gì về điện toán song song). Một lưu ý, thứ tự của các câu trả lời có thể dao động theo thời gian, vì vậy tốt nhất không nên tham khảo "câu trả lời ở trên", mà thay vào đó là "câu trả lời của \ @ so-so".
gung - Tái lập Monica

Xin lỗi vì đã trả lời bạn muộn. Tôi đã đọc blog của bạn, công việc tuyệt vời
Chenghao Liu

3

Tôi muốn đề xuất một vài liên kết:

1) Thu hẹp số cấp của một biến nhân tố là một liên kết đến một câu hỏi stackoverflowđể giải quyết vấn đề tương tự trong khi sử dụng randomForestgói. Cụ thể, nó liên quan đến việc chỉ sử dụng các cấp độ xảy ra thường xuyên nhất và gán một cấp độ mới cho tất cả các cấp độ khác, ít xảy ra hơn.

Ý tưởng cho nó xuất phát từ đây: Thử thách chậm KDD Cup 2009 . Dữ liệu cho cuộc thi này có rất nhiều yếu tố với nhiều cấp độ và nó thảo luận về một số phương pháp họ đã sử dụng để giảm dữ liệu từ 50.000 hàng xuống 15.000 cột để chạy trên máy tính xách tay RAM 2 lõi / 2 GB.

Đề xuất cuối cùng của tôi sẽ là xem xét việc chạy vấn đề, như được đề xuất ở trên, song song trên một ví dụ Amazon EC2 hi-CPU.


Không có 2) . Bạn nên cung cấp phần quan trọng của trang thay vì dựa hoàn toàn vào liên kết.
AL

Tôi thích cách các trường hợp EC chạy. Wow họ tốt đẹp. Tôi nghĩ phần cứng ảo hóa tốt hơn so với thực tế.
EngrStudent - Phục hồi Monica

2

Tôi không thể nói về tốc độ của các thuật toán cụ thể trong R nhưng rõ ràng điều gì gây ra thời gian tính toán dài. Đối với mỗi cây ở mỗi nhánh, GIỎ HÀNG đang tìm kiếm hình thức phân chia nhị phân tốt nhất. Vì vậy, đối với mỗi trong số 34 tính năng, hầu hết đều nhìn vào các phân chia được đưa ra bởi mỗi cấp độ của các biến. Nhân thời gian chạy cho mỗi lần phân chia trong một cây với số nhánh trong cây và sau đó nhân số đó với số cây trong rừng và bạn có thời gian chạy dài. Ai biết? Có lẽ ngay cả với một máy tính nhanh, điều này có thể mất nhiều năm để hoàn thành?

Cách tốt nhất để tăng tốc mọi thứ tôi nghĩ sẽ là gộp một số cấp độ lại với nhau để mỗi biến giảm xuống có thể từ 3 đến 5 cấp thay vì tới 300. Tất nhiên điều này phụ thuộc vào việc có thể làm điều này mà không mất đi sự quan trọng thông tin trong dữ liệu của bạn.

Sau đó, có lẽ bạn có thể xem liệu có một thuật toán thông minh nào có thể tăng tốc thời gian tìm kiếm để phân tách tại mỗi nút của từng cây riêng lẻ hay không. có thể là tại một cây cụ thể, tìm kiếm phân tách là sự lặp lại của tìm kiếm đã được thực hiện cho cây trước đó. Vì vậy, nếu bạn có thể lưu các giải pháp của các quyết định phân tách trước đó và xác định khi bạn lặp lại, có thể chiến lược đó có thể tiết kiệm một chút thời gian tính toán.


Cảm ơn bạn một lần nữa, tôi hoàn toàn đồng ý với bạn. Và tôi cố gắng giảm số cấp bằng phương pháp giả. Ví dụ: tôi thay thế một công cụ dự đoán bằng 600 cấp bằng 4 dự đoán (như 600 <5 ^ 4) Sau khi chuyển đổi này, tôi có thể chạy thuật toán rừng ngẫu nhiên. Tuy nhiên, kết quả RMSE rất lạ, tôi sẽ mở hai câu hỏi khác về cách giảm mức độ của tính năng yếu tố và mối quan hệ giữa CV RMSE 10 lần và điểm kiểm tra RMSE?
Chenghao Liu
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.