★データ解析備忘録★

ゆる〜い技術メモ

lantern パッケージの紹介

はじめに

この記事は R Advent Calendar 2020 22日目の記事です。

今年は色々ありまして、まさかの1年ぶりの記事更新です。

lantern パッケージは、平たく言えば tidymodelstorchモデリングを提供するものです。 この一文で意味が分かる方は少し飛ばして次節の「インストール」以降をお読みください。 github.com

10月末頃に、Pythonに依存しないディープラーニングライブラリとして torch パッケージがリリースされました。 Rでディープラーニングの学習や生成モデルをつくるパッケージは RStudio から kerastensorflowなどが提供されていましたが、これらはPythonの同名ライブラリのメソッドを reticulate パッケージを通して呼び出すという仕様のため、環境構築の際に一手間かかっていました。

一方、tidymodelstidyverseの流儀に倣って、「統一したフレームワークで」「直感的に」モデリングする環境を提供するパッケージです。もともとRは統計解析のために開発された言語ということがあって、様々な統計モデリングの手法が様々なパッケージで提供されてきましたが、「引数の順番や入力データの形式がパッケージによって異なるため、様々な分析を同時に実行するのが面倒」という欠点がありました。tidymodels パッケージはこのような欠点を補う一助になります。

tidymodelsの基本的な使い方は、dropout009さんの記事などが参考になります。

ただし、現状tidymodelsでは有名なモデリング手法しかオフィシャルには提供されておらず、必ずしも自分がやりたいモデルがあるとは限りません。 足りないモデルがあれば、他のパッケージによるtidymodels用のインターフェース提供を期待するか、自分で用意しなければなりません。このああたりは、atusyさんによる14日目の記事が詳しいです。

lantern パッケージは、この「tidymodels用のインターフェース提供」をしてくれるパッケージです。ただし、開発がtidymodelsになっているので、将来的にオフィシャルに組み込まれる可能性はあるかもしれません。。。

また、本記事執筆時点(2020-12-21)で lantern パッケージのライフサイクルは「experimental」つまりまだ実験的な立ち位置のパッケージになりますので、以下で書くことは今後変わる可能性がありますので、ご注意ください。

以下、tidymodelsの基本的な使い方(レシピの組み方など)と、ディープラーニングの基本的なこと(エポックとか隠れ層とか)がある程度分かっている前提のお話になります。

インストール

CRANにはまだ来ていないので、 GitHubからインストールします

remotes::install_github("tidymodels/lantern")

このとき、torch パッケージがインストールされていない場合は一緒にインストールされます。

また、以下で使うデータのために、 modeldata というパッケージもインストールしておきます。

install.packages("modeldata")

あと、もし tidymodels のインストールがまだの人がいたらここでインストールしておきます

install.packages("tidymodels")

試してみる

GitHubに出ている例をなぞってみます。

データセットの準備

# 2値分類のためのデータセットがロードされる
data(bivariate, package = "modeldata")

前処理レシピの作成

ここでは、元データに対して Yeo-Johnson変換 1と正規化を行っています。

recopes::all_predictors は、tidyverseで言うところの dplyr::everything()のようなもので、「すべての特徴量に対して」同じ前処理を行うことを意味しています。

rec <- recipes::recipe(Class ~ ., data = bivariate_train) %>%  
  recipes::step_YeoJohnson(recipes::all_predictors()) %>% 
  recipes::step_normalize(recipes::all_predictors())

学習する

普通のtidymodelsの運用ではここで recipes::prep(前処理の適用) → parsnip::手法の関数 (rand_forestなど) → parsnip::set_engine()parsnip::fit() (学習) → predict() (予測)、という順番で学習・評価をを行っていくのですが、 lantern パッケージは torchディープラーニング専用の関数を提供するパッケージなので、predict() 直前までは一つの関数内でやれちゃいます。つまり学習関数に前処理レシピを直接入れる形になります。

nn_rec_biv <- lantern::lantern_mlp(rec, data = bivariate_train, 
                                   epochs = 150, hidden_units = 3, batch_size = 64)

エポック数や隠れ層ディープラーニングの設定項目は、 lantern::lantern_mlp 内の引数で設定できます。

他に設定できる項目は

  • activation: 活性化関数の種類 。"relu", "elu", "tanh", and "linear" から選択。デフォルトは "relu"のランプ関数
  • penalty: 正則化のペナルティの量。デフォルトは0
  • dropout: Dropout率2。デフォルトは0
  • lean_rate: 学習率。デフォルトは0.01
  • momentum: 勾配降下のモーメントパラメータ。デフォルトは0.0

です。また、verbose = TRUE を設定すると学習の様子がコンソールに出力されます。

https://github.com/tidymodels/lantern/blob/fd46c2efd24d97f3709620a75894c9087cd26a5d/R/lantern_mlp-fit.R#L270

予測する

今回のタスクは2値分類だったので、それぞれのクラスに所属される確率で予測をします。

# 予測して正解をくっつける
pred_nn_biv <- predict(nn_rec_biv, bivariate_test, type = "prob") %>% 
  dplyr::bind_cols(bivariate_test)

# AUC
pred_nn_biv %>%
  yardstick::roc_auc(Class, .pred_One)

#> # A tibble: 1 x 3
#>   .metric .estimator .estimate
#>   <chr>   <chr>          <dbl>
#>  1 roc_auc binary         0.859

以下は lantern ではなく tidymodels の知識になりますが、Accuracy, Precision, Recallの算出とROCカーブの描画は以下のような感じです。

# 評価のメトリックをセット
multi_met <- yardstick::metric_set(yardstick::accuracy,
                                   yardstick::precision,
                                   yardstick::recall)

# Accuracy, Precision, Recall
pred_nn_biv %>%
  dplyr::mutate(pred_Class = dplyr::if_else(.pred_One > 0.5, "One", "Two")) %>%
  dplyr::mutate(pred_Class = as.factor(pred_Class)) %>%
  multi_met(truth = Class, estimate = pred_Class)

#> # A tibble: 3 x 3
#>   .metric   .estimator .estimate
#>   <chr>     <chr>          <dbl>
#> 1 accuracy  binary         0.782
#> 2 precision binary         0.839
#> 3 recall    binary         0.823

# ROCカーブ
pred_nn_biv %>%
  yardstick::roc_curve(Class, .pred_One) %>%
  lantern::autoplot() # ggplot2::autoplotがそのままexportされている

f:id:songcunyouzai:20201221221609p:plain
ROCカーブ

正直、機械学習モデルとしてはもっと頑張れよという感じですが、 lantern を動かすことが目的なのでハイパーパラメータのチューニングは本記事ではやりません。

まとめ

本記事では、lantern パッケージを使って tidymodels の中で torch で組まれたディープラーニングモデルを動かす手法について紹介しました。

R Advent Calendar、明日はhkzmさんの「ALTREPについて」です。


  1. データの分布が正規分布っぽくなっていない場合、対数変換やBox-Cox変換で正規分布に近づける、といった手法を取ることがありますが、これらの手法は0や負値をうまく扱えません。Yeo-Johnson変換はこのような数値に対して役立つ場合があります。参考

  2. Dropoutの参考資料

lantern パッケージの紹介

はじめに

この記事は R Advent Calendar 2020 22日目の記事です。

今年は色々ありまして、まさかの1年ぶりの記事更新です。

lantern パッケージは、平たく言えば tidymodelstorchモデリングを提供するものです。 この一文で意味が分かる方は少し飛ばして次節の「インストール」以降をお読みください。 github.com

10月末頃に、Pythonに依存しないディープラーニングライブラリとして torch パッケージがリリースされました。 Rでディープラーニングの学習や生成モデルをつくるパッケージは RStudio から kerastensorflowなどが提供されていましたが、これらはPythonの同名ライブラリのメソッドを reticulate パッケージを通して呼び出すという仕様のため、環境構築の際に一手間かかっていました。

一方、tidymodelstidyverseの流儀に倣って、「統一したフレームワークで」「直感的に」モデリングする環境を提供するパッケージです。もともとRは統計解析のために開発された言語ということがあって、様々な統計モデリングの手法が様々なパッケージで提供されてきましたが、「引数の順番や入力データの形式がパッケージによって異なるため、様々な分析を同時に実行するのが面倒」という欠点がありました。tidymodels パッケージはこのような欠点を補う一助になります。

tidymodelsの基本的な使い方は、dropout009さんの記事などが参考になります。

ただし、現状tidymodelsでは有名なモデリング手法しかオフィシャルには提供されておらず、必ずしも自分がやりたいモデルがあるとは限りません。 足りないモデルがあれば、他のパッケージによるtidymodels用のインターフェース提供を期待するか、自分で用意しなければなりません。このああたりは、atusyさんによる14日目の記事が詳しいです。

lantern パッケージは、この「tidymodels用のインターフェース提供」をしてくれるパッケージです。ただし、開発がtidymodelsになっているので、将来的にオフィシャルに組み込まれる可能性はあるかもしれません。。。

また、本記事執筆時点(2020-12-21)で lantern パッケージのライフサイクルは「experimental」つまりまだ実験的な立ち位置のパッケージになりますので、以下で書くことは今後変わる可能性がありますので、ご注意ください。

以下、tidymodelsの基本的な使い方(レシピの組み方など)と、ディープラーニングの基本的なこと(エポックとか隠れ層とか)がある程度分かっている前提のお話になります。

インストール

CRANにはまだ来ていないので、 GitHubからインストールします

remotes::install_github("tidymodels/lantern")

このとき、torch パッケージがインストールされていない場合は一緒にインストールされます。

また、以下で使うデータのために、 modeldata というパッケージもインストールしておきます。

install.packages("modeldata")

あと、もし tidymodels のインストールがまだの人がいたらここでインストールしておきます

install.packages("tidymodels")

試してみる

GitHubに出ている例をなぞってみます。

データセットの準備

# 2値分類のためのデータセットがロードされる
data(bivariate, package = "modeldata")

前処理レシピの作成

ここでは、元データに対して Yeo-Johnson変換 1と正規化を行っています。

recopes::all_predictors は、tidyverseで言うところの dplyr::everything()のようなもので、「すべての特徴量に対して」同じ前処理を行うことを意味しています。

rec <- recipes::recipe(Class ~ ., data = bivariate_train) %>%  
  recipes::step_YeoJohnson(recipes::all_predictors()) %>% 
  recipes::step_normalize(recipes::all_predictors())

学習する

普通のtidymodelsの運用ではここで recipes::prep(前処理の適用) → parsnip::手法の関数 (rand_forestなど) → parsnip::set_engine()parsnip::fit() (学習) → predict() (予測)、という順番で学習・評価をを行っていくのですが、 lantern パッケージは torchディープラーニング専用の関数を提供するパッケージなので、predict() 直前までは一つの関数内でやれちゃいます。つまり学習関数に前処理レシピを直接入れる形になります。

nn_rec_biv <- lantern::lantern_mlp(rec, data = bivariate_train, 
                                   epochs = 150, hidden_units = 3, batch_size = 64)

エポック数や隠れ層ディープラーニングの設定項目は、 lantern::lantern_mlp 内の引数で設定できます。

他に設定できる項目は

  • activation: 活性化関数の種類 。"relu", "elu", "tanh", and "linear" から選択。デフォルトは "relu"のランプ関数
  • penalty: 正則化のペナルティの量。デフォルトは0
  • dropout: Dropout率2。デフォルトは0
  • lean_rate: 学習率。デフォルトは0.01
  • momentum: 勾配降下のモーメントパラメータ。デフォルトは0.0

です。また、verbose = TRUE を設定すると学習の様子がコンソールに出力されます。

https://github.com/tidymodels/lantern/blob/fd46c2efd24d97f3709620a75894c9087cd26a5d/R/lantern_mlp-fit.R#L270

予測する

今回のタスクは2値分類だったので、それぞれのクラスに所属される確率で予測をします。

# 予測して正解をくっつける
pred_nn_biv <- predict(nn_rec_biv, bivariate_test, type = "prob") %>% 
  dplyr::bind_cols(bivariate_test)

# AUC
pred_nn_biv %>%
  yardstick::roc_auc(Class, .pred_One)

#> # A tibble: 1 x 3
#>   .metric .estimator .estimate
#>   <chr>   <chr>          <dbl>
#>  1 roc_auc binary         0.859

以下は lantern ではなく tidymodels の知識になりますが、Accuracy, Precision, Recallの算出とROCカーブの描画は以下のような感じです。

# 評価のメトリックをセット
multi_met <- yardstick::metric_set(yardstick::accuracy,
                                   yardstick::precision,
                                   yardstick::recall)

# Accuracy, Precision, Recall
pred_nn_biv %>%
  dplyr::mutate(pred_Class = dplyr::if_else(.pred_One > 0.5, "One", "Two")) %>%
  dplyr::mutate(pred_Class = as.factor(pred_Class)) %>%
  multi_met(truth = Class, estimate = pred_Class)

#> # A tibble: 3 x 3
#>   .metric   .estimator .estimate
#>   <chr>     <chr>          <dbl>
#> 1 accuracy  binary         0.782
#> 2 precision binary         0.839
#> 3 recall    binary         0.823

# ROCカーブ
pred_nn_biv %>%
  yardstick::roc_curve(Class, .pred_One) %>%
  lantern::autoplot() # ggplot2::autoplotがそのままexportされている

f:id:songcunyouzai:20201221221609p:plain
ROCカーブ

正直、機械学習モデルとしてはもっと頑張れよという感じですが、 lantern を動かすことが目的なのでハイパーパラメータのチューニングは本記事ではやりません。

まとめ

本記事では、lantern パッケージを使って tidymodels の中で torch で組まれたディープラーニングモデルを動かす手法について紹介しました。

R Advent Calendar、明日はhkzmさんの「ALTREPについて」です。


  1. データの分布が正規分布っぽくなっていない場合、対数変換やBox-Cox変換で正規分布に近づける、といった手法を取ることがありますが、これらの手法は0や負値をうまく扱えません。Yeo-Johnson変換はこのような数値に対して役立つ場合があります。参考

  2. Dropoutの参考資料

lantern パッケージの紹介

はじめに

この記事は R Advent Calendar 2020 22日目の記事です。

今年は色々ありまして、まさかの1年ぶりの記事更新です。

lantern パッケージは、平たく言えば tidymodelstorchモデリングを提供するものです。 この一文で意味が分かる方は少し飛ばして次節の「インストール」以降をお読みください。 github.com

10月末頃に、Pythonに依存しないディープラーニングライブラリとして torch パッケージがリリースされました。 Rでディープラーニングの学習や生成モデルをつくるパッケージは RStudio から kerastensorflowなどが提供されていましたが、これらはPythonの同名ライブラリのメソッドを reticulate パッケージを通して呼び出すという仕様のため、環境構築の際に一手間かかっていました。

一方、tidymodelstidyverseの流儀に倣って、「統一したフレームワークで」「直感的に」モデリングする環境を提供するパッケージです。もともとRは統計解析のために開発された言語ということがあって、様々な統計モデリングの手法が様々なパッケージで提供されてきましたが、「引数の順番や入力データの形式がパッケージによって異なるため、様々な分析を同時に実行するのが面倒」という欠点がありました。tidymodels パッケージはこのような欠点を補う一助になります。

tidymodelsの基本的な使い方は、dropout009さんの記事などが参考になります。

ただし、現状tidymodelsでは有名なモデリング手法しかオフィシャルには提供されておらず、必ずしも自分がやりたいモデルがあるとは限りません。 足りないモデルがあれば、他のパッケージによるtidymodels用のインターフェース提供を期待するか、自分で用意しなければなりません。このああたりは、atusyさんによる14日目の記事が詳しいです。

lantern パッケージは、この「tidymodels用のインターフェース提供」をしてくれるパッケージです。ただし、開発がtidymodelsになっているので、将来的にオフィシャルに組み込まれる可能性はあるかもしれません。。。

また、本記事執筆時点(2020-12-21)で lantern パッケージのライフサイクルは「experimental」つまりまだ実験的な立ち位置のパッケージになりますので、以下で書くことは今後変わる可能性がありますので、ご注意ください。

以下、tidymodelsの基本的な使い方(レシピの組み方など)と、ディープラーニングの基本的なこと(エポックとか隠れ層とか)がある程度分かっている前提のお話になります。

インストール

CRANにはまだ来ていないので、 GitHubからインストールします

remotes::install_github("tidymodels/lantern")

このとき、torch パッケージがインストールされていない場合は一緒にインストールされます。

また、以下で使うデータのために、 modeldata というパッケージもインストールしておきます。

install.packages("modeldata")

あと、もし tidymodels のインストールがまだの人がいたらここでインストールしておきます

install.packages("tidymodels")

試してみる

GitHubに出ている例をなぞってみます。

データセットの準備

# 2値分類のためのデータセットがロードされる
data(bivariate, package = "modeldata")

前処理レシピの作成

ここでは、元データに対して Yeo-Johnson変換 1と正規化を行っています。

recopes::all_predictors は、tidyverseで言うところの dplyr::everything()のようなもので、「すべての特徴量に対して」同じ前処理を行うことを意味しています。

rec <- recipes::recipe(Class ~ ., data = bivariate_train) %>%  
  recipes::step_YeoJohnson(recipes::all_predictors()) %>% 
  recipes::step_normalize(recipes::all_predictors())

学習する

普通のtidymodelsの運用ではここで recipes::prep(前処理の適用) → parsnip::手法の関数 (rand_forestなど) → parsnip::set_engine()parsnip::fit() (学習) → predict() (予測)、という順番で学習・評価をを行っていくのですが、 lantern パッケージは torchディープラーニング専用の関数を提供するパッケージなので、predict() 直前までは一つの関数内でやれちゃいます。つまり学習関数に前処理レシピを直接入れる形になります。

nn_rec_biv <- lantern::lantern_mlp(rec, data = bivariate_train, 
                                   epochs = 150, hidden_units = 3, batch_size = 64)

エポック数や隠れ層ディープラーニングの設定項目は、 lantern::lantern_mlp 内の引数で設定できます。

他に設定できる項目は

  • activation: 活性化関数の種類 。"relu", "elu", "tanh", and "linear" から選択。デフォルトは "relu"のランプ関数
  • penalty: 正則化のペナルティの量。デフォルトは0
  • dropout: Dropout率2。デフォルトは0
  • lean_rate: 学習率。デフォルトは0.01
  • momentum: 勾配降下のモーメントパラメータ。デフォルトは0.0

です。また、verbose = TRUE を設定すると学習の様子がコンソールに出力されます。

https://github.com/tidymodels/lantern/blob/fd46c2efd24d97f3709620a75894c9087cd26a5d/R/lantern_mlp-fit.R#L270

予測する

今回のタスクは2値分類だったので、それぞれのクラスに所属される確率で予測をします。

# 予測して正解をくっつける
pred_nn_biv <- predict(nn_rec_biv, bivariate_test, type = "prob") %>% 
  dplyr::bind_cols(bivariate_test)

# AUC
pred_nn_biv %>%
  yardstick::roc_auc(Class, .pred_One)

#> # A tibble: 1 x 3
#>   .metric .estimator .estimate
#>   <chr>   <chr>          <dbl>
#>  1 roc_auc binary         0.859

以下は lantern ではなく tidymodels の知識になりますが、Accuracy, Precision, Recallの算出とROCカーブの描画は以下のような感じです。

# 評価のメトリックをセット
multi_met <- yardstick::metric_set(yardstick::accuracy,
                                   yardstick::precision,
                                   yardstick::recall)

# Accuracy, Precision, Recall
pred_nn_biv %>%
  dplyr::mutate(pred_Class = dplyr::if_else(.pred_One > 0.5, "One", "Two")) %>%
  dplyr::mutate(pred_Class = as.factor(pred_Class)) %>%
  multi_met(truth = Class, estimate = pred_Class)

#> # A tibble: 3 x 3
#>   .metric   .estimator .estimate
#>   <chr>     <chr>          <dbl>
#> 1 accuracy  binary         0.782
#> 2 precision binary         0.839
#> 3 recall    binary         0.823

# ROCカーブ
pred_nn_biv %>%
  yardstick::roc_curve(Class, .pred_One) %>%
  lantern::autoplot() # ggplot2::autoplotがそのままexportされている

f:id:songcunyouzai:20201221221609p:plain
ROCカーブ

正直、機械学習モデルとしてはもっと頑張れよという感じですが、 lantern を動かすことが目的なのでハイパーパラメータのチューニングは本記事ではやりません。

まとめ

本記事では、lantern パッケージを使って tidymodels の中で torch で組まれたディープラーニングモデルを動かす手法について紹介しました。

R Advent Calendar、明日はhkzmさんの「ALTREPについて」です。


  1. データの分布が正規分布っぽくなっていない場合、対数変換やBox-Cox変換で正規分布に近づける、といった手法を取ることがありますが、これらの手法は0や負値をうまく扱えません。Yeo-Johnson変換はこのような数値に対して役立つ場合があります。参考

  2. Dropoutの参考資料

闇のExcelに対する防衛術

この記事は R Advent Calendar 2019 の25日目の記事です。

Rユーザにとっての闇、それはデータソースとして渡されるエクセルファイルでしょう(異論は認める)。

tidyverseの中にある readxl パッケージによってだいぶ楽になったとはいえ、まだまだ手元でエクセルファイルを直さないとまともに読み込めない、というのが現状でした(セル結合とかキツイですよね...)。

そんななか、そのあたりを面倒見てくれるパッケージが登場していますので、それを紹介したいと思います。本記事で紹介するのは以下のパッケージです。

この2つはペアで使うことが多いようです。

なお、tidyxl パッケージと unpivotr パッケージについては本記事の内容はほぼ全て以下のWeb Bookに詳しく書かれています。

nacnudus.github.io

本日のゴール

本日のゴールは、上記のWeb Book の9.1で紹介されている、以下のような、オーストラリアで実施された結婚についてのの調査結果が記録されたエクセルファイルのシートを tidyに(ここ重要) 読み込むこととします。

このファイルは、こちら からダウンロードできます。

  • Table 1 f:id:songcunyouzai:20191225002242p:plain

エクセルファイルの2シート目、"Table 1" シートには2つのテーブルがあります。1つは「Response Clear」 というテーブル、もう1つは「Eligible Participants」です。ぱっと見ただけでセル結合が複数あるわ、そもそもテーブルが1シートで複数あるわで、 readxl パッケージでは太刀打ちできそうにありません。しかし、このようなエクセルシートは世にあふれており、我々Rユーザがこのような闇と対峙しなければならない場面は少なくありません。

続きを読む

easystatsについて①: パッケージ群の紹介

これはR Advent Calendar2019の第1日目の記事です。

はじめに

R言語の特徴として

  • 統計解析向けの手法がたくさん実装されている
  • CRANやGitHubに誰でもパッケージを公開できる

というものがあるかと思います。他にも tidyverse パッケージ群の登場によってデータハンドリング、可視化周りが強くなったり、shiny パッケージでwebアプリが作れたりと最近は色々できるようになっていますが、上記の特徴は大きな特徴の一つと僕は思います。

さて、いろんな手法を別の人が実装した結果、各パッケージのアウトプットが異なるという問題がおこります。(手法が違えば出力が違うのはしょうがないのですが。)例えば、同じデータでいくつかの手法で試してみてその結果を比較したいとき。

model1 <- lm(Sepal.Length ~ Petal.Length, data=iris)
model2 <- rstanarm::stan_glm(Sepal.Length ~ Petal.Length, data=iris)

この例でこの比較に意味があるのかはさておき、この2つのモデルに対して回帰係数をそれぞれ見たいとき、

model1$coefficients
#>  (Intercept) Petal.Length 
#>    4.3066034    0.4089223
model2$coefficients
#>  (Intercept) Petal.Length 
#>    4.3076763    0.4085251

のように見ることもできますが、rstanarm::stan_glm() の出力のリストに coefficients という項目があることは事前知識があるか、model2の中を実際に見てみないとわかりません。

あるいは lme4 パッケージや brms パッケージでランダム効果を入れたモデルを作成したときに、そのランダム回帰係数を見たいと言われたら、 model_brms <- brmss(...) で作ったmodel_brms中を探しに行かなければなりません。

このような統計モデル系のパッケージの間を埋めてくれるのが easystats パッケージ群です。

そのあたりを解決してくれるのが easystats パッケージ群です。tidyversetidymodels のようなパッケージ「群」です。インストールをして library(easystats) を実行すれば複数のパッケージがまとめて読み込まれます。つまり tidyversedplyr パッケージや tidyr パッケージを組み合わせていたように、複数のパッケージをを組み合わせることが想定されているということです。細かいパッケージの使い方は別記事に譲るとして、本記事では library(easystats) を実行したときに読み込まれるパッケージの紹介と、「例えばこんなことができるよ」的なものを紹介できればと思います。

続きを読む