1

私の理解が正しければ、 のようにCV を使用catboostして調整する必要があります。[8]の公式チュートリアルに次のコードが表示されます。nroundsxgboost

params_with_od <- list(iterations = 500,
                       loss_function = 'Logloss',
                       train_dir = 'train_dir',
                       od_type = 'Iter',
                       od_wait = 30)
model_with_od <- catboost.train(train_pool, test_pool, params_with_od)

最良の結果はiterations211 です。

私の質問は次のとおりです。

  • このコマンドは、クロス検証を使用する代わりに を使用しtest_poolて最適なものを選択するのは正しいですか?iterations
  • はいの場合、catboost はiterationsCV から最適なものを選択するコマンドを提供しますか、それとも手動で行う必要がありますか?
4

3 に答える 3

1
  1. 反復回数を 1 つの test_pool と catboost.train() の最適な反復に基づいて決定するのは、非常に不適切な決定です。そうすることで、パラメーターを 1 つの特定のテスト セットに合わせて調整しているため、モデルは新しいデータではうまく機能しません。したがって、XGBoost のように、CV を適用して最適な反復回数を見つける必要があると推測するのは正しいことです。
  2. 確かに 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
      )

于 2020-04-05T17:55:49.993 に答える