在 caret 包中使用 xgboost 模型时,每个 运行 的结果不同
diffrent result in every run when using xgboost model in caret package
我有不平衡的数据集(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)
问题是每次我 "run" 火车线路都会给出不同的 roc、敏感性和特异性。
ROC Sens Spec
0.696084 0.8947368 0.2736111
ROC Sens Spec
0.6655806 0.8917293 0.2444444
** expand.grid 设置在最佳调谐模型上。
有人知道为什么模型不稳定吗?
这是因为 xgboost 在选择分割特征时的随机性。
在您的实际训练代码之前添加以下行:
set.seed(100)
您可以使用任何整数代替 100。
这将为伪随机数生成器设置种子,然后每次生成完全相同的随机数序列。所以每次调用代码,结果都是一样的。
正如 Vivek Kumar 在他的回答中提到的,提升算法是随机算法。此外,您正在使用 trainControl
拆分数据集,这也引入了随机性来源。使用set.seed
固定初始随机性可以让你总是得到相同的结果,但它可能是幸运的(或不幸的),所以最好避免。
更好的方法是 运行 您的代码样本多次,例如 10 次,直到您有足够的信心 mean 多次随机初始化的性能是正确的。然后您可以报告这个平均值(理想情况下还有标准偏差)。在这种情况下,请 不要 使用 set.seed
否则你不会得到任何变化。
我有不平衡的数据集(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)
问题是每次我 "run" 火车线路都会给出不同的 roc、敏感性和特异性。
ROC Sens Spec
0.696084 0.8947368 0.2736111
ROC Sens Spec
0.6655806 0.8917293 0.2444444
** expand.grid 设置在最佳调谐模型上。
有人知道为什么模型不稳定吗?
这是因为 xgboost 在选择分割特征时的随机性。
在您的实际训练代码之前添加以下行:
set.seed(100)
您可以使用任何整数代替 100。
这将为伪随机数生成器设置种子,然后每次生成完全相同的随机数序列。所以每次调用代码,结果都是一样的。
正如 Vivek Kumar 在他的回答中提到的,提升算法是随机算法。此外,您正在使用 trainControl
拆分数据集,这也引入了随机性来源。使用set.seed
固定初始随机性可以让你总是得到相同的结果,但它可能是幸运的(或不幸的),所以最好避免。
更好的方法是 运行 您的代码样本多次,例如 10 次,直到您有足够的信心 mean 多次随机初始化的性能是正确的。然后您可以报告这个平均值(理想情况下还有标准偏差)。在这种情况下,请 不要 使用 set.seed
否则你不会得到任何变化。