在插入符号包中使用xgboost模型时,每次运行都会产生不同的结果

时间:2017-04-13 10:16:49

标签: r r-caret xgboost roc

我有不平衡的数据集(6%为正),我使用了来自插入包的xgboost模型。

这是我的代码:

gbmGrid <- expand.grid(nrounds = 50,
                       eta = 0.4,
                       max_depth = 2,
                       gamma = 0,
                       colsample_bytree=0.8,
                       min_child_weight=1,
                       subsample=1)

ctrl <- trainControl(method = "cv",
                     number = 10,
                     search = "grid", 
                     fixedWindow = TRUE,
                     verboseIter = TRUE,
                     returnData = TRUE,
                     returnResamp = "final",
                     savePredictions = "all",
                     classProbs = TRUE,
                     summaryFunction = twoClassSummary,
                     sampling = "smote",
                     selectionFunction = "best",
                     trim = FALSE,
                     allowParallel = TRUE)

classifier <- train(x = training_set[,-1],y = training_set[,1], method = 'xgbTree',metric = "ROC",trControl = ctrl,tuneGrid = gbmGrid)

问题在于,每当我“运行”火车线路时,它就会产生不同的roc,灵敏度和特异性。

  ROC       Sens       Spec     
  0.696084  0.8947368  0.2736111

  ROC        Sens       Spec     
  0.6655806  0.8917293  0.2444444

** expand.grid设置在最佳调整模型上。

有人理解为什么模型不稳定吗?

2 个答案:

答案 0 :(得分:1)

正如Vivek Kumar在他的回答中提到的,提升算法是随机算法。此外,您将数据集与trainControl分开,这也引入了随机源。使用set.seed来修复初始随机性可以让你总是获得相同的结果,但它可能是一个幸运(或不幸),所以最好避免。

更好的方法是多次运行代码示例,例如10次,直到您对多个随机初始化的平均性能正确无误。然后,您可以报告此平均值(理想情况下也是标准偏差)。在这种情况下,请使用set.seed,否则您将无法获得任何变体。

答案 1 :(得分:0)

这是因为选择xgboost拆分功能的随机性。

在实际培训代码之前添加以下行:

set.seed(100)

您可以使用任何整数代替100。

这将为伪随机数生成器设置种子,然后每次生成完全相同的随机数序列。因此,每次调用代码时,结果都是相同的。