1 Test giữa randomForest, randomForest with DoParallel và Ranger (Power Ranger)

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 :))

2. Chuẩn bị dữ liệu

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)

3 Cấu hình máy tính của mình

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

4.Benchmark

Mô hình RF được chạy trên caret, dùng crossvalidation 5 lần.

Model 1: Random Forest without DoParalell

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

Model 2: Random Forest with DoParalell

Ở 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

Model 3: Sử dụng gói Ranger (5 anh em siêu nhân yêu dấu)

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

Kết luận

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.