caret包中使用xgboost模型时每次运行结果不同

3

我有一个不平衡的数据集(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、灵敏度和特异性。

  ROC       Sens       Spec     
  0.696084  0.8947368  0.2736111

  ROC        Sens       Spec     
  0.6655806  0.8917293  0.2444444

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

有人知道为什么模型不稳定吗?

2个回答

3
如Vivek Kumar在回答中提到的,增强算法是随机算法。此外,您正在使用trainControl分割数据集,这也引入了一种随机性来源。使用set.seed修复初始随机性允许您始终获得相同的结果,但可能是一个幸运(或不幸)的结果,因此最好避免使用。
更好的方法是多次运行代码示例,例如10次,直到您有足够的信心多个随机初始化的平均性能是正确的。然后,您可以报告这个平均值(和理想情况下的标准差)。在这种情况下,不要使用set.seed,否则您将不会得到任何变化。

它已经在进行10倍交叉验证,你是说我需要进行带有k重复的10倍交叉验证吗?如果是这样,最好的数字是多少?我听说5x2非常不错。 - user7307305
@Ella 是的,实际上你应该总是使用不同的拆分来重复交叉验证。 - Calimo
将交叉验证调整为5x2好不好,Inhofe? - user7307305
不确定5x2确切的含义,但是越多越好。 - Calimo
1
@ella 现在你正在尝试重复操作,可以使用交叉验证进行多次重复,但是此时不要使用 set.seed()。 :) - Vivek Kumar
显示剩余2条评论

0
这是由于xgboost在选择分裂特征时存在随机性。
在实际训练代码之前添加以下行:
set.seed(100)

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

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


2
是的,但要记住,如果您拥有少量总样本,并且您试图预测的事件很小,则结果可能非常误导人。您获得的任何一组结果都可能是给定未来预测的最佳结果之一,但并非所有未来预测的最佳结果。成为目标类别6%的一致性最好的方法是具有大量的整体预测,以便您正在训练模型已经多次看到的内容。 - sconfluentus
@bethanyP,你说的“有很多总体预测”是什么意思?能详细说明一下吗? - user7307305
1
如果你有大量的观察数据(而不是预测数据),那么即使只有6%的数据,也可以让你的模型有很多机会去评估这些目标观察数据,并增加你的模型适当地为它们进行预测的几率。非常抱歉,我之前匆忙回答了你的问题,如有冒犯请谅解! - sconfluentus
@bethanyP,我有2018次观察,其中6%是积极的。这并不多。 - user7307305
很多事情都取决于模型的复杂性、变量数量、它们解释的可变性以及你调整得有多好。你只需要尽力而为。 - sconfluentus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接