【问题标题】:How to get reproducible results from XGBoostRegressor? random_state has no effect如何从 XGBoostRegressor 获得可重现的结果? random_state 没有效果
【发布时间】:2020-08-29 00:31:39
【问题描述】:

我意识到,与 scikit learn 不同,为random_state 设置一个固定值并不能保证模型每次都会输出相同的结果。

因此,即使通过设置 seedrandom_statecolsample_bytreesubsample,我也无法从 XGBoostRegressor 获得可重现的结果。

这是一个错误吗?这有点设计吗?如果是这样,为什么?

如果您有始终有效的解决方案或变通方法,请分享。

代码如下:

model = XGBRegressor(n_estimators=1000, learning_rate=0.05,
                     subsample=0.8, colsample_bytree= 0.8, seed=42)

model.fit(X_train_trf,y_train,
        early_stopping_rounds=5,
        eval_set=[(X_train_trf, y_train), (X_valid_trf, y_valid)],
        verbose=False)
preds = model.predict(X_valid_trf)

【问题讨论】:

  • 这是一个“提前停止”的问题吗?如果您发布一个可重现的最小示例,我们可以帮助您解决问题。
  • 好的,我今天加一下
  • 或者你能给我一个可重现的 XGBoost 模型的代码示例吗?
  • subsamplecolsample_bytree 更改为 '1' 并将 early_stopping_rounds 增加到 '1000' (或任何 n_estimators 设置)应该可以解决问题 - 让我知道这是否可以解决您的问题与否。
  • 您的结果有何不同?细微的差异可以通过浮点求和顺序和多线程的不确定性来解释,但整体梯度提升并不能真正让您以可重复的方式构建模型。您可以通过调整参数来控制很多随机性(例如我上面提出的建议),但总的来说,如果数据中的信号不强,您预计最终模型会出现一些变化。抱歉,我对此无能为力 - 根据我自己的经验,每次使用概述的方法时,我都会得到相同的模型 -> 我想这取决于你正在分析的数据

标签: python-3.x machine-learning xgboost


【解决方案1】:

作为参考,问题不在于 XGBoost,而在于数据拆分。

我在没有设置random_state 的情况下使用train_test_split 拆分数据,这导致了一些随机性。

固定如下:

X_train_full, X_valid_full, y_train, y_valid = train_test_split(X_full, y,
  train_size=0.8, test_size = 0.2, random_state=1)

【讨论】:

    【解决方案2】:

    在回答您的问题时,浮点求和顺序和多线程的不确定性可以解释细微的差异,但整体梯度提升并不真正适合可重复地构建模型。您可以通过调整参数(例如设置 random_state、种子、输入特征、模型参数以及我在上面的 cmets 中提出的建议)来控制很多随机性,但总体而言,由于算法有效;尤其是在数据中的信号不强的情况下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2019-12-06
      • 2016-11-12
      • 2015-12-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多