1.はじめに
mlrは2019年からメンテナンスモードになっている。
著者らは変わりにmlr3を推奨している。
mlr3については、あまり日本語による情報はないようなので、紹介してみます。
mlrとの最大の違いはmlr3は完全なオブジェクト指向になったことである。
mlr3はmlrをエコシステム、R6やdata.tableに対応した統合的なパッケージにリライトされた。
※R6とは完全にオブジェクト指向に対応するためにプログラミング言語のひとつ
CRANで’R6'パッケージで提供されている
僕的には、だんだんpythonに近づいているような気がします..
2.データとタスクの構築
チュートリアルを見ながら、データとタスクの構築をしていきます。
(必ずしもチュートリアルのとおりではないです)
data("mtcars", package = "datasets")
data = mtcars[, 1:3]
str(data)
$>'data.frame': 32 obs. of 3 variables:
$> $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$> $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$> $ disp: num 160 160 108 258 360 ...
タスククラスを構築する場合、回帰の場合はTaskRegr\$new、分類の場合は、
TaskClassif\$newのメソッドを使います。
TaskRegr,TaskClassif\$new(backend, target)
backend := data.table(目的変数も含んだデータ全体)
target := y-column(データに含まれる目的変数) 分類の場合はfactorにする
実際にmtcarsデータでタスクを作成します。
library("mlr3")
task_mtcars = TaskRegr$new(id = "cars", backend = data, target = "mpg")
task_mtcars$print()
$> <TaskRegr:cars> (32 x 3)
$> * Target: mpg
$> * Properties: -
$> * Features (2):
$> - dbl (2): cyl, disp
TaskRegrのnewメソッドで、TaskRegrクラスのインスタンスを作成しています。
このように回帰タスクのインスタンスを作成することができます。
printメソッドでタスクの内容が表示されます。
内容:目的変数と特徴量(説明変数)
タスクの中に格納されたデータはdata()メソッドで呼び出すことができます。
()の中はrowsを指定。何も指定しないと全rowsが表示されます。
先頭10行までを指定します。
task_mtcars$data(1:10)
$>mpg cyl disp
$><dbl> <dbl> <dbl>
$>21.0 6 160.0
$>21.0 6 160.0
$>22.8 4 108.0
$>21.4 6 258.0
$>18.7 8 360.0
$>18.1 6 225.0
$>14.3 8 360.0
$>24.4 4 146.7
$>22.8 4 140.8
$>19.2 6 167.6
$>1-10 of 10 rows
selectメソッドを使えば列を選択できます。目的変数は維持されます。
task_mtcars$select('cyl')
task_mtcars$data()
$>mpg cyl
$><dbl> <dbl>
$>21.0 6
$>21.0 6
$>22.8 4
$>21.4 6
$>18.7 8
$>18.1 6
$>14.3 8
$>24.4 4
$>22.8 4
$>19.2 6
次にパッケージ'mlr3viz'を利用してデータの相関関係を見てみます。
'GGally'パッケージが別途必要です。
library("mlr3viz")
autoplot(task_mtcars, type = "pairs")
目的変数(mpg:馬力)には(disp:排気量)と(cyl:シリンダー数)との間に高い相関関係があることが一目でわかります。
また、mlr_tasksにR6オブジェクトで10個のデータセットが用意されています。
試しにこの中のpimaのデータセットを選んでみます
task= mlr_tasks$get("pima")
task$print()
$><TaskClassif:pima> (768 x 9)
$>* Target: diabetes
$>* Properties: twoclass
$>* Features (8):
$> - dbl (8): age, glucose, insulin, mass, pedigree, pregnant,
$> pressure, triceps
デフォルトのautoplotは目的変数になります。
# default plot: class frequencies
autoplot(task)
説明変数を上から3個だけ選んで、ペアーズプロットで相関関係を見ます。
# subset task to only use the 3 first features
task$select(head(task$feature_names, 3))
# pairs plot (requires package GGally)
autoplot(task, type = "pairs")
3.学習器の構築
パッケージ'mlr3learners'を使います。
まず使える学習器一覧を表示します。
library("mlr3learners")
mlr_learners
$><DictionaryLearner> with 28 stored values
$>Keys: classif.cv_glmnet, classif.debug, classif.featureless,
$> classif.glmnet, classif.kknn, classif.lda, classif.log_reg,
$> classif.multinom, classif.naive_bayes, classif.qda, classif.ranger,
$> classif.rpart, classif.svm, classif.xgboost, regr.cv_glmnet,
$> regr.featureless, regr.glmnet, regr.kknn, regr.km, regr.lm,
$> regr.ranger, regr.rpart, regr.svm, regr.xgboost, surv.cv_glmnet,
$> surv.glmnet, surv.ranger, surv.xgboost
28種類が使用可能です。caretに比べると少ないみたいですが、これだけでも使いきれません!
学習器には、次の情報を持っています。
feature_types: 学習器が取り扱える説明変数のタイプ
packages: 学習器が必要とするパッケージ
properties: さらに追加のプロパティや機能を表示します。
例えば、欠落した値を扱うことができる場合は "missings"、というプロパティを持ち、特徴量の相対的な重要度を計算して抽出することができる場合は " importance"というプロパティを持ちます。
predict_types: 可能な予測タイプを示します。
例えば、分類の結果("response")や分類の確率("prob")を予測することができます。
詳しくは下記の参考を参照してください。
learner = mlr_learners$get("classif.rpart")
learner$print()
$><LearnerClassifRpart:classif.rpart>
$>* Model: -
$>* Parameters: xval=0
$>* Packages: rpart
$>* Predict Type: response
$>* Feature types: logical, integer, numeric, factor, ordered
$>* Properties: importance, missings, multiclass, selected_features,
$> twoclass, weights
param_setのメソッドを使えば、ハイパーパラメータの種類と取りうる範囲を示せます。
learner$param_set
ハイパーパラメータはparam_set の中のvaluesを指定することで内容を変更できます。(リスト形式です)
learner$param_set$values = list(cp = 0.01, xval = 0)
learner
$>LearnerClassifRpart:classif.rpart>
$>* Model: -
$>* Parameters: cp=0.01, xval=0
$>* Packages: rpart
$>* Predict Type: response
$>* Feature types: logical, integer, numeric, factor, ordered
$>* Properties: importance, missings, multiclass, selected_features,
$> twoclass, weights
注意!上記で指定すると、指定した以外のパラメータは全てデフォルトに戻ります。
さらに上書きをしたい場合は次のようにします。
learner$param_set$values = mlr3misc::insert_named(
learner$param_set$values,
list(cp = 0.02, minsplit = 2)
)
learner
$><LearnerClassifRpart:classif.rpart>
$>* Model: -
$>* Parameters: cp=0.02, xval=0, minsplit=2
$>* Packages: rpart
$>* Predict Type: response
$>* Feature types: logical, integer, numeric, factor, ordered
$>* Properties: importance, missings, multiclass, selected_features,
$> twoclass, weights
lrnを使えば、学習器とパラメータの指定ができます。
learner = lrn("classif.rpart", id = "rp", cp = 0.001,minsplit = 2)
learner
$><LearnerClassifRpart:rp>
$>* Model: -
$>* Parameters: xval=0, cp=0.001, minsplit=2
$>* Packages: rpart
$>* Predict Type: response
$>* Feature types: logical, integer, numeric, factor, ordered
$>* Properties: importance, missings, multiclass, selected_features,
$> twoclass, weights