- 反復回数を 1 つの test_pool と catboost.train() の最適な反復に基づいて決定するのは、非常に不適切な決定です。そうすることで、パラメーターを 1 つの特定のテスト セットに合わせて調整しているため、モデルは新しいデータではうまく機能しません。したがって、XGBoost のように、CV を適用して最適な反復回数を見つける必要があると推測するのは正しいことです。
- 確かに catboost には CV 機能があります。あなたがすべきことは、パラメータearly_stopping_roundsを使用して、多数の反復を指定し、改善が見られないラウンドの後にトレーニングを停止することです。残念ながら、LightGBM とは異なり、catboost には、catboost.train() で適用する CV の後に最適なブースト ラウンド数を自動的に与えるオプションがないようです。したがって、少し回避策が必要です。動作するはずの例を次に示します。
library(catboost)
library(data.table)
parameter = list(
thread_count = n_cores,
loss_function = "RMSE",
eval_metric = c("RMSE","MAE","R2"),
iterations = 10^5, # Train up to 10^5 rounds
early_stopping_rounds = 100, # Stop after 100 rounds of no improvement
)
# Apply 6-fold CV
model = catboost.cv(
pool = train_pool,
fold_count = 6,
params = parameter
)
# Transform output to DT
setDT(cbt_occupancy)
model[, iterations := .I]
# Order from lowest to highgest RMSE
setorder(model, test.RMSE.mean)
# Select iterations with lowest RMSE
parameter$iterations = model[1, iterations]
# Train model with optimal iterations
model = catboost.train(
learn_pool = train_pool,
test_pool = test_pool,
params = parameter
)