2017-09-19 12 views
0

バイナリ結果を予測する目的で、一連のトレーニングデータとテストデータに対して簡単なxgboostモデルを実行する次のRコードがあります。列車+テストデータの組み合わせとクロスバリデーションの実行R

開始する

1)関連するライブラリで読む。適切な形式のデータにXGBoostを実行しているトレーニングとテストデータ

train.raw = read.csv("train_data", header = TRUE, sep = ",") 
drop = c('column') 
train.df = train.raw[, !(names(train.raw) %in% drop)] 
train.df[,'outcome'] = as.factor(train.df[,'outcome']) 


test.raw = read.csv("test_data", header = TRUE, sep = ",") 
drop = c('column') 
test.df = test.raw[, !(names(test.raw) %in% drop)] 
test.df[,'outcome'] = as.factor(test.df[,'outcome']) 

train.c1 = subset(train.df , outcome == 1) 
train.c0 = subset(train.df , outcome == 0) 

3)クリーンアップ

library(xgboost) 
library(readr) 
library(caret) 

2)。

train_xgb = xgb.DMatrix(data.matrix(train.df [,1:124]), label = train.raw[, "outcome"]) 
test_xgb = xgb.DMatrix(data.matrix(test.df[,1:124])) 

4)predicitions

pred_xgb <- predict(model_xgb, newdata = test_xgb) 

私の質問は作る)

model_xgb = xgboost(data = train_xgb, nrounds = 8, max_depth = 5, eta = .1, eval_metric = "logloss", objective = "binary:logistic", verbose = 5) 

5モデルを実行:私はちょうどに/調整引っ張ってるように、私はこのプロセスを調整することができますどのように1つの「トレーニング」データセット、クロスバリデーションされたファイルのホールドアウトセットの予測を得ることができますか?

+0

'nfold = 5'を追加して、5倍のCVを' xgboost'呼び出しに追加してみてください。また、より多くのラウンド、おそらく1000程度を指定する必要があります。もしそうすれば 'print_every_n = 100'は歓迎すべき引数です。一般的に、テストセットを指定すると、nfoldを指定すると検証が行われます。k-fold CVを実行します。 – missuse

+0

@missuse申し訳ありませんが、私の質問がはっきりしていないことに気付きました。私が理解しようとしているのは、訓練データだけを含む10倍のクロスバリデーションされたデータセットのホールドアウトセットを予測する方法です。 – 114

+0

Sry私は間違いを犯しました.k-fold CVを指定するには、 'xgb.cv'関数を呼び出す必要があります。ここでは 'prediction = TRUE'を指定することができ、それぞれの折り畳みの予測が得られます:' model $ pred' - 列車セットと同じ順序です。 Foldsは 'model $ folds'で指定されます。 xgb.cvより前の種を設定すると同じ折り目が選択されますが、同じモデルは複製されません。同じモデルを再現するには、 'xgb.cv'呼び出しの中で' seed'を設定する必要があります。 – missuse

答えて

0

xgb.cvを使用して、prediction = TRUEを設定できます。

+0

申し訳ありませんがこれを詳しく説明できますか? – 114

1

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グリッド検索で提供されるのと似ていますが、alphalambdacolsample_bylevelnum_parallel_tree ...グリッド検索のハイパーパラメータは、わかりにくいカスタム関数を定義しています。 Caretは自動前処理、CV内での自動アップ/ダウンサンプリングなどの利点を持っています

xgb.cvコールの外にあるシードを設定すると、CVでは同じフォールドが選択されますが、別のモデルでxgb.cv関数呼び出しの中にシードを設定しても、同じモデルになるという保証はありませんが、より多くのチャンスがあります(スレッド、モデルのタイプに依存します)。 - 不確実性のようなそれは結果にほとんど影響を与えない)。

+0

ハイパーパラメータを選択する機能は特に便利です。もっと簡単なことに、今は 'write.table(prob [、pred]、" file ")'のようなものをテーブルに出力します。write.table(xgboostModelCV $ pred) 'を同じエフェクト? – 114

+0

はい、試してみてください。混乱行列ROCを作成してカーブを持ち上げ、モデルの確率しきい値を決定することもできます(2クラス問題のモデル$ predは実際に特定のクラスになる確率を含みます)。これらの場合、 'xgb.DMatrix(data.matrix(train.df [、1:124])、label = train.raw [、" outcome "])のようにtrueの' label'を '' – missuse

+0

おかげでとても例えば: 'はwrite.table(mymodelという$ PRED [、C( "名前"、 "XGB")]、 " ファイル"、 9月= ""、 row.names = FALSE、 COL .names = c( "name"、 "outcome")) ' – 114