R Academy · レッスン

recipes による特徴量エンジニアリング

正規化、エンコーディング、欠損値補完の前処理ステップを定義します。

レッスン 1/413 ステップ

「recipes による特徴量エンジニアリング」はCoddyKit上の無料R Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。

recipeとは

tidymodelsにおけるrecipeは、データを前処理するための設計図です。生のデータをモデルで利用できる特徴量へ変換するために必要な手順を記録しますが、作成時点ではまだ適用しません。

中心となる関数はrecipe(outcome ~ ., data = train)です。前処理で必要な統計量を推定するための式と基準データセットを定義します。

library(recipes)
library(tidymodels)

# Create a recipe using the training data
rec <- recipe(price ~ ., data = train_data)
print(rec)

step_normalize()

step_normalize(all_numeric_predictors())は、各数値予測変数を平均0になるよう中心化し、標準偏差1になるようスケーリングします。ロジスティック回帰、SVM、ニューラルネットワークなど、特徴量のスケールに敏感なアルゴリズムでは不可欠です。

平均と標準偏差はトレーニングセットから計算され、bake()を通じてテストデータにも一貫して適用されます。

rec <- recipe(price ~ ., data = train_data) |>
  step_normalize(all_numeric_predictors())

# Check what steps are recorded
print(rec)

step_dummy()

step_dummy(all_nominal_predictors())は、カテゴリ(factor/character)変数を数値のダミー列(one-hot encoding)に変換します。デフォルトでは、k水準のfactorに対してk-1列を作成し、完全な多重共線性を避けます。

完全なone-hot encodingの利点を活かせるツリーベースのモデルでは、one_hot = TRUEを使用します。

rec <- recipe(price ~ ., data = train_data) |>
  step_dummy(all_nominal_predictors())

# After prep and bake, factor columns become 0/1 numeric columns
prepped <- prep(rec)
baked <- bake(prepped, new_data = NULL)
names(baked)

step_impute_median()

欠損値があると、多くのモデルエンジンは処理に失敗します。step_impute_median(all_numeric_predictors())は、NA値をトレーニングセットから計算した中央値で置き換えます。中央値は平均値による補完と比べて外れ値の影響を受けにくいという利点があります。

カテゴリ変数の場合は、最頻値で補完するstep_impute_mode()を使用します。

rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors())

print(rec)

step_zv() — 分散が0の変数を削除

step_zv(all_predictors())は、単一の異なる値しか持たない(分散が0の)予測変数を削除します。このような列は情報を持たず、一部のモデルエンジンでエラーの原因になることがあります。

ほぼ分散が0の変数にはstep_nzv(all_predictors())を使用します。これは、1つの値が極端に多くを占める列も削除します。

rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

print(rec)

prep() — recipeを学習させる

prep(recipe)は、トレーニングデータを使って、各ステップに必要なすべてのパラメータ(正規化の平均値と標準偏差、補完に使う中央値など)を推定します。その結果として、変換パラメータをすべて把握したprepped recipeが作成されます。

テストセットからのデータリークを避けるため、必ずトレーニングデータだけでprepしてください。

# Build the full recipe
rec <- recipe(price ~ ., data = train_data) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

# Estimate parameters from training data
prepped_rec <- prep(rec)
print(prepped_rec)

bake() — 新しいデータに適用する

bake(prepped_recipe, new_data = test_data)は、すでに推定されたパラメータを使って、すべての前処理ステップを任意のデータセットに適用します。これにより、トレーニングデータとテストデータで変換を一貫させられます。

new_data = NULLを渡すと、prep()で使用したトレーニングデータに適用できます。

# Apply recipe to test data
baked_test <- bake(prepped_rec, new_data = test_data)
head(baked_test)

# Apply to training data (same as juice())
baked_train <- bake(prepped_rec, new_data = NULL)
dim(baked_train)

juice() — 前処理済みのトレーニングデータを抽出する

juice(prepped_recipe)は、bake(prepped_recipe, new_data = NULL)と同等の便利な関数です。prep()で使用したトレーニングデータの前処理済みのバージョンを返します。

注:juice()はbake(prep, new_data = NULL)の使用が推奨されるようになり、やや非推奨です。ただし、古いtidymodelsのコードでは見かけることがあります。

# juice() extracts the processed training data
train_processed <- juice(prepped_rec)
glimpse(train_processed)

# Equivalent modern approach
train_modern <- bake(prepped_rec, new_data = NULL)
identical(train_processed, train_modern)  # TRUE

複数のステップを組み合わせる

ステップは、追加された順序で適用されます。一般的な実運用向けrecipeは、次の順序で構成します。

  1. 補完(最初にNAを処理)
  2. 特徴量の作成(交互作用、多項式)
  3. ダミーエンコーディング(factorを変換)
  4. 分散が0の変数の削除
  5. 正規化(最後にスケール)

この順序は重要です。たとえば、ダミーエンコーディングの前に正規化すると、正しい結果になりません。

full_rec <- recipe(sale_price ~ ., data = housing_train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_impute_mode(all_nominal_predictors()) |>
  step_log(sale_price, base = 10) |>
  step_other(all_nominal_predictors(), threshold = 0.05) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

print(full_rec)

prepの結果を確認する

prep()を呼び出した後は、tidy(prepped_rec)を使って各ステップの処理内容を確認できます。各ステップには数値のIDがあり、tidy(prepped_rec, number = 1)のように指定すると、そのステップで推定されたパラメータを詳しく確認できます。

prepped_rec <- prep(full_rec)

# View all steps and their status
tidy(prepped_rec)

# Inspect normalization parameters (mean, sd per column)
tidy(prepped_rec, number = 5)  # step_normalize is step 5

実際のレシピ利用

recipeはworkflowと組み合わせると特に力を発揮します。prep()やbake()を手動で呼び出す代わりに、recipeをworkflowへ追加すれば、tidymodelsがfit()とpredict()の実行時にprep/bakeを自動的に処理します。

これにより、トレーニング時と推論時で前処理が異なるという、よくあるバグの原因をなくせます。

library(workflows)

# Recipe + model spec combined in a workflow
wf <- workflow() |>
  add_recipe(full_rec) |>
  add_model(linear_reg() |> set_engine('lm'))

# fit() internally calls prep() + bake() on training data
fitted_wf <- fit(wf, data = housing_train)

# predict() applies bake() to new data automatically
predictions <- predict(fitted_wf, new_data = housing_test)
head(predictions)

クイックチェック

tidymodelsのrecipesフレームワークでprep(recipe)を呼び出すと、何が行われますか。

Recipesのおさらい

Recipesを使った特徴量エンジニアリングの重要ポイント:

  • recipe(outcome ~ ., data = train)で前処理の設計図を定義します。
  • step_normalize()、step_dummy()、step_impute_median()、step_zv()が最もよく使われるステップです。
  • prep()はトレーニングデータだけからパラメータを推定します。テストデータから推定してはいけません。
  • bake(prepped, new_data)で学習済みのrecipeを任意のデータセットに適用します。
  • ステップの順序が重要です:補完 → 作成 → エンコード → 削除 → スケーリング
  • 実運用ではrecipeをworkflow()で包み、fitとpredictの実行時にprep/bakeを自動化します。
# Full pipeline in 6 lines
rec <- recipe(target ~ ., data = train) |>
  step_impute_median(all_numeric_predictors()) |>
  step_dummy(all_nominal_predictors()) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

prepped <- prep(rec)
train_baked <- bake(prepped, new_data = NULL)
test_baked  <- bake(prepped, new_data = test)
無料で開始

AI チューターと学ぶ R — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
43
レッスン
159

よくある質問

「recipes による特徴量エンジニアリング」レッスンは無料ですか?

はい。「recipes による特徴量エンジニアリング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。

「recipes による特徴量エンジニアリング」で何を学びますか?

正規化、エンコーディング、欠損値補完の前処理ステップを定義します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

R Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「recipes による特徴量エンジニアリング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このR Academyレッスンでコードを書いて実行できますか?

はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. recipes による特徴量エンジニアリング
  2. parsnip によるモデル仕様の定義
  3. ワークフロー:レシピとモデルの組み合わせ
  4. rsample による再標本化と交差検証
← R Academyに戻る