Tuning Hyperparameter Model Random Forest dengan Bahasa R

Tuning Hyperparameter Random Forest R

Sekilas Random Forest

Random Forest adalah model ensemble berbasis pohon yang populer pada machine learning. Model ini diperkenalkan oleh Leo Breiman pada Tahun 2001. Random Forest dapat diterapkan pada pemodelan regresi maupun klasifikasi. Pada model random forest untuk regresi prediksi dihitung berdasarkan nilai rata-rata (averaging) dari output setiap decision tree. Sedangkan untuk model klasifikasi, prediksi ditentukan menggunakan suara terbanyak (majority vote). Contohnya, model Random Forest dengan 100 pohon dengan 72 pohon memprediksi data tertentu sebagai kelas A dan 28 pohon memprediksi masuk kelas B, maka data tersebut akan diprediksi sebagai kelas A.

Ilustrasi Model Random Forest

Tutorial ini membahas pembuatan model random forest menggunakan Bahasa R khususnya dengan paket caret dan randomForest.

[Terdapat paket lain yang powerful serta lebih terintegrasi yaitu tidymodels. Tutorial random forest dengan tidymodels dapat dilihat di sini Membangun Model Machine Learning dengan tidymodels R.]

Data

Data yang akan digunakan adalah dataset Sonar yang tersedia pada package mlbench. Dataset Sonar terdiri dari 208 sampel, di mana setiap sampel mewakili pola sonar yang dipantulkan oleh sebuah objek di bawah air. Setiap sampel memiliki 60 fitur numerik yang menyatakan kekuatan sinyal sonar pada frekuensi tertentu. Fitur-fitur ini direpresentasikan sebagai bilangan real antara 0,0 hingga 1,0. Tujuannya adalah untuk membedakan antara sinyal sonar yang dipantulkan oleh batuan (kelas “R”) dan sinyal sonar yang dipantulkan oleh tambang logam (kelas “M”).

Package caret dan randomForest digunakan untuk melatih model Random Forest serta melakukan tuning hyperparameter.

R

library(caret)
library(mlbench)
library(randomForest)

# Load Dataset Sonar
data(Sonar)

summary(Sonar)

Output

       V1                V2                V3                V4                V5                V6                V7        
 Min.   :0.00150   Min.   :0.00060   Min.   :0.00150   Min.   :0.00580   Min.   :0.00670   Min.   :0.01020   Min.   :0.0033  
 1st Qu.:0.01335   1st Qu.:0.01645   1st Qu.:0.01895   1st Qu.:0.02438   1st Qu.:0.03805   1st Qu.:0.06703   1st Qu.:0.0809  
 Median :0.02280   Median :0.03080   Median :0.03430   Median :0.04405   Median :0.06250   Median :0.09215   Median :0.1070  
 Mean   :0.02916   Mean   :0.03844   Mean   :0.04383   Mean   :0.05389   Mean   :0.07520   Mean   :0.10457   Mean   :0.1217  
 3rd Qu.:0.03555   3rd Qu.:0.04795   3rd Qu.:0.05795   3rd Qu.:0.06450   3rd Qu.:0.10028   3rd Qu.:0.13412   3rd Qu.:0.1540  
 Max.   :0.13710   Max.   :0.23390   Max.   :0.30590   Max.   :0.42640   Max.   :0.40100   Max.   :0.38230   Max.   :0.3729  

...
  
      V50               V51                V52                V53                V54                V55               V56          
 Min.   :0.00000   Min.   :0.000000   Min.   :0.000800   Min.   :0.000500   Min.   :0.001000   Min.   :0.00060   Min.   :0.000400  
 1st Qu.:0.01155   1st Qu.:0.008425   1st Qu.:0.007275   1st Qu.:0.005075   1st Qu.:0.005375   1st Qu.:0.00415   1st Qu.:0.004400  
 Median :0.01790   Median :0.013900   Median :0.011400   Median :0.009550   Median :0.009300   Median :0.00750   Median :0.006850  
 Mean   :0.02042   Mean   :0.016069   Mean   :0.013420   Mean   :0.010709   Mean   :0.010941   Mean   :0.00929   Mean   :0.008222  
 3rd Qu.:0.02527   3rd Qu.:0.020825   3rd Qu.:0.016725   3rd Qu.:0.014900   3rd Qu.:0.014500   3rd Qu.:0.01210   3rd Qu.:0.010575  
 Max.   :0.08250   Max.   :0.100400   Max.   :0.070900   Max.   :0.039000   Max.   :0.035200   Max.   :0.04470   Max.   :0.039400  
      V57               V58                V59                V60           Class  
 Min.   :0.00030   Min.   :0.000300   Min.   :0.000100   Min.   :0.000600   M:111  
 1st Qu.:0.00370   1st Qu.:0.003600   1st Qu.:0.003675   1st Qu.:0.003100   R: 97  
 Median :0.00595   Median :0.005800   Median :0.006400   Median :0.005300          
 Mean   :0.00782   Mean   :0.007949   Mean   :0.007941   Mean   :0.006507          
 3rd Qu.:0.01043   3rd Qu.:0.010350   3rd Qu.:0.010325   3rd Qu.:0.008525          
 Max.   :0.03550   Max.   :0.044000   Max.   :0.036400   Max.   :0.043900  

Setelah data dimuat, kita perlu membagi data menjadi data latih dan data uji. Data latih digunakan dalam proses pelatihan model serta mencari model terbaik, sementara data uji digunakan untuk mengevaluasi kemampuan model dalam memprediksi data baru yang belum pernah dilihat sebelumnya.

Untuk membagian data dapat menggunakan beberapa cara, salah satunya menggunakan fungsi createDataPartition dari package caret. Data yang akan digunakan sebagai data latih sebanyak 80 persen dan sisanya menjadi data uji.

R

# Membagi data latih dan data uji
set.seed(123)
indeks_latih <- createDataPartition(Sonar$Class, p = 0.8, list = FALSE)
data_latih <- Sonar[indeks_latih, ]
data_uji <- Sonar[-indeks_latih, ]

Model Dasar

Model pertama yang kita buat akan menggunakan fungsi train dan validasi menggunakan fungsi trainControl dengan metode "repeatedcv" (cross validation) dengan 10 fold dan 3 kali ulangan. Pada model pertama ini kita hanya akan menentukan parameter mtry (jumlah variabel yang digunakan pada setiap proses splitting) sebesar sqrt(n_var). Adapun evaluasi model akan menggunakan nilai accuracy.

R

control <- trainControl(method="repeatedcv", number=10, repeats = 3)

n_var = ncol(data_latih) -1

mtry <- sqrt(n_var)   # jumlah fitur untuk splitting node

param_grid <- expand.grid(.mtry = mtry)

rf_base <- train(Class~., data=data_latih, method="rf", metric="Accuracy", tuneGrid=param_grid, trControl=control)

print(rf_base)

Output

# OUTPUT

Random Forest 

167 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 150, 150, 150, 151, 150, 150, ... 
Resampling results:

  Accuracy   Kappa    
  0.8159559  0.6253915

Tuning parameter 'mtry' was held constant at a value of 7.745967

Hasil yang diperoleh menunjukkan model ini memiliki akurasi sebesar 0.8159559. Nilai ini merupakan nilai rata-rata akurasi berdasarkan hasil repeated k-fold cv sebanyak 10 fold dengan 3 kali ulangan.

Model kedua yang akan dibuat adalah dengan mengatur parameter mtry melalui random search. Tahapan yang terjadi pada proses ini adalah pada proses pelatihan akan diambil sebanyak beberapa nilai acak untuk dijadikan parameter mtry. Banyaknya nilai acak ditentukan berdasarkan parameter tuneLength. Pada contoh ini kita menentukan nilai tuneLength=5.

R

# Random Search
set.seed(1000)
control <- trainControl(method="repeatedcv", number=10, repeats=3, search="random")

mtry <- sqrt(ncol(data_latih)-1)

rf_random <- train(Class~., data=data_latih, method="rf", metric="Accuracy", tuneLength=5, trControl=control)

print(rf_random)
plot(rf_random)

Output

# OUTPUT

Random Forest 

167 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 150, 150, 150, 151, 150, 150, ... 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
  22    0.7997631  0.5928894
  24    0.8060294  0.6050191
  29    0.8039297  0.6011269
  43    0.8017239  0.5968251
  51    0.7859150  0.5639590

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 24.
Tuning Hyperparameter Random Forest R

Pada model ini jumlah mtry yang dicobakan sebanyak 5 nilai yaitu 22, 24, 29, 43, 51. Berdasarkan kelima nilai mtry ini, diperoleh model dengan rata-rata nilai akurasi tertinggi pada data latih adalah mtry=24 yaitu sebesar 0.8060294. Hasil ini tidak sebaik sebelumnya, hal ini mungkin disebabkan karena kebetulan nilai mtry yang digunakan semuanya cukup besar, tidak ada nilai mtry kecil yang dicobakan dalam proses tuning hyperparameter-nya.

Model ketiga akan dibangun menggunakan teknik grid search, teknik ini mirip dengan teknik random search hanya saja nilai mtry kita tentukan sendiri misalkan pada contoh ini sebanyak 5 nilai yaitu 1, 3, 5, 10 dan 15.

R

set.seed(1000)
control <- trainControl(method="repeatedcv", number=10, repeats=3, search="grid")
tunegrid <- expand.grid(.mtry=c(1,3,5,10,15))
rf_grid <- train(Class~., data=data_latih, method="rf", metric="Accuracy", tuneGrid=tunegrid, trControl=control)

print(rf_grid)
plot(rf_grid)

Output

# OUTPUT

Random Forest 

167 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 150, 150, 150, 151, 150, 150, ... 
Resampling results across tuning parameters:

  mtry  Accuracy   Kappa    
   1    0.8175327  0.6281846
   3    0.8137500  0.6204645
   5    0.8305556  0.6559527
  10    0.8159559  0.6253692
  15    0.8081127  0.6089697

Accuracy was used to select the optimal model using the largest value.
The final value used for the model was mtry = 5.

Dari output di atas diperoleh model dengan nilai mtry=5 memiliki rata-rata nilai Akurasi terbaik yaitu sebesar 0.8305556. Model ini juga memiliki nilai Akurasi yang lebih baik dibandingkan dua model sebelumnya.

Tuning Hyperparameter (Manual)

Tiga model yang sudah kita buat sebelumnya, hanya mengevaluasi model dengan mengatur nilai mtry saja, sementara parameter lainnya kita biarkan dengan nilai defaultnya. Fungsi randomForest sebenarnya memiliki beberapa parameter lain yang dapat kita atur untuk mencari model yang optimal. Beberapa diantaranya yaitu:

  • ntree : menunjukkan jumlah pohon yang ditumbuhkan dalam proses pelatihan model
  • nodesize : menentukan jumlah pengamatan minimum yang harus ada di setiap node terminal agar pemisahan lebih lanjut dilakukan saat membangun pohon
  • maxnodes: jumlah maksimum node terminal yang dapat dimiliki oleh setiap pohon.

Pada kode di bawah ini, kita membuat fungsi secara manual untuk melakukan tuning hiperparameter dengan teknik grid search. Pada fungsi ini kita dapat melakukan pencarian tidak hanya untuk parameter mtry tetapi juga ntree, nodesize dan maxnodes.

R

# Membuat fungsi untuk menangani pelatihan model dengan berbagai nilai parameter

rf_tune <- function(data, ntree, nodesize, maxnodes, tunegrid, control, seed=100) {
  modellist <- list()
  
  param_grid = expand.grid(ntree, nodesize, maxdepth)
  names = c("ntree", "nodesize", "maxnodes")
  param_grid <- setNames(param_grid, names)
  
  for (i in 1:nrow(param_grid)){
    nt = param_grid[i, "ntree"]
    ns = param_grid[i, "nodesize"]
    mn = param_grid[i, "maxnodes"]
    
    set.seed(seed)
    
    fit <- train(Class~., data=data, method="rf", metric="Accuracy", 
                          tuneGrid=tunegrid, trControl=control, 
                          ntree=nt, nodesize=ns, maxnodes=mn)
    
    key <- toString(length(modellist)+1)      
    modellist[[key]] <- fit
  }
  return (modellist)
}


# Contoh penerapan

# Manual Grid Search
control <- trainControl(method="repeatedcv", number=10, repeats=3, search="grid", allowParallel = T)
  
tunegrid <- expand.grid(.mtry=c(3,5,7,10))
ntree_list <- c(100, 200, 500)
nodesize_list <- 1:5
maxnodes_list <- c(10,20,30,40)
  
all_model <- rf_tune(data_latih, ntree_list, nodesize_list, maxnodes_list, tunegrid, control, seed = 1000)

# compare results
results <- resamples(all_model)
summary(results)
dotplot(results)

Output

Call:
summary.resamples(object = results)

Models: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 53, 54, 55, 56, 57, 58, 59, 60 
Number of resamples: 30 

Accuracy 
        Min.   1st Qu.    Median      Mean   3rd Qu. Max. NA's
1  0.6250000 0.8125000 0.8235294 0.8296814 0.8823529    1    0
2  0.6470588 0.7647059 0.8235294 0.8364379 0.8823529    1    0
3  0.6470588 0.7647059 0.8235294 0.8284722 0.8823529    1    0
4  0.6250000 0.7647059 0.8235294 0.8196324 0.8823529    1    0
5  0.6250000 0.7647059 0.8235294 0.8114052 0.8805147    1    0
6  0.6470588 0.7766544 0.8235294 0.8300654 0.8823529    1    0
7  0.6000000 0.7647059 0.8235294 0.8153105 0.8729167    1    0
8  0.6470588 0.7647059 0.8235294 0.8296650 0.8823529    1    0
9  0.6470588 0.7766544 0.8235294 0.8298039 0.8823529    1    0
10 0.5882353 0.7647059 0.8235294 0.8241830 0.8823529    1    0
11 0.6470588 0.7647059 0.8235294 0.8203840 0.8823529    1    0
12 0.6470588 0.7647059 0.8235294 0.8220833 0.8729167    1    0
13 0.5882353 0.7647059 0.8235294 0.8159559 0.8823529    1    0
14 0.6875000 0.7647059 0.8235294 0.8279820 0.8823529    1    0
15 0.5882353 0.7647059 0.8235294 0.8141340 0.8750000    1    0
16 0.6250000 0.8125000 0.8235294 0.8296814 0.8823529    1    0
17 0.6470588 0.7647059 0.8235294 0.8364379 0.8823529    1    0
18 0.6470588 0.7647059 0.8235294 0.8284722 0.8823529    1    0
19 0.6250000 0.7647059 0.8235294 0.8196324 0.8823529    1    0
20 0.6250000 0.7647059 0.8235294 0.8114052 0.8805147    1    0
21 0.6470588 0.7766544 0.8235294 0.8300654 0.8823529    1    0
22 0.6000000 0.7647059 0.8235294 0.8153105 0.8729167    1    0
23 0.6470588 0.7647059 0.8235294 0.8296650 0.8823529    1    0
24 0.6470588 0.7766544 0.8235294 0.8298039 0.8823529    1    0
25 0.5882353 0.7647059 0.8235294 0.8241830 0.8823529    1    0
26 0.6470588 0.7647059 0.8235294 0.8203840 0.8823529    1    0
27 0.6470588 0.7647059 0.8235294 0.8220833 0.8729167    1    0
28 0.5882353 0.7647059 0.8235294 0.8159559 0.8823529    1    0
29 0.6875000 0.7647059 0.8235294 0.8279820 0.8823529    1    0
30 0.5882353 0.7647059 0.8235294 0.8141340 0.8750000    1    0
31 0.6250000 0.8125000 0.8235294 0.8296814 0.8823529    1    0
32 0.6470588 0.7647059 0.8235294 0.8364379 0.8823529    1    0
33 0.6470588 0.7647059 0.8235294 0.8284722 0.8823529    1    0
34 0.6250000 0.7647059 0.8235294 0.8196324 0.8823529    1    0
35 0.6250000 0.7647059 0.8235294 0.8114052 0.8805147    1    0
36 0.6470588 0.7766544 0.8235294 0.8300654 0.8823529    1    0
37 0.6000000 0.7647059 0.8235294 0.8153105 0.8729167    1    0
38 0.6470588 0.7647059 0.8235294 0.8296650 0.8823529    1    0
39 0.6470588 0.7766544 0.8235294 0.8298039 0.8823529    1    0
40 0.5882353 0.7647059 0.8235294 0.8241830 0.8823529    1    0
41 0.6470588 0.7647059 0.8235294 0.8203840 0.8823529    1    0
42 0.6470588 0.7647059 0.8235294 0.8220833 0.8729167    1    0
43 0.5882353 0.7647059 0.8235294 0.8159559 0.8823529    1    0
44 0.6875000 0.7647059 0.8235294 0.8279820 0.8823529    1    0
45 0.5882353 0.7647059 0.8235294 0.8141340 0.8750000    1    0
46 0.6250000 0.8125000 0.8235294 0.8296814 0.8823529    1    0
47 0.6470588 0.7647059 0.8235294 0.8364379 0.8823529    1    0
48 0.6470588 0.7647059 0.8235294 0.8284722 0.8823529    1    0
49 0.6250000 0.7647059 0.8235294 0.8196324 0.8823529    1    0
50 0.6250000 0.7647059 0.8235294 0.8114052 0.8805147    1    0
51 0.6470588 0.7766544 0.8235294 0.8300654 0.8823529    1    0
52 0.6000000 0.7647059 0.8235294 0.8153105 0.8729167    1    0
53 0.6470588 0.7647059 0.8235294 0.8296650 0.8823529    1    0
54 0.6470588 0.7766544 0.8235294 0.8298039 0.8823529    1    0
55 0.5882353 0.7647059 0.8235294 0.8241830 0.8823529    1    0
56 0.6470588 0.7647059 0.8235294 0.8203840 0.8823529    1    0
57 0.6470588 0.7647059 0.8235294 0.8220833 0.8729167    1    0
58 0.5882353 0.7647059 0.8235294 0.8159559 0.8823529    1    0
59 0.6875000 0.7647059 0.8235294 0.8279820 0.8823529    1    0
60 0.5882353 0.7647059 0.8235294 0.8141340 0.8750000    1    0

R

all_model[["47"]]$finalModel["param"]

Output

# OUTPUT

$ntree
[1] 200

$nodesize
[1] 1

$maxnodes
[1] 40

Dari hasil iterasi berbagai kombinasi nilai parameter di atas, diperoleh model dengan rata-rata akurasi tertinggi yaitu model 47. Model ini memiliki pengaturan mtry=3, ntree=200, nodesize=1 dan maxnodes=40.

Evaluasi Model

Langkah selanjutnya yaitu melakukan evaluasi model yang telah dibangun menggunakan data uji. Data uji yang digunakan merupakan data yang sama sekali belum pernah dilihat oleh model, sehingga prediksi yang dihasilkan dapat mencerminkan dengan baik kemampuan model yang sesungguhnya.

R

pred_base <- predict(rf_base, data_uji)
pred_rs <- predict(rf_random, data_uji)
pred_gs <-predict(rf_grid, data_uji)
pred_man <- predict(all_model["47"], data_uji)

confusionMatrix(pred_base, reference = data_uji$Class)
print("============================================")
confusionMatrix(pred_rs, reference = data_uji$Class)
print("============================================")
confusionMatrix(pred_gs, reference = data_uji$Class)
print("============================================")
confusionMatrix(pred_man$"47", reference = data_uji$Class)

Output

# OUTPUT

Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 19  0
         R  3 19
                                          
               Accuracy : 0.9268          
                 95% CI : (0.8008, 0.9846)
    No Information Rate : 0.5366          
    P-Value [Acc > NIR] : 6.182e-08       
                                          
                  Kappa : 0.8544          
                                          
 Mcnemar's Test P-Value : 0.2482          
                                          
            Sensitivity : 0.8636          
            Specificity : 1.0000          
         Pos Pred Value : 1.0000          
         Neg Pred Value : 0.8636          
             Prevalence : 0.5366          
         Detection Rate : 0.4634          
   Detection Prevalence : 0.4634          
      Balanced Accuracy : 0.9318          
                                          
       'Positive' Class : M    

============================================           
                                          
Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 18  1
         R  4 18
                                         
               Accuracy : 0.878          
                 95% CI : (0.738, 0.9592)
    No Information Rate : 0.5366         
    P-Value [Acc > NIR] : 3.487e-06      
                                         
                  Kappa : 0.7574         
                                         
 Mcnemar's Test P-Value : 0.3711         
                                         
            Sensitivity : 0.8182         
            Specificity : 0.9474         
         Pos Pred Value : 0.9474         
         Neg Pred Value : 0.8182         
             Prevalence : 0.5366         
         Detection Rate : 0.4390         
   Detection Prevalence : 0.4634         
      Balanced Accuracy : 0.8828         
                                         
       'Positive' Class : M    

============================================          
                                         
Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 20  0
         R  2 19
                                         
               Accuracy : 0.9512         
                 95% CI : (0.8347, 0.994)
    No Information Rate : 0.5366         
    P-Value [Acc > NIR] : 5.331e-09      
                                         
                  Kappa : 0.9026         
                                         
 Mcnemar's Test P-Value : 0.4795         
                                         
            Sensitivity : 0.9091         
            Specificity : 1.0000         
         Pos Pred Value : 1.0000         
         Neg Pred Value : 0.9048         
             Prevalence : 0.5366         
         Detection Rate : 0.4878         
   Detection Prevalence : 0.4878         
      Balanced Accuracy : 0.9545         
                                         
       'Positive' Class : M     

============================================         
                                         
Confusion Matrix and Statistics

          Reference
Prediction  M  R
         M 21  0
         R  1 19
                                          
               Accuracy : 0.9756          
                 95% CI : (0.8714, 0.9994)
    No Information Rate : 0.5366          
    P-Value [Acc > NIR] : 2.995e-10       
                                          
                  Kappa : 0.9511          
                                          
 Mcnemar's Test P-Value : 1               
                                          
            Sensitivity : 0.9545          
            Specificity : 1.0000          
         Pos Pred Value : 1.0000          
         Neg Pred Value : 0.9500          
             Prevalence : 0.5366          
         Detection Rate : 0.5122          
   Detection Prevalence : 0.5122          
      Balanced Accuracy : 0.9773          
                                          
       'Positive' Class : M   

Dari output di atas dapat dilihat bahwa model terakhir yaitu model terbaik hasil tuning secara manual memiliki nilai akurasi paling tinggi yaitu sebesar 0.9756, dimana model hanya salah memprediksi 1 amatan yang seharusnya masuk kelas M namun diprediksi sebagai kelas R, Adapun model lainnya memiliki nilai akurasi yang bervariasi yaitu 0.9268, 0.878 dan 0.9512. Nilai-nilai yang diperoleh pada masing-masing model pada contoh ini kebetulan sangat tinggi bahkan jauh lebih tinggi dibandingkan rata-rata hasil evaluasi pada data latih.

Bonus : doParallel

Proses tuning hyperparameter pada model randomforest memerlukan waktu yang cukup lama khususnya ketika data semakin banyak dan parameter yang dituning juga lebih bervariasi. Secara default kompiler R hanya menggunakan 1 core CPU saja dalam mengeksekusi kode. Kita dapat menggunakan jumlah core yang lebih banyak dengan menggunakan fitur pada package doParallel. Kita juga perlu memastikan parameter allowParallel pada fungsi trainControl bernilai TRUE.

R

library(doParallel)


start_time_paralel <- system.time({
  # Menggunakan 3 inti CPU
  cl <- makeCluster(3)  
  
  # Mengaktifkan cluster
  registerDoParallel(cl)
  
  # Manual Search
  control <- trainControl(method="repeatedcv", number=10, repeats=3, search="grid", allowParallel = T)
  
  tunegrid <- expand.grid(.mtry=c(3,5,7,10))
  ntree_list <- c(100, 200, 500)
  nodesize_list <- 1:5
  maxnodes_list <- c(10,20,30,40)
  
  all_model <- rf_tune(data_latih, ntree_list, nodesize_list, maxnodes_list, tunegrid, control, seed = 1000)
  

# Menghentikan cluster
stopCluster(cl)
})[["elapsed"]]


print(paste("Waktu eksekusi multicore:", start_time_paralel, "detik"))

# =================================================================#

# Eksekusi kode yang sama tanpa paralel
start_time_normal <- system.time({
  # Manual Search
  control <- trainControl(method="repeatedcv", number=10, repeats=3, search="grid")
  
  tunegrid <- expand.grid(.mtry=c(3,5,7,10))
  ntree_list <- c(100, 200, 500)
  nodesize_list <- 1:5
  maxnodes_list <- c(10,20,30,40)
  
  all_model <- rf_tune(data_latih, ntree_list, nodesize_list, maxnodes_list, tunegrid, control, seed = 1000)
  
})[["elapsed"]]


print(paste("Waktu eksekusi normal:", start_time_normal, "detik"))

Output

# OUTPUT

[1] "Waktu eksekusi multicore: 310.849999999999 detik"
[1] "Waktu eksekusi normal: 381.800000000003 detik"

Dari hasil tersebut terdapat perbedaan waktu eksekusi yang signifikan antara penggunaan doParallel dan tidak. Hasil ini tentu sangat tergantung juga dengan berbagai faktor, baik hardware dan sofware. Namun pada lingkungan pemrosesan yang sama, penggunaan lebih banyak core tentu akan memberikan waktu yang lebih cepat.

Perlu menjadi catatan, jika melakukan proses secara paralel, akan menghasilkan model yang berbeda bahkan ketika menggunakan nilai set.seed yang sama. Jika ingin benar-benar mereproduksi output yang sama persis, maka kita perlu menetapkan parameter seeds pada fungsi trainControl (misalkan sebanyak 10 x 3 + 1= 31 nilai seed) . Jumlah ini yaitu jumlah number dikali nilai repeats pada repeatedcv (lihat trainControl Docs).

Tulisan Lainnya

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi