$30 off During Our Annual Pro Sale. View Details »

Rで機械学習の実践ガイド #0.5/Practical Guide For Machine Learning with R #0.5

Rで機械学習の実践ガイド #0.5/Practical Guide For Machine Learning with R #0.5

ハイパーリンク等があるためなるべくpdfをダウンロードしてご覧ください
https://tokyor.connpass.com/event/176318/

S-Katagiri

May 23, 2020
Tweet

More Decks by S-Katagiri

Other Decks in Programming

Transcript

  1. R で機械学習の実践ガイド
    #0.5 機械学習プラットフォーム
    ill-identified
    May 23, 2020
    1

    View Slide

  2. 目次
    前置き
    機械学習プラットフォーム論
    mlr パッケージ
    tidymodels パッケージ
    2

    View Slide

  3. 前置き

    View Slide

  4. [AD] 勤務先の求人
    • https://n.fancs.tech/recruitment/
    • 機械学習/機械学習をプロダクトに組み込む仕事に取り組
    みたい人
    • (職場ではあまり R を使っていない)
    3

    View Slide

  5. 自己紹介
    • 業界 3 年目の新米機械学習エンジニアです
    • @ill_identified, 個人ブログ
    • 主語の大きな話が好き
    •『計量経済学と機械学習の関係』(Tokyo.R #80)
    •『経済学と反事実分析』(Tokyo.R #83)
    • R の発表で R の話をしてないのになぜか出禁にならない
    •『計量経済学と機械学習の関係』(Tokyo.R #80)
    •『経済学と反事実分析』(Tokyo.R #83)
    4

    View Slide

  6. この発表を聞いてわかること
    • 今回こそ R の話をする
    • 発表者は煩雑な手作業が嫌い
    • R の 2 大潮流は tidymodels/mlr(mlr3)
    5

    View Slide

  7. 発端
    • 結構前の何気ないつぶやき
    • R の機械学習/モデリングパッケージの機能比較をしよう
    6

    View Slide

  8. 機械学習プラットフォーム論

    View Slide

  9. 機械学習の良いパッケージとは何か
    • 便利で実用的なパッケージがいいに決まっている
    • じゃあ便利ってどういうこと
    • じゃあ実用的ってどういうこと
    7

    View Slide

  10. 「データ分析」はどういう流れでやるべきか
    •「データ分析のデザインパターン」は昔からあるテーマ [1]
    • KDD, SEMMA, CRISP-DM など
    • それぞれ違う表現で同じことを言ってるように思える…
    •「何度も試行錯誤する」というコンセンサスができている?
    • PDCA とか OODA みたいな
    図 1: 異口同音のポンチ絵 (左から順に [6, 16])
    • でも具体的に何をやればいいの? 8

    View Slide

  11. まず機械学習を勉強しよう
    • 理論/実践のバランスが良い大本命 [9] とタイトル詐欺 [17]
    • チュートリアル的な構成かつ R を使ったもの
    • 無料のものも多い [16](邦訳有料)[7](カンパ方式) など
    • だれか [4, 11, 14] の翻訳出して
    • Python 向けの本もある [8]
    • 限定的なトピックの良書は他にも多数あり
    9

    View Slide

  12. 何が足りないか
    • カステラ本 [9] の弱点
    • ちょっと古い
    • 既存ライブラリの使い方とかは書いてない
    • ちょっと難しすぎる?
    • 翻訳版が高い (が買う価値はある) (個人の感想です)
    • [17] の弱点
    • 初心者向けと見せかけて大リーグ養成ギブス的な何か
    • アルゴリズムの詳しい説明が中心
    • 無料系 [7, 4, 11, 14] の弱点
    • 初歩的な話だけ/予測モデルの話がなかったり
    • アルゴリズムの紹介だけで終わっていたり
    • 書きかけだったり
    10

    View Slide

  13. さらなる疑問

    「実用的」って何?

    どこまで深く理論を理解したらいい?
    11

    View Slide

  14. 3 度となるとさすがに学習する
    あっ!
    これ抽象化しすぎて
    が出てこなくなるパターンだ!

    View Slide

  15. 今回扱う範囲と扱わない範囲
    • 用途を絞って機械学習プラットフォームを考える
    • 予測モデルとしての機械学習のモデルのあてはめ
    • データ分析データサイエンス人工知能の一部分
    • 以下は範囲外
    •『三国志で学ぶデータ分析』
    • 予測モデルを作る話ではない
    • システムアーキテクチャ, ハードウェア
    • 重要 [10] だが R から外れてしまう
    • 機械学習の理論 - なぜやるのか/やってはいけないか
    • ⻑くなりすぎるので次回
    • (複数回に分けて後でまとめてどっかで公開する予定)
    13

    View Slide

  16. (再掲)「データ分析」はどういう流れでやるべきか
    •「データ分析のデザインパターン」は昔からあるテーマ [1]
    • KDD, SEMMA, CRISP-DM など
    • それぞれ違う表現で同じことを言ってるように思える…
    •「何度も試行錯誤する」というコンセンサスができている?
    • PDCA とか OODA みたいな
    図 2: 異口同音のポンチ絵 (左から順に [6, 16])
    • また主語の大きい話しやがって
    14

    View Slide

  17. プラットフォームを求める理由
    線形回帰/一般化線形回帰 (GLM)
    data(iris)
    lm(Sepal.Length ~ ., data = df)
    glm(Species ~ ., data = df, family=gaussian())
    L1/L2 正則化
    require(glmnet)
    equation <- Sepal.Length ~ .
    y <- model.response(equation, iris)
    X <- model.matrix(equation, iris)
    glmnet(X, y, ...)
    XGBoost
    15

    View Slide

  18. バラバラの構文を覚えられない
    • モデル/アルゴリズムによって構文が全く違う
    • この辺はマシな部類
    • 入力 (データフレーム) 出力 (予測値) の形式は同じなのに
    • 何度も作り直すこと前提の機械学習でこれはめんどくさい
    • 過去の提案『glmnet を glm みたいに使う』
    • 忘れてください, もっといいものがあります
    16

    View Slide

  19. どんなプラットフォームがいいのか
    • caret, mlr, scikit-learn 開発者の API デザイン論 [12, 15, 5]
    • いずれも不揃いなインターフェースを問題視
    • Scikit-learn の場合:
    • インターフェースの「一貫性」
    「部品化」などが重要
    •「前処理」
    「学習」等のブロックを組み合わせたフローで表現
    INPUT モデル
    標準化 OUTPUT
    INPUT 特徴量選択 モデル
    前処理1
    前処理2
    OUTPUT
    • 参考: 『Python でのデータ分析作業をスマートにするために』
    17

    View Slide

  20. 主なパッケージ
    • caret
    • mlr(mlr3)
    • tidymodels
    • 汎用的な「プラットフォーム」と呼べるのはこの 3 つ
    • パッケージというよりプロジェクト?
    • これ以外は機能が限定的
    18

    View Slide

  21. mlr パッケージ

    View Slide

  22. caret と mlr
    • mlr のデザインを気に入ったので今回は mlr を解説
    • ただし互いに設計思想似ている
    • インターフェースのみの提供
    • 画一的な構文で lm(), glmnet(), xgboost() を呼び出し可
    • mlr は 160 種類のアルゴリズムをサポート
    • 自分で新たに定義することも可
    • 使う時に参考になる:
    • mlr の公式ドキュメントと nozma 氏によるダイジェスト
    •『モデルを跨いでデータを見たい』(Tokyo.R #76) でも言及
    • caret の公式ドキュメント
    19

    View Slide

  23. mlr の特徴
    • 機械学習の作業フローを以下 5 種類の役割に厳密に分類
    • caret はここまで徹底していない
    • オプションの豊富さも mlr が上回る [2]
    1. task : どのデータや変数を使うか
    2. learner: どのモデルやアルゴリズムを使うか
    • mlr ではモデルの定義を learner, 学習結果を model と呼ぶ
    3. resampler : 訓練‧検証データをどう分けるか
    • e.g., ホールドアウトか交差検証か
    4. tuner: ハイパーパラメータの調整
    5. performence: モデルをどう評価するか
    20

    View Slide

  24. mlr の最も単純な使用例
    data("BostonHousing", package="mlbench")
    task <- makeRegrTask(
    data = BostonHousing, target = "medv")
    learner1 <- makeLearner(
    "regr.glmnet", alpha = 1)
    model1 <- train(learner1, task)
    prediction <- predict(model1, task)
    performance(prediction)
    1. 回帰タスク定義
    2. glmnet(L2) を定義
    3. 学習
    4. 予測結果出力
    5. 当てはまり確認
    (デフォルトは
    MSE)
    mse
    21.90246
    21

    View Slide

  25. 少し複雑な例: 前処理のラッピング
    • mlrCPO パッケージを使う例
    • 特徴量の標準化
    • 目的変数の対数変換 (対数線形モデル)
    • %>% ではなく %>>% であることに注意
    learner2 <- cpoScale(center=T, scale=T) %>>%
    cpoLogTrafoRegr() %>>%
    makeLearner("regr.glmnet", alpha = 0)
    model2 <- train(learner2, task)
    performance(predict(model2, task))
    22

    View Slide

  26. より複雑な例: resampler と tuner
    • tuner と resampler を挿入
    • 正則化パラメータを自動調整したい
    • k-fold 交差検証とランダムサーチで探索
    num_ps <- makeParamSet(
    makeNumericParam("lambda", lower = 0, upper = .3))
    ctrl <- makeTuneControlRandom(maxit = 10)
    rdesc <- makeResampleDesc("CV", iters = 3)
    tuner <- tuneParams(learner, task = task,
    resampling = rdesc,
    par.set = num_ps, control = ctrl)
    learner2 <- makeLearner("regr.glmnet", alpha = 1,
    par.vals = tuner$x)
    23

    View Slide

  27. さらに複雑な例: 複数モデルの比較
    • これまでの各モデルの性能を比較
    • 学習器ごとに異なる id が必要
    learner1 <- setLearnerId(learner1, "m1")
    learner2 <- setLearnerId(learner2, "m2")
    learner3 <- setLearnerId(learner3, "m3")
    comparison <- benchmark(
    list(learner1, learner2, learner3), task)
    print(comparison)
    24

    View Slide

  28. その他の機能
    • 学習曲線や分類平面の視覚化機能あり
    • パラメータをベイズ最適化で決めたい
    • mlrMBOパッケージが有効 [3]
    • mlr 組み込みと上記を統合したmlrHyperoptも
    • 前処理の機能がショボい
    • mlrCPOパッケージで改善
    • 学習曲線や残差診断のグラフ作成機能も充実
    • nozma 氏の資料で大まかに分かるはず
    • 便利でしょ?
    • 使いたくなりましたよね?
    25

    View Slide

  29. と見せかけて今回は mlr
    使わない

    View Slide

  30. mlr3 に注目せよ!
    • mlr は 2019 年からメンテナンスモードに移行
    • 最近の技術と相性が悪い箇所を改良 [13]
    • data.table など外部パッケージとの連携
    • パイプライン機能の拡張
    • よりオブジェクト指向な構文に
    mlr3
    mlr3
    mlr3verse
    tasks, learners, train-test-eval,
    resample, benchmark
    Visualization
    Data Formats
    Utilities
    ML Tasks
    ML Pipelines
    Learners
    Feature Selection
    Tuning
    mlr3
    Popular learners, ranger,
    xgboost, glmnet, svm, ...
    learners
    Many more learners,
    organized as
    Github extension packages
    github.com/mlr3learners
    mlr3
    Connecting Keras to mlr3
    keras
    mlr3
    Feature Filtering
    filters
    mlr3
    Wrapper Feature Selection
    fswrap
    mlr3
    Hyperparameter Tuning
    tuning
    mlr3
    Hyperparameter Tuning
    hyperband
    Bayesian Optimization
    mbo
    Parameter Sets
    paradox
    Time-Series &
    Functional Data
    time
    Probabilistic Learning &
    Survival Analysis
    proba
    Spatial learners &
    resampling
    spatiotemporal
    Time-series forecasting &
    resampling
    forecast
    Clustering
    cluster
    Learning with
    Ordinal Targets
    ordinal
    Performance Measures
    measures
    Devel Helper Functions
    misc
    DBs as Data Backends
    db mlr3
    Visualization
    viz
    Preprocessing,
    pipelines & ensembles
    pipelines
    mlr3
    Stable
    Maturing
    Experimental
    Planned
    mlr3
    mlr3
    mlr3
    mlr3
    mlr3
    mlr3
    mlr3
    mlr3
    mlr3
    図 3: tidyverse めいたパッケージ群 ([13] より) 27

    View Slide

  31. mlr3 の簡単な使用例
    • さっきの mlr と同じことを mlr3 でやる
    • 一旦 R を再起動 (mlr と競合?)
    • mlr と違い学習器の定義は個別に読み込む
    • とりあえず mlr3learners でよく使うやつを読み込む
    • learner <- lrn("regr.glmnet", alpha = 1) でも良い
    require(mlr3)
    require(mlr3learners)
    data("BostonHousing", package="mlbench")
    task <- TaskRegr$new(
    id = "t1", backend = BostonHousing, target = "medv")
    learner <- mlr_learners$get("regr.glmnet")
    learner$param_set$values <- list(alpha = 1)
    learner$train(task)
    28

    View Slide

  32. エラーの原因
    エラー: has the following unsupported
    feature types: factor
    > p r i n t ( task )
    (506 x 14)
    * Target : medv
    * Properties : −
    * Features ( 1 3 ) :
    − dbl ( 1 2 ) : age , b , crim , dis , indus , l s t a t , nox ,
    − f c t ( 1 ) : chas
    • よく見ると factor 型変数が入っている
    • 暗黙の型変換をしなくなった
    29

    View Slide

  33. mlr3pipelines パッケージ
    • mlr3 のパイプライン処理担当
    • グラフィカルモデルを意識して作成可
    • グラフィカルモデルを表示可
    • しかしグラフがかっこよくない
    • 1 ページにまとめたチートシートがある
    30

    View Slide

  34. mlr3pipelines の書き方
    • 前処理の定義
    • po(): mlr3pipelines で定義された変換器の呼び出し
    • 部品の接続
    • %>>%/$add_pipeop(): 直列つなぎ
    • gunion(): 並列つなぎ
    • 定義した学習器のグラフ表示
    • $plot()
    learner <- po("scale") %>>%
    po("encode") %>>%
    lrn("regr.glmnet", alpha = 1)
    learner$train(task)
    pred <- learner$predict(task)
    pred$regr.glmnet.output$score()
    31

    View Slide

  35. 使える機能一覧
    • as.data.table(mlr_learnes)
    • 使える学習器一覧表示
    • mlr_pipeops, mlr_tuners, mlr_measures でも同様
    • メソッドのヘルプは $help() で呼び出す
    32

    View Slide

  36. mlr と比べた mlr3 の所感
    • より適用範囲を広げている
    • オブジェクト指向な構文を徹底
    • オブジェクト指向といいつつ日和ってない?
    • パッケージ細かく分けすぎ?
    • mlr3learner: 学習器の定義
    • mlr3pipelines: パイプライン
    • paradox / mlr3tuning: パラメータ調整
    • mlr3viz: グラフ作成
    • 面倒くさいなら mlr3verse でまとめて読み込み
    • 一部まだ開発中
    • 教師なし学習
    • 生存時間分析
    • 時系列データ向けの機能
    33

    View Slide

  37. tidymodels パッケージ

    View Slide

  38. tidymodels とは
    • 一連のプロジェクト
    • 広義の tidyverse?
    • 役に立つ資料: 全貌をまとめた日本語の資料はない
    •『tidymodels によるモデル構築と運用』
    • 俯瞰するなら一番良い
    • 個別の解説はdropou009 氏のブログも参考なりそう
    • コアパッケージはだいたい mlr の task, learner,
    resampler, tuner, performance に対応
    図 4: mlr に対応するパッケージ群
    34

    View Slide

  39. mlr3 vs tidymodels
    mlr3(mlr) tidyomodels (+ verse)
    ⻑所 役割分担が厳格 前処理が柔軟
    サポート学習器豊富 (mlr) tidyverse の延⻑で書ける (個
    別の部品だけ使うことも可)
    開発が活発
    短所 前処理の自由度低い サブプロジェクト多すぎ
    情報が少ない %>% 使いすぎ (個人の感想で
    す)
    モデル名を覚えづらい 対応してる機械学習モデル少
    • mlr3 は機械学習特化 (当てはまりの良いモデル追求)
    • tidymodels は多種多様な分析を想定?
    35

    View Slide

  40. #0.5 機械学習プラットフォームでわかったこと
    • caret: 今は古くなっている
    • mlr: ドキュメントもある程度充実して使いやすい
    • mlr3: 面白いがまだ開発途上
    • tidymodels: 人気の tidyverse と同じノリで書ける
    •「徹底比較」するには時間が足りなかった
    • やっぱり風呂敷広げすぎ畳めてないじゃん
    次の #2 で分かること, それはまだ混沌の中……
    それが…機械学習…!
    36

    View Slide

  41. 参考文献

    View Slide

  42. [1] Azevedo, Ana and Manuel Filipe dos Santos (2008) “KDD, SEMMA
    and CRISP-DM: A Parallel Overview,” in IADIS European Conf. Data
    Mining.
    [2] Bischl, Bernd, Michel Lang, Lars Kotthoff, Julia Schiffner, Jakob
    Richter, Erich Studerus, Giuseppe Casalicchio, and Zachary M. Jones
    (2016) “Mlr: Machine Learning in R,” Journal of Machine Learning
    Research, Vol. 17, No. 170, pp. 1–5, retrieved from here.
    [3] Bischl, Bernd, Jakob Richter, Jakob Bossek, Daniel Horn, Janek
    Thomas, and Michel Lang (2018) “mlrMBO: A Modular Framework for
    Model-Based Optimization of Expensive Black-Box Functions,”
    December, arXiv: 1703.03373.
    [4] Boehmke, Brad and Brandon M. Greenwell (2019) Hands-on Machine
    Learning with R, Chapman & Hall/CRC the R Series, Boca Raton: CRC
    Press, retrieved from here.
    [5] Buitinck, Lars, Gilles Louppe, Mathieu Blondel, Fabian Pedregosa,
    Andreas Mueller, Olivier Grisel, Vlad Niculae, Peter Prettenhofer,
    Alexandre Gramfort, Jaques Grobler, Robert Layton, Jake VanderPlas,
    Arnaud Joly, Brian Holt, and Gaël Varoquaux (2013) “API Design for
    36

    View Slide

  43. Machine Learning Software: Experiences from the Scikit-Learn
    Project,” in ECML PKDD Workshop: Languages for Data Mining and
    Machine Learning, pp. 108–122.
    [6] Chapman, Peter, Janet Clinton, Randy Kerber, Tom Khabaza, Thomas
    Reinartz, C. Russell H. Shearer, and Robert Wirth (2000) “CRISP-DM
    1.0: Step-by-Step Data Mining Guide.”
    [7] Chatzidimitriou, Kyriakos, Themistoklis Diamantopoulos, Papamichail
    Michail, and Andreas Symeonidis (2018) “Practical Machine Learning
    in R,” June, retrieved from here.
    [8] Géron, Aurélien (2017) Hands-on Machine Learning with Scikit-Learn
    and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent
    Systems, (下田倫大‧⻑尾高弘訳,
    『scikit-learn と TensorFlow による
    実践機械学習』
    ,オライリー‧ジャパン,2018 年).
    [9] Hastie, Trevor, Robert Tibshriani, and Jerome Friedman (2009) The
    Elements of Statistical Learning: Data Mining, Inference, and
    Prediction: Springer, 2nd edition, retrieved from here, (杉山将‧井出
    剛‧神嶌敏弘‧栗田多喜夫‧前田英作‧井尻善久‧岩田具治‧金森敬
    文‧兼村厚範‧鳥山昌幸‧河原吉伸‧木村昭悟‧小⻄嘉典‧酒井智弥‧
    36

    View Slide

  44. 鈴木大慈‧竹内一郎‧玉木徹‧出口大輔‧冨岡亮太‧波部⻫‧前田新
    一‧持橋大地‧山田誠訳,
    『統計的学習の基礎 —データマイニング‧推
    論‧予測—』
    ,共立出版,2014 年).
    [10] Hazelwood, Kim, Sarah Bird, David Brooks, Soumith Chintala, Utku
    Diril, Dmytro Dzhulgakov, Mohamed Fawzy, Bill Jia, Yangqing Jia,
    Aditya Kalro, James Law, Kevin Lee, Jason Lu, Pieter Noordhuis,
    Misha Smelyanskiy, Liang Xiong, and Xiaodong Wang (2018) “Applied
    Machine Learning at Facebook: A Datacenter Infrastructure
    Perspective,” in 2018 IEEE International Symposium on High
    Performance Computer Architecture (HPCA), Vol. 2018-Febru, pp.
    620–629, Vienna: IEEE, February, DOI: 10.1109/HPCA.2018.00059.
    [11] Irizarry, Rafael A. (2019) Introduction to Data Science: Data Analysis
    and Prediction Algorithms with R, Boca Raton: CRC Press, retrieved
    from here.
    [12] Kuhn, Max (2008) “Building Predictive Models in R Using the Caret
    Package,” Journal of Statistical Software, Vol. 28, No. 5, DOI:
    10.18637/jss.v028.i05.
    [13] mlr-Org. Team (2019) “Ml3 Manual,” retrieved from here.
    36

    View Slide

  45. [14] Sarafian, Ron (2019) “Introduction to Data Science,” June, retrieved
    from here.
    [15] Schiffner, Julia, Bernd Bischl, Michel Lang, Jakob Richter, Zachary M.
    Jones, Philipp Probst, Florian Pfisterer, Mason Gallo, Dominik
    Kirchhoff, Tobias Kühn, Janek Thomas, and Lars Kotthoff (2016) “Mlr
    Tutorial,” September, arXiv: 1609.06146.
    [16] Wickham, Hadley and Garrett Grolemund (2016) R for Data Science:
    Import, Tidy, Transform, Visualize, and Model Data, Sebastopol, CA:
    O’Reilly, first edition edition, retrieved from here, (黒川利明‧大橋真也
    訳,
    『R で始めるデータサイエンス』
    ,オライリー‧ジャパン,2017 年)
    .
    [17] 杉山将 (2013) 『イラストで学ぶ機械学習: 最小二乗法による識別モデ
    ル学習を中心に』
    ,講談社,東京, retrieved from here.
    36

    View Slide