2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mlr3を使ってみる(①タスク及び学習器の構築)

Last updated at Posted at 2020-09-09

1.はじめに

mlrは2019年からメンテナンスモードになっている。
著者らは変わりにmlr3を推奨している。
mlr3については、あまり日本語による情報はないようなので、紹介してみます。

mlr3verse.png

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")

a.png

目的変数(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)

b.png
説明変数を上から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")

c.png

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に比べると少ないみたいですが、これだけでも使いきれません!

下の図は学習器の役割を示しています。
learn.png

学習器には、次の情報を持っています。
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

e.png

ハイパーパラメータは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

4.参考

mlr3 book

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?