xgboost呼び出しでk-fold CVを指定するには、nfold = some integer
引数を使用してxgb.cv
を呼び出して、各リサンプル使用の予測を保存する必要があります。prediction = TRUE
引数例えば:
xgboostModelCV <- xgb.cv(data = dtrain,
nrounds = 1688,
nfold = 5,
objective = "binary:logistic",
eval_metric= "auc",
metrics = "auc",
verbose = 1,
print_every_n = 50,
stratified = T,
scale_pos_weight = 2
max_depth = 6,
eta = 0.01,
gamma=0,
colsample_bytree = 1 ,
min_child_weight = 1,
subsample= 0.5 ,
prediction = T)
xgboostModelCV$pred #contains predictions in the same order as in dtrain.
xgboostModelCV$folds #contains k-fold samples
ここでは、グリッド値とグリッド内のparams、だけでなく、損失/評価メトリックを変更することができます
function(train, seed){
require(xgboost)
ntrees=2000
searchGridSubCol <- expand.grid(subsample = c(0.5, 0.75, 1),
colsample_bytree = c(0.6, 0.8, 1),
gamma=c(0, 1, 2),
eta=c(0.01, 0.03),
max_depth=c(4,6,8,10))
aucErrorsHyperparameters <- apply(searchGridSubCol, 1, function(parameterList){
#Extract Parameters to test
currentSubsampleRate <- parameterList[["subsample"]]
currentColsampleRate <- parameterList[["colsample_bytree"]]
currentGamma <- parameterList[["gamma"]]
currentEta =parameterList[["eta"]]
currentMaxDepth =parameterList[["max_depth"]]
set.seed(seed)
xgboostModelCV <- xgb.cv(data = train,
nrounds = ntrees,
nfold = 5,
objective = "binary:logistic",
eval_metric= "auc",
metrics = "auc",
verbose = 1,
print_every_n = 50,
early_stopping_rounds = 200,
stratified = T,
scale_pos_weight=sum(all_data_nobad[index_no_bad,1]==0)/sum(all_data_nobad[index_no_bad,1]==1),
max_depth = currentMaxDepth,
eta = currentEta,
gamma=currentGamma,
colsample_bytree = currentColsampleRate,
min_child_weight = 1,
subsample= currentSubsampleRate)
xvalidationScores <- as.data.frame(xgboostModelCV$evaluation_log)
#Save rmse of the last iteration
auc=xvalidationScores[xvalidationScores$iter==xgboostModelCV$best_iteration,c(1,4,5)]
auc=cbind(auc, currentSubsampleRate, currentColsampleRate, currentGamma, currentEta, currentMaxDepth)
names(auc)=c("iter", "test.auc.mean", "test.auc.std", "subsample", "colsample", "gamma", "eta", "max.depth")
print(auc)
return(auc)
})
return(aucErrorsHyperparameters)
}
をhyperparams選ぶためのまともな機能です。 caret
グリッド検索で提供されるのと似ていますが、alpha
、lambda
、colsample_bylevel
、num_parallel_tree
...グリッド検索のハイパーパラメータは、わかりにくいカスタム関数を定義しています。 Caret
は自動前処理、CV内での自動アップ/ダウンサンプリングなどの利点を持っています
xgb.cvコールの外にあるシードを設定すると、CVでは同じフォールドが選択されますが、別のモデルでxgb.cv関数呼び出しの中にシードを設定しても、同じモデルになるという保証はありませんが、より多くのチャンスがあります(スレッド、モデルのタイプに依存します)。 - 不確実性のようなそれは結果にほとんど影響を与えない)。
'nfold = 5'を追加して、5倍のCVを' xgboost'呼び出しに追加してみてください。また、より多くのラウンド、おそらく1000程度を指定する必要があります。もしそうすれば 'print_every_n = 100'は歓迎すべき引数です。一般的に、テストセットを指定すると、nfoldを指定すると検証が行われます。k-fold CVを実行します。 – missuse
@missuse申し訳ありませんが、私の質問がはっきりしていないことに気付きました。私が理解しようとしているのは、訓練データだけを含む10倍のクロスバリデーションされたデータセットのホールドアウトセットを予測する方法です。 – 114
Sry私は間違いを犯しました.k-fold CVを指定するには、 'xgb.cv'関数を呼び出す必要があります。ここでは 'prediction = TRUE'を指定することができ、それぞれの折り畳みの予測が得られます:' model $ pred' - 列車セットと同じ順序です。 Foldsは 'model $ folds'で指定されます。 xgb.cvより前の種を設定すると同じ折り目が選択されますが、同じモデルは複製されません。同じモデルを再現するには、 'xgb.cv'呼び出しの中で' seed'を設定する必要があります。 – missuse