0. 本記事の説明

サンプルデータを使用して、missRangerとmissForestの実行速度を比較します。
予測精度も別途検討予定です。


1. データの準備

# ライブラリのロード
pacman::p_load(tidyverse, 
               microbenchmark, 
               missForest, 
               doParallel, 
               missRanger)
# シードの固定
# 念のためmissRangerは関数内でも同値を指定
set.seed(1234)
# irisデータを使用
data(iris)

# missRanger::generateNAで、欠測率20%で欠測データを作成
dat_NA <- generateNA(iris, p = 0.2)
# missForestは並列化処理をするもの・しないものを比較してみる

# PCのコア数
cores <- detectCores(logical = FALSE)

# makeCluster
# 変数の数(ncol)で並列化
cl <- makeCluster(ncol(dat_NA))

# registerDoParallel
# 一度行うと、stopClusterを行わずに再度実行するとエラーメッセージが表示されます
registerDoParallel(cl, cores = cores)


2. 実行

microbenchmark::microbenchmarkで実行速度を比較してみます。
1. missForest(並列化処理なし)
2. missForest(並列化処理あり)
3. missRanger(予測平均マッチング使用なし)
4. missRanger(予測平均マッチング使用あり)

irisは小さなデータなので、実行速度に差をつけるためにツリー数1000と多めにします。

benchmark <- microbenchmark(
  F_no_para = {
    missForest(dat_NA, 
               maxiter = 10, 
               ntree = 1000, 
               parallelize = "no", 
               verbose = FALSE)
  }, 
  
  F_with_para = {
    missForest(dat_NA, 
               maxiter = 10, 
               ntree = 1000, 
               parallelize = "variables", 
               verbose = FALSE)
  }, 
  
  R_no_pmm = {
    missRanger(dat_NA, 
               formula = . ~ ., 
               maxiter = 10, 
               pmm.k = 0, 
               seed = 1234, 
               verbose = 0, 
               data_only = FALSE, 
               num.trees = 1000)
  },
  
  R_with_pmm = {
    missRanger(dat_NA, 
               formula = . ~ ., 
               maxiter = 10, 
               pmm.k = 3, 
               seed = 1234, 
               verbose = 0, 
               data_only = FALSE, 
               num.trees = 1000)
  },
  
  times = 10, 
  unit = "seconds")


10回同じ処理を行って、まとめた結果が出力されます。

benchmark
## Unit: seconds
##         expr       min        lq      mean    median        uq      max neval
##    F_no_para 3.4831896 4.5956002 6.2233896 5.6801274 7.4383856 9.635140    10
##  F_with_para 1.6341656 1.8019442 2.1062398 1.9506440 2.2510957 2.909438    10
##     R_no_pmm 0.4349722 0.4494977 0.5386005 0.4526548 0.4700255 1.286477    10
##   R_with_pmm 1.0768854 1.0814529 1.1044492 1.0892036 1.1346534 1.165986    10
##  cld
##  a  
##   b 
##    c
##   bc


図示。autoplotなので単位はbenchmarkが選んだミリ秒になっています。

figure <- autoplot(benchmark)
figure


pmmを使用するか否かでの実行速度の違いは、データの内容にも依りそうです。
missRangerはやいですね。rangerパッケージは特に大規模データで真価を発揮するようです。
サンプル数が数十万以上のデータだと、数時間vs数日くらい、missForestに比べてmissRangerは早くなる様子です。


おわり。