0Pricing
R Academy · レッスン

ranger によるランダムフォレスト

ランダムフォレストモデルを学習し、mtry と ntrees を調整して OOB 誤差を評価します。

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

ランダムフォレストとは

ランダムフォレストは、データのブートストラップ標本で多数の決定木を構築し、その予測を平均(回帰)するか、多数決(分類)を行います。アンサンブル名の由来となるランダム性は、行のブートストラップサンプリングと、各分割での特徴量のランダム選択という2つです。

library(ranger)

# Minimal random forest: 500 trees, auto mtry
rf <- ranger(
  medv ~ .,
  data      = MASS::Boston,
  num.trees = 500
)

print(rf)

mtryパラメータ

mtryは、各分割でランダムに検討する特徴量の数です。全特徴量より少ない数を使うと木同士の相関が低くなり、分散が小さくなります。経験則では、分類の場合はmtry = sqrt(p)、回帰の場合はmtry = p/3とします。ここでpは予測変数の数です。

p <- ncol(MASS::Boston) - 1  # number of predictors

rf_class <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = floor(sqrt(4))  # sqrt(p) for classification
)

rf_reg <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = floor(p / 3)    # p/3 for regression
)

cat('Classification OOB Error:', rf_class$prediction.error)
cat('Regression OOB RMSE:', sqrt(rf_reg$prediction.error))

OOB誤差 — 無料の検証

各木はブートストラップ標本で学習するため、およそ3分の1の観測値が学習から除外されます(out-of-bag、OOB)。このOOB標本は、各木に対する組み込みの検証セットとして機能します。OOB誤差を集計した値は、テスト誤差のほぼ不偏な推定値となるため、別の検証セットは必要ありません。

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees = 500,
  mtry      = 4
)

# OOB MSE
cat('OOB MSE:', rf$prediction.error)

# OOB RMSE
cat('OOB RMSE:', sqrt(rf$prediction.error))

# For classification: OOB error rate
rf_cl <- ranger(Species ~ ., data = iris)
cat('OOB Error Rate:', rf_cl$prediction.error)

変数重要度

importance = 'impurity'を設定すると、すべての木における各特徴量のノード不純度(ジニまたはMSE)の減少量の合計を記録します。importance = 'permutation'を設定すると、各特徴量をランダムにシャッフルしたときの正解率の低下を測定します。こちらの方が信頼性は高いものの、処理は遅くなります。

rf_imp <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'impurity'
)

# Sorted importance scores
imp <- sort(rf_imp$variable.importance, decreasing = TRUE)
print(imp)

# Quick plot
barplot(imp, las = 2, col = 'steelblue',
        main = 'Random Forest Variable Importance')

rangerで予測する

predict(rf, data = test)を使用して予測を生成します。結果はリストなので、$predictionsで予測値にアクセスします。分類では、デフォルトで予測値はfactorの水準になります。

set.seed(1)
idx   <- sample(nrow(MASS::Boston), 400)
train <- MASS::Boston[idx, ]
test  <- MASS::Boston[-idx, ]

rf <- ranger(medv ~ ., data = train, num.trees = 500)

pred <- predict(rf, data = test)
test_rmse <- sqrt(mean((pred$predictions - test$medv)^2))
cat('Test RMSE:', round(test_rmse, 3))

混同行列の概念

分類では、混同行列によって実際のクラスと予測クラスをクロス集計します。混同行列から導出される主な指標には、正解率、適合率(TP / (TP + FP))、再現率(TP / (TP + FN))、F1スコアがあります。rangerでは、OOB混同行列を直接取得できます。

rf_cl <- ranger(
  Species ~ ., data = iris,
  num.trees = 500,
  mtry      = 2
)

# OOB confusion matrix
print(rf_cl$confusion.matrix)

# OOB error rate
cat('OOB Error Rate:', rf_cl$prediction.error)

# Manual accuracy on OOB predictions
# (1 - error rate)
cat('OOB Accuracy:', 1 - rf_cl$prediction.error)

mtryとnum.treesのチューニング

木の数を増やすと、逓減効果が現れるおよそ300~500本までは、分散が常に小さくなります。mtryパラメータには最適な範囲があります。単純なチューニングループで、mtryの候補値ごとにOOB誤差を評価すれば、交差検証なしで最適値を見つけられます。

mtry_vals <- c(2, 4, 6, 8, 10)
oob_errors <- sapply(mtry_vals, function(m) {
  rf <- ranger(
    medv ~ ., data = MASS::Boston,
    num.trees = 300, mtry = m
  )
  rf$prediction.error
})

best_mtry <- mtry_vals[which.min(oob_errors)]
cat('Best mtry:', best_mtry)
plot(mtry_vals, sqrt(oob_errors), type = 'b',
     xlab = 'mtry', ylab = 'OOB RMSE')

分類におけるranger

分類では、probability = TRUEを設定すると、ハードラベルではなくクラス確率の予測値を取得できます。これはROC曲線の計算と、較正された確率推定に必要であり、yardstickの指標が想定する出力形式にも一致します。

# Ensure the target is a factor
iris$Species <- as.factor(iris$Species)

rf_prob <- ranger(
  Species ~ ., data = iris,
  num.trees   = 300,
  probability = TRUE  # output class probabilities
)

# Predictions are a matrix of probabilities
pred_prob <- predict(rf_prob, data = iris[1:5, ])
print(pred_prob$predictions)

rangerの並列処理

rangerは高速な並列処理を目的に設計されています。num.threadsを設定すると、利用可能なすべてのCPUコアを使用できます。特に多数の木を使う大規模データセットでは、旧来のrandomForestパッケージより大幅に高速化できる場合があります。

# Use all available cores
rf_fast <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 1000,
  mtry       = 4,
  num.threads = parallel::detectCores()
)

cat('Trees:', rf_fast$num.trees)
cat('Threads used:', rf_fast$num.threads)
cat('OOB RMSE:', sqrt(rf_fast$prediction.error))

tidymodels経由でrangerを使う

tidymodelsのインターフェースを通じてrangerを使用できます。これにより、構文が統一され、ワークフロー、交差検証、チューニングと統合できます。エンジンに'ranger'を指定し、エンジン固有の引数はset_engine()で渡します。

library(parsnip)
library(workflows)

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

wf <- workflow() |>
  add_recipe(rec) |>
  add_model(rf_spec)

print(wf)

rangerの出力を解釈する

出力されたrangerモデルには、木の数、目的変数、使用した特徴量の数、OOB予測誤差、R二乗(回帰の場合)が表示されます。簡単な妥当性確認として、必ずOOB誤差を確認してください。大規模なデータセットで極端に低い場合は、データリークを疑います。

rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500, mtry = 4,
  importance = 'impurity'
)

# Key output fields
cat('OOB MSE:      ', rf$prediction.error, '\n')
cat('OOB RMSE:     ', sqrt(rf$prediction.error), '\n')
cat('R-squared:    ', rf$r.squared, '\n')
cat('Num trees:    ', rf$num.trees, '\n')
cat('Num features: ', rf$num.independent.variables, '\n')

理解度チェック

rangerで構築したランダムフォレストにおいて、OOB(out-of-bag)誤差は何を推定しますか。

ランダムフォレストのまとめ

「rangerによるランダムフォレスト」の重要ポイント:

  • ランダムフォレストは、ブートストラップ標本で構築した多数の木と、各分割での特徴量のランダム選択を組み合わせます。
  • mtryは分類ではsqrt(p)、回帰ではp/3を目安とし、このパラメータをチューニングします。
  • OOB誤差により、追加コストなしで、ほぼ不偏な検証推定値を得られます。
  • importance = 'impurity'または'permutation'で変数重要度のスコアを取得できます。
  • 分類でクラス確率を出力するには、probability = TRUEを設定します。
  • rangerは高度に並列化されているため、大規模データセットではnum.threadsを使用します。
  • rand_forest() |> set_engine('ranger')でtidymodelsと統合できます。
rf <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  mtry       = 4,
  importance = 'impurity',
  num.threads = parallel::detectCores()
)

cat('OOB RMSE:', sqrt(rf$prediction.error))
cat('R2:', rf$r.squared)

print(sort(rf$variable.importance, decreasing = TRUE))

よくある質問

「ranger によるランダムフォレスト」レッスンは無料ですか?

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

「ranger によるランダムフォレスト」で何を学びますか?

ランダムフォレストモデルを学習し、mtry と ntrees を調整して OOB 誤差を評価します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「ranger によるランダムフォレスト」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 決定木:アンサンブルの基礎
  2. ranger によるランダムフォレスト
  3. xgboost による勾配ブースティング
  4. 特徴量の重要度とモデルの解釈
← R Academyに戻る