0Pricing
R Academy · レッスン

parsnip によるモデル仕様の定義

学習ステップから独立して、モデルの種類とエンジンを指定します。

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

parsnipとは

parsnipは、数百種類のモデルエンジンに対する統一インターフェースを提供します。各パッケージ固有の構文(glm()、randomForest()、e1071::svm())を個別に覚える代わりに、一貫した指定方法でモデルを記述し、内部で使用するエンジンをparsnipに指定します。

これにより、引数を1つ変更するだけで、ベイズロジスティック回帰のエンジンをglmからstanへ切り替えるといったことができます。

library(parsnip)

# The same interface, different engines
logistic_reg() |> set_engine('glm')    # base R
logistic_reg() |> set_engine('glmnet') # regularized
logistic_reg() |> set_engine('stan')   # Bayesian

分類のためのlogistic_reg()

logistic_reg()は、二値分類用のロジスティック回帰モデルを指定します。R組み込みのGLMエンジンを使用するにはset_engine('glm')をつなぎ、タスクの種類を明示するにはset_mode('classification')を指定します。

両方をサポートするモデルタイプでは、モード('classification'または'regression')の指定が必要です。

log_spec <- logistic_reg() |>
  set_engine('glm') |>
  set_mode('classification')

print(log_spec)
# Logistic Regression Model Specification (classification)
# Computational engine: glm

tune()を使ったrand_forest()

rand_forest()はランダムフォレストを指定します。mtry(分割ごとの特徴量数)やtreesなどのパラメータは、固定値にすることも、ハイパーパラメータ探索用のプレースホルダーとしてtune()に設定することもできます。

tune()を渡すと、tidymodelsは交差検証によるチューニング中に、値のグリッドを探索します。

rf_spec <- rand_forest(
  mtry  = tune(),
  trees = 500,
  min_n = tune()
) |>
  set_engine('ranger', importance = 'impurity') |>
  set_mode('classification')

print(rf_spec)

回帰のための linear_reg()

linear_reg()は線形回帰モデルを指定します。set_engine('lm')を使用すると通常の最小二乗法が使われ、set_engine('glmnet')を使用すると、penaltyパラメーターとmixtureパラメーターによるL1/L2正則化が有効になります。

# OLS linear regression
lm_spec <- linear_reg() |>
  set_engine('lm')

# Ridge regression (penalty > 0, mixture = 0)
ridge_spec <- linear_reg(penalty = 0.01, mixture = 0) |>
  set_engine('glmnet')

# Lasso (penalty > 0, mixture = 1)
lasso_spec <- linear_reg(penalty = tune(), mixture = 1) |>
  set_engine('glmnet')

boost_tree() — 勾配ブースティング

boost_tree()は勾配ブースティング木モデルを指定します。xgboost、lightgbm、C5.0のいずれかのエンジンを選択できます。調整可能なパラメーターにはtree_depth、learn_rate、loss_reductionがあります。

xgb_spec <- boost_tree(
  trees      = 500,
  tree_depth = tune(),
  learn_rate = tune(),
  loss_reduction = tune()
) |>
  set_engine('xgboost') |>
  set_mode('classification')

print(xgb_spec)

fit() — モデルの学習

fit(spec, formula, data)は、実際のデータを使ってモデル仕様を学習させます。parsnipは内部で、モデル仕様を適切なエンジン呼び出しに変換します。結果として、学習済みのparsnipモデルオブジェクトが返されます。

lm_spec <- linear_reg() |> set_engine('lm')

# Fit the model on training data
lm_fit <- fit(lm_spec, mpg ~ wt + hp + cyl, data = mtcars)

# The fitted object wraps the engine result
print(lm_fit)

# Access the underlying lm object
extract_fit_engine(lm_fit)

fit() — 行列インターフェース

fit_xy(spec, x, y)はfit(spec, formula, data)の代替手段です。予測変数行列xと目的変数ベクトルyを直接受け取ります。データがすでに数値行列に前処理されている場合に便利です(ニューラルネットワークやXGBoostでよく使われます)。

x_train <- train_baked |> select(-price)
y_train <- train_baked$price

lm_spec <- linear_reg() |> set_engine('lm')

# Matrix-style fit
lm_fit_xy <- fit_xy(lm_spec, x = x_train, y = y_train)

print(lm_fit_xy)

translate() — エンジンコードの確認

translate(spec)を使うと、指定したエンジンに対してparsnipが内部で実際に呼び出すコードを正確に確認できます。デバッグや、parsnipのモデル仕様がエンジン固有のインターフェースにどのように対応付けられるかを理解するうえで非常に役立ちます。

rf_spec <- rand_forest(mtry = 3, trees = 500) |>
  set_engine('ranger') |>
  set_mode('classification')

# See what ranger() call will be generated
translate(rf_spec)

# ranger::ranger(formula = ..., data = ...,
#   num.trees = 500, mtry = 3, ...)

parsnipでのpredict()

parsnipの学習済みモデルはすべて、同じpredict()インターフェースを共有します。分類では、type = 'class'を指定すると予測クラスが返され、type = 'prob'を指定するとクラス確率が返されます。この一貫性はparsnipの大きな利点の1つです。

log_fit <- fit(logistic_reg() |> set_engine('glm') |> set_mode('classification'),
               species ~ ., data = train_df)

# Predicted classes
predict(log_fit, new_data = test_df, type = 'class')

# Predicted probabilities
predict(log_fit, new_data = test_df, type = 'prob')

augment() — データに結合された予測値

augment(fitted_model, new_data)は、入力データフレームに予測列を直接追加します。評価時に便利で、結果には実測値と予測値が並んで含まれるため、すぐに指標を計算できます。

log_fit <- fit(
  logistic_reg() |> set_engine('glm') |> set_mode('classification'),
  species ~ ., data = train_df
)

# Get predictions joined to test data
results <- augment(log_fit, new_data = test_df)
head(results[, c('species', '.pred_class', '.pred_setosa')])

モデル仕様の比較

parsnipの主な利点の1つは、モデルをすばやく比較できることです。複数のモデル仕様を定義し、それらを同じデータに対して学習させ、指標を比較できます。インターフェースが同一なので、モデルを入れ替える際に変更するのはモデル仕様の定義だけです。

specs <- list(
  lm    = linear_reg() |> set_engine('lm'),
  ridge = linear_reg(penalty = 0.01, mixture = 0) |> set_engine('glmnet'),
  rf    = rand_forest(trees = 200) |> set_engine('ranger') |> set_mode('regression')
)

fits <- lapply(specs, fit, mpg ~ ., data = train_mtcars)

preds <- lapply(fits, predict, new_data = test_mtcars)

rmse_vals <- sapply(preds, function(p) {
  sqrt(mean((p$.pred - test_mtcars$mpg)^2))
})
print(rmse_vals)

確認問題

parsnipでtranslate(spec)は何を返しますか?

parsnipのまとめ

parsnipによるモデル仕様から学んだ重要事項:

  • parsnipは統一されたインターフェースを提供します。モデルの種類、エンジン、モードをそれぞれ個別に指定できます。
  • set_engine()は基盤となるパッケージを選択し、set_mode()は分類または回帰を選択します。
  • 後で検索するハイパーパラメーターのプレースホルダーとしてtune()を使用します。
  • fit(spec, formula, data)はモデルを学習させ、fit_xy(spec, x, y)は行列を受け取ります。
  • predict(fit, new_data, type)はすべてのエンジンで一貫して使用できます。
  • translate(spec)はデバッグ用にエンジン呼び出しを表示します。
  • augment(fit, new_data)はデータフレームに予測値を追加します。
# Parsnip model comparison template
spec <- rand_forest(trees = 500, mtry = tune()) |>
  set_engine('ranger', importance = 'impurity') |>
  set_mode('classification')

print(translate(spec))

# When mtry is fixed:
spec_fixed <- rand_forest(trees = 500, mtry = 5) |>
  set_engine('ranger') |>
  set_mode('classification')
fit_fixed <- fit(spec_fixed, label ~ ., data = train_df)

よくある質問

「parsnip によるモデル仕様の定義」レッスンは無料ですか?

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

「parsnip によるモデル仕様の定義」で何を学びますか?

学習ステップから独立して、モデルの種類とエンジンを指定します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「parsnip によるモデル仕様の定義」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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