【问题标题】:diffrent result in every run when using xgboost model in caret package在 caret 包中使用 xgboost 模型时,每次运行都会产生不同的结果
【发布时间】:2017-09-09 09:58:02
【问题描述】:

我有不平衡的数据集(6% 肯定),我使用过 caret 包中的 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、sensetivity 和 specificity。

  ROC       Sens       Spec     
  0.696084  0.8947368  0.2736111

  ROC        Sens       Spec     
  0.6655806  0.8917293  0.2444444

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

有人明白为什么模型不稳定吗?

【问题讨论】:

    标签: r r-caret xgboost roc


    【解决方案1】:

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

    更好的方法是多次运行您的代码示例,例如 10 次,直到您有足够的信心确定多次随机初始化的 mean 性能是正确的。然后您可以报告这个平均值(理想情况下也可以报告标准偏差)。在这种情况下,请不要使用set.seed,否则不会有任何变化。

    【讨论】:

    • 我已经做了 10 倍交叉验证,你是说我需要用 k 重复做 10 倍吗?如果是这样,最好的数字是多少?我听说 5x2 很不错。
    • @Ella 是的,实际上您应该始终使用不同的拆分重复交叉验证
    • 所以将交叉验证调整为 5x2 是否适合 Inhofe?
    • 不确定 5x2 到底是什么,但总是越多越好。
    • @ella 现在您正在尝试进行重复,使用交叉验证进行尽可能多的重复,但此时不要使用set.seed()。 :)
    【解决方案2】:

    这是因为 xgboost 在选择要拆分的特征时具有随机性。

    在您的实际训练代码之前添加以下行:

    set.seed(100)
    

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

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

    【讨论】:

    • 是的,但是请记住,如果您的总样本数量很少,并且您尝试预测的事件很小,那么结果可能会非常具有误导性。对于给定的未来预测,您获得的任何一组结果都可能是最好的结果,但不是所有未来预测。与 6% 的目标类保持一致的最佳方法是进行大量的整体预测,以便您针对模型已经看到超过 3 或 4 次的内容进行训练。
    • @bethanyP 这句话“有很多总体预测”是什么意思……你能详细说明一下吗?
    • 那是糟糕的英语,我很着急。道歉对不起,..我在出门的路上很快就回答了!
    • @bethanyP 我有 2018 年的观察结果,其中 6% 为阳性。一点也不多。
    • 很大程度上取决于模型的复杂性、变量的数量、它们解释了多少可变性以及调整它的程度。你只需要尽力而为。
    猜你喜欢
    • 2012-05-02
    • 2016-11-20
    • 2016-07-31
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多