UPDATE: 2022-12-17 11:08:01

はじめに

tidymodelsパッケージの使い方をいくつかのノートに分けてまとめている。tidymodelsパッケージは、統計モデルや機械学習モデルを構築するために必要なパッケージをコレクションしているパッケージで、非常に色んなパッケージがある。ここでは、今回はparsnipというパッケージの使い方をまとめていく。モデルの数理的な側面や機械学習の用語などは、このノートでは扱わない。

下記の公式ドキュメントやtidymodelsパッケージに関する書籍を参考にしている。

parsnipパッケージの目的

parsnipパッケージは、数多あるパッケージに含まれるモデリングのための関数の構文や引数を統一されたインターフェースを提供すること。

parsnipパッケージの実行例

公式サイトにある例をお借りすると、ランダムフォレストを異なるパッケージを利用して実行する場合、下記の通り統一感がない。引数名が異なっていたり、モデル構文が異なっている可能性もあるため、複数のモデルを作成する際には、注意が必要になる。

# # From randomForest
# rf_1 <- randomForest(
#   y ~ ., 
#   data = dat, 
#   mtry = 10, 
#   ntree = 2000, 
#   importance = TRUE
# )
# 
# # From ranger
# rf_2 <- ranger(
#   y ~ ., 
#   data = dat, 
#   mtry = 10, 
#   num.trees = 2000, 
#   importance = "impurity"
# )
# 
# 
# # From sparklyr
# rf_3 <- ml_random_forest(
#   dat, 
#   intercept = FALSE, 
#   response = "y", 
#   features = names(dat)[names(dat) != "y"], 
#   col.sample.rate = 10,
#   num.trees = 2000
# )

こののランダムフォレストの例では、モデルはランダムフォレストではあるが、計算エンジンであるパッケージはrandomforestrangersparklyrと異なっており、mtry引数名についてもcol.sample.rateと異なっている。

この問題をparsnipパッケージは解決してくれる。parsnipパッケージでは、モデルのタイプ、計算エンジン、モデルのモードを選択することで、パッケージ間での違いを吸収し、スムーズに行き来できるようになっている。

下記の例では、ランダムフォレストをモデル(rand_forest)として選択し、set_engine関数でrangerパッケージを利用することを決めている。また、モデルのモード(set_mode)は回帰を指定している。

library(parsnip)

rand_forest(mtry = 10, trees = 2000) %>%
  set_engine("ranger", importance = "impurity") %>%
  set_mode("regression")
## Random Forest Model Specification (regression)
## 
## Main Arguments:
##   mtry = 10
##   trees = 2000
## 
## Engine-Specific Arguments:
##   importance = impurity
## 
## Computational engine: ranger

ランダムフォレストはそのままで、計算エンジンをsparklyrパッケージに変更したいときは、set_engine関数でsparkと指定すれば変更ができる。また、モデルのモードを回帰から分類に変更したければ、set_mode関数でclassificationを指定すれば良い。

rand_forest(mtry = 10, trees = 2000) %>%
  set_engine("spark") %>%
  set_mode("regression")
## Random Forest Model Specification (regression)
## 
## Main Arguments:
##   mtry = 10
##   trees = 2000
## 
## Computational engine: spark

この学習ルールを決定した後は、fit関数でそのままモデルを学習できたりもする。

rand_forest(mtry = 10, trees = 2000) %>%
  set_engine("randomForest") %>%
  set_mode("regression") %>%
  fit(mpg ~ ., data = mtcars)
## parsnip model object
## 
## 
## Call:
##  randomForest(x = maybe_data_frame(x), y = y, ntree = ~2000, mtry = min_cols(~10,      x)) 
##                Type of random forest: regression
##                      Number of trees: 2000
## No. of variables tried at each split: 10
## 
##           Mean of squared residuals: 5.843942
##                     % Var explained: 83.39

%>%演算子を使わない指定方法もあるので、その場合、パイプでつなげている部分をまとめて記述すればOK。

rand_forest(
  mode = "regression",
  engine = "ranger",
  mtry = 10,
  trees = 2000,
  min_n = 10
)
## Random Forest Model Specification (regression)
## 
## Main Arguments:
##   mtry = 10
##   trees = 2000
##   min_n = 10
## 
## Computational engine: ranger

モデルタイプに関する実装例は下記の公式サイトに沢山記述されているので、そちらを参照。

一般的なモデルタイプであれば、下記の通り、豊富に用意されている。

  • linear_reg() models
    • lm engine
    • glm engine
    • glmnet engine
    • keras engine
    • stan engine
  • logistic_reg() models
    • glm engine
    • glmnet engine
    • keras engine
    • LiblineaR engine
    • stan engine
  • rand_forest() models
    • ranger engine
    • randomForest engine
  • boost_tree() models
    • xgboost engine
    • C5.0 engine