tidymodelsでモデリング 事始め

Kuro

はじめに

自己紹介

  • @Kuroとか くろきち とか
    • アカウント名の由来はむかーしのっていたカワサキの900ccの赤とKAZE(カワサキライダーズクラブ)とをくっつけた。
  • 電通国際情報サービスというSIerでAI関係の仕事しています。
  • 主にPMと教育事業担当
  • 仕事ではほぼプログラム書きません。
  • Rに最初にさわったのは大学の頃だから、、、、、20年以上まえですかね? ≠ R歴
  • Osaka.Rで朝から黙々してます。

本日のセッションで説明すること

  • 機械学習界隈におけるモデリングってなんぞや?
  • R でどうやるのがナウい?(死語)

モデリングとは?

広義(ウィキペディア)

科学的モデリング(かがくてきモデリング、英: Scientific > modelling)とは、ある事象の抽象化されたコンセプトモデル・グラフィカルモデル・あるいは数理モデルを作るプロセスである。

機械学習領域(私見)

(過去に)定義された数式(アルゴリズム)に実データをあてはめ、現象にあわせた数理モデルをつくるための試行錯誤を含む行為および そのモデルの確からしさを確認する行為。

ざっくりあわらわすと

以下のような行為をゴールにむけて何度も行うこと

参考 : データ分析のワークフロー

Wickham and Grolemund(2016) より作成

モデリング内でタスク(検討することは)たくさんある

モデリングで実施するタスク(例)

  1. モデルの選択
    • 複数モデル適用と評価
      ランダムフォレスト Lasso ニューラルネットワーク
    • タスク設定
      回帰でやるのか? 分類でいくのか?
    • ハイパーパラメータチューニング(初期設定値みたいなもの)
  2. 評価の決定
    • 複数指標の検討
      RMSEが良いのか?RMSLEがよいのか?
    • 汎用性能検討
      過学習していないか?
    • 過去のモデルと比較の比較
    • サンプリング方法
      クロスバリデーションする?

モデリング内でタスク(検討することは)たくさんある

モデリングで実施するタスク(例)

  1. データの処置
    • 特徴量エンジニアリング
    • 欠損値対応等
      欠損は削除する?補完する?

等々

tidymodels

モデリングにかかわる各種のタスクを統一的にできるよう各種のパッケージを包含しつかいやすくしたもの。

まずこれいれておけば、大体解決できると思えば良い。 1

─── tidymodels 1.0.0 ──
✔ broom        1.0.4     ✔ recipes      1.0.5
✔ dials        1.1.0     ✔ rsample      1.1.1
✔ dplyr        1.1.1     ✔ tibble       3.2.1
✔ ggplot2      3.4.1     ✔ tidyr        1.3.0
✔ infer        1.0.4     ✔ tune         1.0.1
✔ modeldata    1.1.0     ✔ workflows    1.1.3
✔ parsnip      1.0.4     ✔ workflowsets 1.0.0
✔ purrr        1.0.1     ✔ yardstick    1.1.0
✔ broom        1.0.4     ✔ recipes      1.0.5
✔ dials        1.1.0     ✔ rsample      1.1.1
✔ dplyr        1.1.1     ✔ tibble       3.2.1
✔ ggplot2      3.4.1     ✔ tidyr        1.3.0
✔ infer        1.0.4     ✔ tune         1.0.1
✔ modeldata    1.1.0     ✔ workflows    1.1.3
✔ parsnip      1.0.4     ✔ workflowsets 1.0.0
✔ purrr        1.0.1     ✔ yardstick    1.1.0

タスクと包含パッケージとの関係例

タスク パッケージ
サンプリング rsample
前処理 dplyr purrr tidyr
パラメータサーチ tune dials
モデルの性能評価 yardstick
可視化 ggplot2

今日覚えてもらうこと

tydymodelsをつかって以下の3つについてちょっとわかってもらいます。

  1. モデリングまでの一連の流れ(コードベース)
  2. サンプリング
  3. モデル適用
  4. 評価

モデリングまでの一連の流れ(コードベース)

> # ライブラリの読み込み
> library(tidyverse)
> library(tidymodels)
> # アルゴリスムこれだけはインストールされないので別途install_packageする。
> library(ranger)
> 
> # データの読み込み
> # CSVから読みこむときは下記
> # data <- readr::read_csv("path/to/aaaa.csv")
> # 今回は[iris]を利用
> iris_df <- iris %>% as_tibble()
> 
> # データの前処理
> iris_df <- iris_df %>%
+   mutate(Species = as.factor(Species))
> 
> # データの分割
> set.seed(123)
> split <- initial_split(iris_df, prop = 0.7)
> train_data <- training(split)
> test_data <- testing(split)
> 
> # モデルの定義
> rf_spec <- rand_forest(mtry = 3, trees = 500) %>%
+   set_mode("classification") %>%
+   set_engine("ranger")
> 
> # モデルの学習
> rf_fit <- rf_spec %>%
+   fit(Species ~ ., data = train_data)
> 
> # モデルの評価
> pred_metrics <-
+   rf_fit %>%
+     predict(test_data) %>%
+     bind_cols(test_data) %>%
+     metrics(truth = Species, estimate = .pred_class)

サンプリング : resample パッケージ

手持ちのデータを学習データ(train)と評価データ(test)に分割します。

なぜ?

モデルの性能を評価するため。
学習に利用したデータ=既知(モデルが知っている)なので、モデルの評価に利用するとカンニングになる。
このカンニングのことを、リーケージとよぶ。
評価の為に新しくデータを用意できればよいが現実的ではないので、今あるデータを2つに分割して既知(学習データ)と未知(評価データ)として便宜あつかいます。

サンプリング : resample パッケージ

> library(rsample)
> library(tidyverse)
> 
> # as_tibbleはなくてもよい。
> iris_df <- iris %>% as_tibble()
> 
> # 学習:評価=7:3で分割するよという宣言
> df_split <- initial_split(iris_df, prop=0.7)
> 
> # 学習データ抽出
> df_train <- training(df_split)
> 
> #評価データ抽出
> df_test <- testing(df_split)
> 
> paste(nrow(iris_df),nrow(df_train),nrow(df_test),sep=" - ")
[1] "150 - 105 - 45"

モデル適用 : persnipパッケージ

機械学習タスクや利用するアルゴリズムやハイパーパラメータなどを設定し、実際にデータを当てはめ(学習)る。

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

モデル適用 : persnipパッケージ

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

利用できるモデルを知るには?

どんなアルゴリズムに対応しているかは下記をチェック
Explore tidymodels - Search parsnip models

モデル適用 : persnipパッケージ

# モデルの定義
rf_spec <- 
  rand_forest(mtry = 3, trees = 500) %>%
  set_mode("classification") %>%
  set_engine("ranger")

# モデルの学習
rf_fit <- rf_spec %>%
  fit(Species ~ ., data = train_data)

# あえて説明変数を絞りたい場合は`+`でつなぐとよい。
#rf_fit <- rf_spec %>%
#  fit(Species ~ Sepal.Length+Sepal.Width, data = train_data)

formula

目的変数 ~(チルダ) .(ドット)でつないているところがformulaです。
.(ドット)は目的変数以外の全てをあらわします。
説明変数を明示的に示す場合は+でつなぐとよいです。
一部だけ利用するようなシーンは一般的ではなく、前処理で事前に落しておくのが一般的です。

評価 : yardstick

# モデルの評価
pred_metrics <-
  rf_fit %>%
    predict(test_data) %>%
    bind_cols(test_data) %>%
    metrics(truth = Species, estimate = .pred_class)

未知データ(評価データ)にあてはめて、あてはまり度合いを測る。

教師あり学習においては評価は答えあわせです。
predictでモデルくんの回答を作り、bind_colsで問題と答えとセットにする。
metricsで採点。採点基準はaccuracy(正解率)やMSE(平均二乗誤差)など、タスクと得たい結果にあわせて選択する必要がある。
どんな評価指標があるかはこちらを参照のこと。

評価 : yardstick

また、

評価指標入門
に網羅的に評価指標について書かれておりおすすめです。
R界隈の先輩方に感謝!!

最後にネタバラしもふくめて

本セッションで活用したコードは、ChatGPTさんに聞いて作ったものになります。
ググるのも良いのですが、コード界隈はChatGPTさんが素晴しいです。
まずコードを読み、わからないところを調べる方が効率的でもありますので是非活用してみてください!!

以下がプロンプト例になります。

機械学習モデルの学習スクリプトの例を示してください。

以下の要件を満してください
- 言語: R言語 
- ライブラリ: tidyverse tidymodel,ranger
- アルゴリズム: randomforest
- データセット名: ああああ 
  - 目的変数: 目的変数
  - 説明変数: t1,t2,t3,t4,t5,ma1,ma2
- タスク: 回帰
- データ分割: 7:3
- 交差検証: false

EOF
Thank you!!

おまけ

こまったときのNEXTアクション

  1. HELP(Rstudio : F1キー)
    まずここから
  2. viggnet
    サンプルコードなどが使い方とともにのっている。
  3. rwakalangに質問
    日本のR最大のコミュニティーなので活用しない手はない
  4. F2ボタン
    関数が宣言されているソースを確認できる。
    ハードに感じるかもしれないがどうやって動いているか知ると理解が進む事がある。
    他者のコードは最高の参考資料です。
  5. ChatGPT
    次世代の相棒

参考文献 等々

脚注

  1. アルゴリズムについては数が多いので別にインストールは必要