0Pricing
R Academy · レッスン

xgboost による勾配ブースティング

xgboost のパラメーター、早期停止、学習率スケジュールを設定します。

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

勾配ブースティングとは

勾配ブースティングは、アンサンブルを逐次的に構築します。新しい木は、損失関数の負の勾配に適合することで、直前のアンサンブルの残差誤差を修正します。ランダムフォレストが木を並列に構築するのに対し、ブースティングは木を1本ずつ構築し、それぞれが直前の木の誤りから学習します。

library(xgboost)

# XGBoost expects data in a special matrix format
# We'll build a simple example step by step
cat('XGBoost version:', packageVersion('xgboost'))

# Key concept: each tree reduces the ensemble error
# Final prediction = sum of all tree predictions

xgb.DMatrix()

xgb.DMatrix(data, label)は、XGBoostに最適化された内部データ形式です。特徴量行列とラベルベクトルをまとめて格納し、高速でメモリ効率のよい計算を可能にします。学習前には必ずデータをDMatrixに変換してください。

library(xgboost)
library(MASS)

X_train <- as.matrix(Boston[1:400, -14])  # features
y_train <- Boston[1:400, 14]              # medv (target)

X_test  <- as.matrix(Boston[401:506, -14])
y_test  <- Boston[401:506, 14]

dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest  <- xgb.DMatrix(data = X_test,  label = y_test)

cat('DMatrix rows:', nrow(dtrain))

xgboost() — 基本的な学習

xgboost(data, nrounds, eta, max_depth, objective)でモデルを学習します。主なパラメータは、eta(学習率。小さいほど堅牢ですが遅くなります)、max_depth(木の深さ。モデルの複雑度を制御します)、nrounds(木の数)です。

params <- list(
  objective  = 'reg:squarederror',
  eta        = 0.1,     # learning rate
  max_depth  = 6,       # tree depth
  subsample  = 0.8,     # row subsampling
  colsample_bytree = 0.8  # column subsampling
)

set.seed(42)
model <- xgboost(
  data    = dtrain,
  params  = params,
  nrounds = 100,
  verbose = 0
)

cat('Model trained with', model$niter, 'rounds')

Watchlist — 検証損失を監視する

watchlist引数には、名前付きのDMatrixオブジェクトのリストを渡します。XGBoostは、ブースティングの各ラウンド後に、リスト内の各データセットの損失を評価して出力します。これを使って学習損失と検証損失を追跡し、過学習の始まりを検出します。

watchlist <- list(train = dtrain, eval = dtest)

model <- xgb.train(
  params    = params,
  data      = dtrain,
  nrounds   = 200,
  watchlist = watchlist,
  verbose   = 1
)

# The log shows train-rmse and eval-rmse per round
# Watch for eval-rmse increasing (overfitting signal)

early_stopping_rounds

early_stopping_rounds = 20を設定すると、検証指標が20ラウンド連続で改善しなかった場合に学習を停止します。これにより、網羅的な手動チューニングを行わずに最適な木の数を自動的に見つけ、未学習と過学習の両方を避けられます。

model <- xgb.train(
  params              = params,
  data                = dtrain,
  nrounds             = 1000,      # max rounds
  watchlist           = list(train = dtrain, eval = dtest),
  early_stopping_rounds = 20,      # stop if no improvement
  print_every_n       = 50,
  verbose             = 1
)

cat('Best iteration:', model$best_iteration)
cat('Best eval RMSE:', model$best_score)

二値分類

二値分類ではobjective = 'binary:logistic'を使用し、予測確率を出力します。ラベルは0/1の数値でなければなりません。eval_metricパラメータを使い、AUCまたは対数損失で評価します。

# Binary classification example
library(MASS)
Pima <- MASS::Pima.tr

X_cl <- as.matrix(Pima[, -8])
y_cl <- as.numeric(Pima$type) - 1  # factor to 0/1

dt_cl <- xgb.DMatrix(data = X_cl, label = y_cl)

mod_cl <- xgboost(
  data       = dt_cl,
  objective  = 'binary:logistic',
  eval_metric = 'auc',
  eta        = 0.05,
  max_depth  = 4,
  nrounds    = 100,
  verbose    = 0
)

予測

predict(model, dtest)は、分類では確率、回帰では実数値の予測値を返します。分類タスクで確率をクラスラベルに変換するには、0.5をしきい値として適用します。

# Regression predictions
reg_preds <- predict(model, dtest)
rmse <- sqrt(mean((reg_preds - y_test)^2))
cat('Test RMSE:', round(rmse, 3))

# Classification predictions
prob_preds  <- predict(mod_cl, dt_cl)
class_preds <- ifelse(prob_preds > 0.5, 1, 0)
accuracy <- mean(class_preds == y_cl)
cat('Training Accuracy:', round(accuracy, 3))

xgb.cv() — 交差検証

xgb.cv(params, data, nrounds, nfold)は、XGBoost内でk分割交差検証を実行します。XGBoostが内部で分割を処理するため、rsampleを使用するより高速です。出力には、ラウンドごとの指標の平均値と標準偏差が示されます。

cv_result <- xgb.cv(
  params    = params,
  data      = dtrain,
  nrounds   = 200,
  nfold     = 5,
  early_stopping_rounds = 15,
  print_every_n = 20,
  verbose   = 1
)

# Best nrounds from CV
best_nrounds <- cv_result$best_iteration
cat('Optimal nrounds:', best_nrounds)

# CV RMSE at best iteration
cat('CV RMSE:', cv_result$evaluation_log[best_nrounds, 'test_rmse_mean'][[1]])

主要なハイパーパラメータ

XGBoostで特に影響の大きいハイパーパラメータ:

  • eta:学習率(0.01~0.3)。小さいほど必要な木の数は増えますが、より堅牢になります。
  • max_depth:木の深さ(3~10)。大きいほど複雑になり、過学習しやすくなります。
  • subsample:木ごとに使用する行の割合(0.5~1.0)。過学習を抑制します。
  • colsample_bytree:木ごとに使用する特徴量の割合(0.5~1.0)。
  • lambda:葉の重みに対するL2正則化。
  • alpha:葉の重みに対するL1正則化。
params_tuned <- list(
  objective         = 'reg:squarederror',
  eta               = 0.05,
  max_depth         = 5,
  subsample         = 0.75,
  colsample_bytree  = 0.75,
  lambda            = 1.0,    # L2 regularization
  alpha             = 0.1,    # L1 regularization
  min_child_weight  = 3       # min samples in leaf
)

model_tuned <- xgboost(
  data = dtrain, params = params_tuned,
  nrounds = best_nrounds, verbose = 0
)

モデルの保存と読み込み

XGBoostモデルは、xgb.save(model, 'model.xgb')でバイナリ形式としてディスクに保存し、xgb.load('model.xgb')で再読み込みできます。これは本番環境へのデプロイに推奨される形式であり、ビット単位で完全に再現可能です。

# Save model
xgb.save(model, '/tmp/xgb_boston.xgb')

# Reload and predict
loaded_model <- xgb.load('/tmp/xgb_boston.xgb')
new_preds <- predict(loaded_model, dtest)

# Verify predictions match
all.equal(reg_preds, new_preds)  # TRUE

多クラス分類

多クラス問題では、objective = 'multi:softprob'を使用し、num_classにクラス数を設定します。ラベルは0から始まる整数でなければなりません。出力は、各クラスの確率を格納した行列です。

X_mc <- as.matrix(iris[, -5])
y_mc <- as.integer(iris$Species) - 1  # 0, 1, 2

dt_mc <- xgb.DMatrix(data = X_mc, label = y_mc)

params_mc <- list(
  objective  = 'multi:softprob',
  num_class  = 3,
  eta        = 0.1,
  max_depth  = 3
)

mod_mc <- xgboost(
  data = dt_mc, params = params_mc,
  nrounds = 50, verbose = 0
)

# Predictions: matrix of shape (n, num_class)
prob_matrix <- matrix(predict(mod_mc, dt_mc), ncol = 3, byrow = TRUE)
head(prob_matrix)

理解度チェック

xgb.train()でearly_stopping_rounds = 20を設定する目的は何ですか。

XGBoostのまとめ

「XGBoostによる勾配ブースティング」の重要ポイント:

  • xgb.DMatrix(data, label)でXGBoostに最適化されたデータ形式を作成します。
  • 主要なパラメータは、eta(学習率)、max_depth、subsample、colsample_bytreeです。
  • watchlistで、ラウンドごとの学習損失と検証損失を監視します。
  • early_stopping_roundsで最適な木の数を自動的に見つけます。
  • xgb.cv()でXGBoost内のk分割CVを実行し、高速にハイパーパラメータを探索します。
  • 二値分類にはobjective = 'binary:logistic'を、多クラス分類には'multi:softprob'を使用します。
  • xgb.save()/xgb.load()でモデルを保存・読み込みします。
# Production XGBoost pipeline
dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest  <- xgb.DMatrix(data = X_test,  label = y_test)

params <- list(objective = 'reg:squarederror',
               eta = 0.05, max_depth = 5, subsample = 0.8)

cv  <- xgb.cv(params, dtrain, nrounds = 500, nfold = 5,
              early_stopping_rounds = 20, verbose = 0)

model <- xgboost(data = dtrain, params = params,
                 nrounds = cv$best_iteration, verbose = 0)

preds <- predict(model, dtest)
cat('RMSE:', sqrt(mean((preds - y_test)^2)))

よくある質問

「xgboost による勾配ブースティング」レッスンは無料ですか?

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

「xgboost による勾配ブースティング」で何を学びますか?

xgboost のパラメーター、早期停止、学習率スケジュールを設定します。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「xgboost による勾配ブースティング」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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