Tidymodelsでデータの前処理内容をtidyに確認する(公式手順)


昨日の投稿で、tidymodelsのrecipesパッケージによる特徴量エンジニアリングを行った歳に、

  • 中心化につかった平均値はいくつか
  • PCAの固有ベクトルはなにか

をnot tidyに確認する方法を紹介しました。

後から気付いたのですが、recipesパッケージはbroom::tidy関数を使って確認する方法を提供しています。 tidyじゃ何をtidyにするかわからんし、もうちょい良い名前をつけて欲しいですね。さておき、試してみましょう。

まずは昨日と同様に、前処理を定義し学習します。

# パイプ演算子の読み込み
`%>%` <- magrittr::`%>%`

# シード固定
set.seed(71)

# データ分割
split <- ggplot2::diamonds %>%
  dplyr::select(where(is.numeric)) %>%
  rsample::initial_split(p = .9)

# 訓練データの取り出し
tr <- rsample::training(split)

# 前処理方法を定義
rec <- recipes::recipe(tr, price ~ .) %>%
  recipes::step_center(-price, id = 'center') %>%
  recipes::step_scale(-price, id = 'scale') %>%
  recipes::step_pca(-price, id = 'pca') %>%
  recipes::step_log(price)

# 前処理方法を学習
prep <- recipes::prep(rec)

前処理の内容を確認するには、以下のように、確認したい前処理が何番目か、あるいはidが何か指定します。

broom::tidy(prep, 1)
## # A tibble: 6 x 3
##   terms  value id    
##   <chr>  <dbl> <chr> 
## 1 carat  0.799 center
## 2 depth 61.8   center
## 3 table 57.5   center
## 4 x      5.73  center
## 5 y      5.74  center
## 6 z      3.54  center
broom::tidy(prep, id = 'center')
## # A tibble: 6 x 3
##   terms  value id    
##   <chr>  <dbl> <chr> 
## 1 carat  0.799 center
## 2 depth 61.8   center
## 3 table 57.5   center
## 4 x      5.73  center
## 5 y      5.74  center
## 6 z      3.54  center

PCAの内容も勿論確認可能。ただ、ちょっと見辛いですね。

broom::tidy(prep, id = 'pca')
## # A tibble: 36 x 4
##    terms     value component id   
##    <chr>     <dbl> <chr>     <chr>
##  1 carat  0.494    PC1       pca  
##  2 depth -0.000991 PC1       pca  
##  3 table  0.121    PC1       pca  
##  4 x      0.500    PC1       pca  
##  5 y      0.494    PC1       pca  
##  6 z      0.497    PC1       pca  
##  7 carat -0.0451   PC2       pca  
##  8 depth -0.734    PC2       pca  
##  9 table  0.670    PC2       pca  
## 10 x     -0.00861  PC2       pca  
## # … with 26 more rows

なんでもかんでもtidyにすればいいってもんじゃない典型だと思います。状況に応じて自前でtidyr::pivot_wider関数に食わせるなり、生の値を取り出すなりしたいところ。

prep$steps[[3]]$res$rotation
##                 PC1          PC2          PC3         PC4          PC5
## carat  0.4944690257 -0.045142961  0.027733335 -0.69872947  0.503950252
## depth -0.0009910619 -0.734418543 -0.670622228  0.04053755  0.045526726
## table  0.1207179046  0.669542455 -0.732751827  0.01440279  0.001342399
## x      0.5000854569 -0.008609363  0.070109159 -0.06174404 -0.429135337
## y      0.4937960687 -0.009923418  0.087127512  0.70974748  0.494690171
## z      0.4969975516 -0.100656952 -0.008059259  0.04870922 -0.561323575
##                PC6
## carat  0.102492101
## depth -0.084724689
## table  0.002367648
## x     -0.746294618
## y     -0.003989857
## z      0.652180892

また、確認対象によってはtidyのS3メソッドとしてオプション引数が定義されています。たとえば recipes:::tidy.step_pca であれば、type引数でデフォルト値は"coef"、因子負荷量ですね。 type = "variance"にすると、各主成分の寄与率を確認できます。

broom::tidy(prep, id = 'pca', type = "variance")
## # A tibble: 24 x 4
##    terms                 value component id   
##    <chr>                 <dbl>     <int> <chr>
##  1 variance            3.95            1 pca  
##  2 variance            1.28            2 pca  
##  3 variance            0.683           3 pca  
##  4 variance            0.0494          4 pca  
##  5 variance            0.0264          5 pca  
##  6 variance            0.00624         6 pca  
##  7 cumulative variance 3.95            1 pca  
##  8 cumulative variance 5.23            2 pca  
##  9 cumulative variance 5.92            3 pca  
## 10 cumulative variance 5.97            4 pca  
## # … with 14 more rows

Enjoy!