2017-06-16 17 views
2

私は、現在、それを取り巻く非常に厳しい機密保持契約のために私のデータを共有することができないと言って質問します。まもなく私は盲目的なデータをすぐに共有する許可を得ることができます。XGBoost(CV)CVテストとトレーニングエラー

私はガイドhereに従っており、nroundsパラメータをチューニングしてステップ1で立ち往生していますが、Rで適切に訓練されたXGBoostを取得するのに苦労しています。私が十字架の検証から得ている結果は、私が彼らがどこに行くべきかということで私を去らせることを期待していることをしていないということです。

私のデータには、連続的な応答変数(下のリンクの画像の左上の枠内のヒストグラム)と16095個の予測変数が含まれています。すべてのプレディクタは同じスケールにあり、それらのヒストグラムはすべて下のリンクの画像の右上に表示されます。予測変数は全くゼロであり、すべての値の62.82%が0である。

別のセットのテストデータとして、さらに48の観測値がある。両方のデータセットは、応答変数に非常に類似した範囲を持っています。

enter image description here

は、これまでのところ私は、PLSモデルとランダムフォレスト(Rライブラリレンジャーを使用して)をフィットすることができました。これら2つのモデルをテストデータセットに適用すると、PLSから19.133、レンジャーから15.312のRMSEを予測して取得することができました。レンジャーの場合、連続したモデルの適合は、2000個の木とそれぞれの分割された760個の変数を使用して非常に安定していることが証明されています。

XGBoostに戻って、以下のコードを使用して、nroundsを除くすべてのパラメータを修正し、Rパッケージxgboostのxgb.cv関数を使用してトレーニングとテストのエラーを計算しました。

data.train<-read.csv("../Data/Data_Train.csv") 
data.test<-read.csv("../Data/Data_Test.csv") 

dtrain <- xgb.DMatrix(data = as.matrix(data.train[,-c(1)]), 
label=data.train[,1]) 
# dtest <- xgb.DMatrix(data = as.matrix(data.test[,-c(1)]), label=data.test[,1]) # Not used here 

## Step 1 - tune number of trees using CV function 

    eta = 0.1; gamma = 0; max_depth = 15; 
    min_child_weight = 1; subsample = 0.8; colsample_bytree = 0.8 
    nround=2000 
    cv <- xgb.cv(
    params = list(
     ## General Parameters 
     booster = "gbtree", # Default 
     silent = 0, # Default 

     ## Tree Booster Parameters 
     eta = eta, 
     gamma = gamma, 
     max_depth = max_depth, 
     min_child_weight = min_child_weight, 
     subsample = subsample, 
     colsample_bytree = colsample_bytree, 
     num_parallel_tree = 1, # Default 

     ## Linear Booster Parameters 
     lambda = 1, # Default 
     lambda_bias = 0, # Default 
     alpha = 0, # Default 

     ## Task Parameters 
     objective = "reg:linear", # Default 
     base_score = 0.5, # Default 
     # eval_metric = , # Evaluation metric, set based on objective 
     nthread = 60 
    ), 
    data = dtrain, 
    nround = nround, 
    nfold = 5, 
    stratified = TRUE, 
    prediction = TRUE, 
    showsd = TRUE, 
    # early_stopping_rounds = 20, 
    # maximize = FALSE, 
    verbose = 1 
) 

library(ggplot) 
plot.df<-data.frame(NRound=as.matrix(cv$evaluation_log)[,1], Train=as.matrix(cv$evaluation_log)[,2], Test=as.matrix(cv$evaluation_log)[,4]) 
library(reshape2) 
plot.df<-melt(plot.df, measure.vars=2:3) 
ggplot(data=plot.df, aes(x=NRound, y=value, colour=variable)) + geom_line() + ylab("Mean RMSE") 

この機能は、私はそれが私が高原に訓練誤差が減少し、その後減少モデルoverfitsとして再び増加し始めるためのテストエラーを見て期待していたんです信じるものない場合。しかし、私が得ている出力は下のコード(そして上のリンクの下の図)のようになります。

##### xgb.cv 5-folds 
    iter train_rmse_mean train_rmse_std test_rmse_mean test_rmse_std 
     1  94.4494006 1.158343e+00  94.55660  4.811360 
     2  85.5397674 1.066793e+00  85.87072  4.993996 
     3  77.6640230 1.123486e+00  78.21395  4.966525 
     4  70.3846390 1.118935e+00  71.18708  4.759893 
     5  63.7045868 9.555162e-01  64.75839  4.668103 
---                 
    1996  0.0002458 8.158431e-06  18.63128  2.014352 
    1997  0.0002458 8.158431e-06  18.63128  2.014352 
    1998  0.0002458 8.158431e-06  18.63128  2.014352 
    1999  0.0002458 8.158431e-06  18.63128  2.014352 
    2000  0.0002458 8.158431e-06  18.63128  2.014352 

私は愚かな何かをやってXGBoostは苦労させてることを信じるように傾いているどれだけうまくレンジャー作品考慮!チューニングするに

おかげ

答えて

0

あなたがtuneParamsを使用することができ、あなたのパラメーター。ここに例があります

task = makeClassifTask(id = id, data = "your data", target = "the name of the column in your data of the y variable") 

    # Define the search space 
    tuning_options <- makeParamSet(          
    makeNumericParam("eta",    lower = 0.1,   upper = 0.4), 
    makeNumericParam("colsample_bytree", lower = 0.5,   upper = 1), 
    makeNumericParam("subsample",  lower = 0.5,   upper = 1), 
    makeNumericParam("min_child_weight", lower = 3,   upper = 10),  
    makeNumericParam("gamma",   lower = 0,   upper = 10), 
    makeNumericParam("lambda",   lower = 0,   upper = 5), 
    makeNumericParam("alpha",   lower = 0,   upper = 5), 
    makeIntegerParam("max_depth",  lower = 1,   upper = 10), 
    makeIntegerParam("nrounds",   lower = 50,   upper = 300)) 

ctrl = makeTuneControlRandom(maxit = 50L) 
    rdesc = makeResampleDesc("CV", iters = 3L) 
    learner = makeLearner("classif.xgboost", predict.type = "response",par.vals = best_param) 

res = tuneParams(learner = learner,task = task, resampling = rdesc, 
        par.set = tuning_options, control = ctrl,measures = acc) 

もちろん、パラメータの間隔で遊ぶことができます。最後にresにはxgboostの最適なパラメータセットが含まれており、このパラメータを使用してxgboostをトレーニングすることができます。あなたは離れてクロスバリデーションから除いた他の方法を選択することができますに注意してください、私はそれが便利な

+0

、感謝役に立てば幸い?makeResampleDesc

を試してみてください。私はパラメータの最適化のためにガウスプロセス(ライブラリrBayesianOptimization)を使用することを計画しましたが、続行するかどうかはわかりませんでした。私のテスト/訓練の誤りが、あるラウンドの後に通常の過パターンのパターンを示すようには見えなかったという事実は、より深刻なものが間違っていたと私に思った。 –