1

我为我的分类问题训练了一个 XGBClassifier,并使用 optuna 对巨大的网格进行了超参数调整(可能调整了每个可能的参数)。在测试时,random_state 的变化会改变模型性能指标(roc_auc/recall/precision)、feature_importance 甚至模型预测(predict_prob)。

  1. 这告诉我关于我的数据的什么信息?

由于我必须在生产中使用这个模型,我应该如何解决这个问题以使模型更健壮?

  1. 使用我们在 cross_validation 期间使用的一个 random_state(例如默认值 0)并在样本外使用它。
  2. 在 cross_validation 期间,在每个 param_combination 之上,运行一些 random_state(比如 10)并获取 avg 模型性能。
4

3 回答 3

1

我倾向于认为,如果模型对随机种子敏感,它就不是一个很好的模型。使用 XGB 可以尝试添加更多估算器 - 这有助于使其更加稳定。

对于具有随机种子的任何模型,对于每个候选参数选项集(通常已经过滤到候选候选名单),我倾向于对不同随机种子的相同数据运行一堆重复并测量输出的差异。我希望评估指标的标准差很小(相对于均值),并且每个类中预测的重叠度非常高。如果其中任何一个都不是我不接受该模型的情况。如果是这种情况,我只是随机选择一个候选模型——随机种子是什么并不重要!

我仍然记录使用的随机种子 - 这仍然需要重新创建结果!

于 2019-12-13T10:52:43.877 回答
1

这是我的两分钱。对答案持保留态度。

XGB 分类器是一种提升算法,它自然依赖于随机性(例如随机森林也是如此)。因此,改变种子本质上会改变模型的训练及其输出。
不同的种子也会改变 CV 分裂并进一步改变结果。

此外,boosting 旨在减少方差,因为它使用多个模型(bagging),同时它减少了偏差,因为它根据先前模型的错误(boosting 部分)训练每个后续模型。然而,Boosting 模型原则上可能会过拟合。
事实上,如果您的基础学习器不弱,它很容易过度拟合数据,并且不会有任何残差或错误可供后续模型构建。

现在,对于您的问题,您应该首先验证您的模型没有过度拟合数据。

然后您可能想要修复一定数量的种子(您仍然希望能够重现结果,因此修复它们很重要)并平均所有种子获得的结果。

于 2019-12-13T10:40:08.037 回答
0

每次运行模型时,random_state 参数都有助于复制结果。由于您使用的是 cross_validation,假设它是 k-fold,那么您的所有数据都将进入训练和测试,并且 CV 分数无论如何都是您决定的折叠数的平均值。我相信您可以设置任何 random_state 并引用 CV 的结果。

于 2019-12-13T08:50:25.650 回答