Random Forest (RF) là một mô hình rất mạnh và được sử dụng một cách rộng rãi trong vài năm gần đây. Tuy nhiên, RF có thể ngốn rất nhiều thời gian nếu dữ liệu bạn lớn. Bài viết ngắn này mụch đích để thử benchmark cho 3 cách tiếp cận Random Forest. Kết luận là chạy multicore sẽ giúp bạn tiết kiệm thời gian và 5 anh em siêu nhân Power Ranger tuy đã già nhưng vẫn máu lửa lắm :))
Mình sử dụng dữ liệu solubility (Tetko et al. 2001 và Huuskonen 2000) trong gói Applied Predictive Modeling của quyển sách cùng tên Max Kuhn và Kjell Johnson.
Dữ liệu là một matrix 1267x229. Đối với RF, càng nhiều biến thì RF càng tốn thời gian
library(AppliedPredictiveModeling)
library(ranger)
library(doParallel)
library(randomForest)
library(caret)
data("solubility")
solTrainXtrans$y <- solTrainY
solTestXtrans$y <- solTestY
df <- rbind(solTrainXtrans,solTestXtrans)
Hiện giờ mình đang sử dụng Core i7, 8 cores đời thứ 5 thì phải, 2.4 GHz. RAM 16GB và chạy trên SSD 128GB
Mô hình RF được chạy trên caret, dùng crossvalidation 5 lần.
fitControl <- trainControl(method = "cv",
number = 5,
allowParallel = F)
t=Sys.time()
rf_1=train(y~., data=df, method ="rf", trControl = fitControl)
Sys.time()-t
Máy mình chạy mất 4.075491 mins
Ở bước này mình chỉ sử dụng 3 cores để chạy RF. Nếu máy bạn 4 cores thì nên chừa lại 1 core cho OS chạy nữa. Hoặc nhiều khi coi youtube, đọc báo :)
cl=makeCluster(3)
registerDoParallel(cl)
fitControl <- trainControl(method = "cv",
number = 5,
allowParallel = TRUE)
t=Sys.time()
rf_2=train(y~., data=df, method = "rf", trControl = fitControl)
Sys.time()-t
stopCluster(cl)
registerDoSEQ()
Máy mình chạy 3 cores cho mô hình rf_2 mất 2.199746 mins. Bạn đã tiết kiệm được nửa thời gian
fitControl <- trainControl(method = "cv",
number = 5,
allowParallel = TRUE)
t=Sys.time()
rf_3=train(y~., data=df, method = "ranger", trControl = fitControl)
Sys.time()-t
Bước này máy mình chạy mất 26.91155 secs
Từ 4 phút, bạn chỉ mất 27 giây cho mô hình RF. Nếu dữ liệu bạn lớn gấp nhiều lần, bạn sẽ ít thời gian hơn để uống cafe chờ máy chạy xong rồi đó :)
Ps: rf_1 … rf_3 đều cho ra kết quả như nhau. Phần kết quả, xin không trình bày ở đây.