サンプルデータを使用して、missRangerとmissForestの実行速度を比較します。
予測精度も別途検討予定です。
# ライブラリのロード
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)
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は早くなる様子です。
おわり。