こんにちは,shun(@datasciencemore)です!!
今回はtidymodelsの{recipes}についてやっていきます.
0.{recipes}ってなに??
{recipes}は,特徴量エンジニアリングに関するパッケージだよ!!
{recipes}には特徴量エンジニアリングにぴったりな関数がたくさんあるんだ!!
特徴量エンジニアリングとは,データをアルゴリズムに適した形に変形する処理のことでした.
その特徴量エンジニアリングを楽にやってくるパッケージが{recipes}です.
{recipes}は基本的に以下のように使用します.
①recipe:説明変数,目的変数,学習データを定義
②step:データをどのように変形するか定義
③prep:処理内容の決定
④bake:適用
列の選択は,直接選択する,{dplyr}のselectの中で使用できる関数(starts_withなど)に加え,{recipes}でのみ使用できる以下の便利関数が用意されています.
No. | 関数 | 用途 |
1 |
all_numeric |
数値型(integer型,double型)の列を指定 |
2 |
all_nominal |
文字列型(character型,factor型)の列を指定 |
3 |
all_numeric_predictors |
数値型(integer型,double型)で説明変数の列を指定 |
4 |
all_nominal_predictors |
文字列型(character型,factor型)で説明変数の列を指定 |
5 |
all_predictors |
説明変数の列を指定 |
6 |
all_outcomes |
目的変数の列を指定 |
例えばこんな感じ.
コーディングするとこのようになります.(※上述の図に記載のコードと多少,異なります.)
1 2 3 4 5 6 7 8 9 10 |
recipe(Status ~ ., data = train) %>% step_mutate_at( all_nominal_predictors(), fn = ~ as.integer(.) ) %>% step_impute_bag(Home, Marital, Job, Income, Assets, Debt) %>% step_normalize(all_numeric_predictors()) %>% step_dummy(all_nominal_predictors(),one_hot = TRUE) %>% step_zv(all_predictors()) %>% prep() %>% bake(new_data = train) |
こうすると,④bakeのnew_dataで指定したデータを①~③で設定した内容に変形してくれるのです.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 3,563 x 14 Seniority Home Time Age Marital Records Job Expenses Income Assets Debt Amount Price Status <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <fct> 1 0.234 -0.658 -0.712 0.810 -0.564 2.14 0.408 1.74 0.727 -0.223 -0.273 1.98 2.44 bad 2 -0.993 0.110 0.105 0.352 -0.564 -0.467 2.50 1.74 -0.797 -0.500 -0.273 0.324 0.000616 bad 3 -0.993 -1.42 -1.94 -1.48 1.68 2.14 2.50 -1.05 -1.18 -0.500 -0.273 -1.34 -1.55 bad 4 -0.747 1.64 0.921 -1.11 1.68 -0.467 -0.640 -0.488 -0.454 -0.500 -0.273 0.946 1.16 bad 5 -0.870 -0.658 0.921 0.719 -0.564 -0.467 2.50 2.50 -0.390 -0.316 0.123 -0.921 -0.218 bad 6 -0.625 -0.658 -1.53 -1.30 -0.564 -0.467 -0.640 0.981 -0.733 -0.0384 -0.273 -0.921 0.212 bad 7 -0.993 0.110 0.105 -0.0139 1.68 -0.467 0.408 -1.05 -0.276 -0.271 -0.126 0.946 0.614 bad 8 -0.993 -0.658 -0.712 -1.30 1.68 -0.467 2.50 -0.539 -0.263 -0.269 -0.273 -1.34 -1.71 bad 9 -0.870 1.64 0.513 -0.105 -0.564 -0.467 -0.640 0.727 -0.555 -0.500 -0.273 -0.195 -0.831 bad 10 -0.379 1.64 0.105 -0.563 1.68 -0.467 -0.640 -0.590 -0.670 -0.500 -0.273 0.531 0.373 bad # … with 3,553 more rows |
この例でコーディングした処理内容は
①recipe:目的変数はStatus,説明変数はそれ以外,学習データはtrain
②step:
・文字列型(factort型)の説明変数をinteger型に変形して
・Home列, Marital列, Job列, Income列, Assets列, Debt列の欠損値を決定木(バギング)による予測値で補間して
・数値型の説明変数を正規化して
・文字列型(factort型)の説明変数をone-hot encodingして
・全ての説明変数のうち,値が同一のものを削除する
③prep:①,②で定義した処理内容を決定する.
④bake:③の処理を適用する.
ここで特徴量エンジニアリングの最重要部分は,②stepです.
②stepでは,step_〇〇〇という関数を複数つなげることで,様々な変形処理を記述することができます.
これらのstep_〇〇〇という関数をつなげることで多種多様な変形方法を記述することができるのです!!
次項からこの便利なstep_〇〇〇のうち,使用頻度が高いものを紹介していきます!
1.数値変数の変換
数値変数を変換したいときに使用する関数です.
linear系のアルゴリズムは標準化を必ずしましょう!!
No | 関数 | 用途 |
1 |
step_normalize |
標準化(正規化) |
2 |
step_log |
対数変換 |
3 |
step_BoxCox |
Box-Cox変換 |
4 |
step_YeoJohnson |
Yeo-Johnson変換 |
2.カテゴリ変数の変換
カテゴリ変数を変換したいときに使用する関数です.
No | 関数 | 用途 |
1 |
step_dummy |
one-hot encoding |
2 |
step_mutate_at |
label encoding |
3.欠損値の補間
欠損値を補完する場合に使用する関数です.
代表値補間と予測補間に分類できます.
3.1.代表値補間
まずは代表値補間です.
欠損値をその変数の代表値で補間します.
No | 関数 | 用途 |
1 |
step_impute_mean | 欠損値を平均で補間 |
2 |
step_impute_median | 欠損値を中央値で補完 |
3 |
step_impute_mode | 欠損値を最頻値で補間 |
4 |
step_impute_roll | 欠損値を移動窓数と統計量 (中央値や平均値など)に応じた値で補完 |
3.2.予測補間
続きまして予測補間です.
欠損している変数を目的変数,他の変数を説明変数とみなし,予測することで補間します.
本来の目的変数を使用するとテストデータの補間ができないので,予測補間をするときは本来の目的変数は説明変数に含めないようにします.
No | 関数 | 用途 |
1 |
step_impute_linear |
欠損値を線形回帰で補間 |
2 |
step_impute_knn |
欠損値をK近傍法で補完 |
3 |
step_impute_bag |
欠損値を決定木(バギング)で補間 |
4.その他の便利関数
ここでは,1~3で紹介しきれなかったけどよく使用する関数を集めました!
No | 関数 | 用途 |
1 |
step_mutate |
列の追加,修正 |
2 |
step_corr |
相関係数が高い列を削除 |
3 |
step_zv |
全部同じ値の列を削除 |
4 | step_nzv |
ほとんど同じ値の列を削除 |
5 | step_bs |
スプライン近似のための基底変換列を作成 |
6 | step_naomit |
欠損値がある行を削除 |
ここで紹介した以外にもstep_〇〇〇はたくさんあります!
step_〇〇〇の一覧はこちらの公式ページに乗っています.
まとめ
今回は,特徴量エンジニアリングのためのパッケージ{recipes}についてやってきました!
{recipes}は基本的に以下のように使用します.
①recipe:説明変数,目的変数,学習データを定義
②step:データをどのように変形するか定義
③prep:処理内容の決定
④bake:適用
そして,その中でもどのように変形するかを詳細に記述する部分が②stepの部分です.
②stepでは,step_〇〇〇という関数をつなげることで様々な処理を楽に記述することができます.
step_〇〇〇という関数はここで紹介した以外にたくさんあるので,いろいろ調べてみると勉強になりますよ!!
それでは,お疲れ様でした!!