如何从XGBoostRegressor获得可重复的结果? random_state没有效果

问题描述 投票:-1回答:1

我意识到,与scikit学习相反,为以下内容设置一个固定的值。random_state 并不能保证模型每次都能输出相同的结果。

因此,我无法从XGBoostRegressor中得到可重复的结果,即使通过设置 seed, random_state, colsample_bytreesubsample.

这是一个bug吗?这是不是某种程度上的设计?如果是,为什么?

如果你有解决方法或一直有效的变通方法,请分享。

下面是代码。

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)
python-3.x machine-learning xgboost
1个回答
0
投票

回答你的问题,轻微的差异可以用浮点求和顺序和多线程的非确定性来解释,但总体来说,梯度提升并不适合建立可重现的模型。你可以通过调整参数来控制很多随机性(例如设置random_state、seed、输入特征、模型参数以及我在上面评论中提出的建议),但总体来说,由于算法的工作方式,在建立模型时你会期待一些小的变化;尤其是当数据中的信号不强时。


0
投票

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

我是用 train_test_split 不设置 random_state,造成一些随机性。

修正如下。

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)
© www.soinside.com 2019 - 2024. All rights reserved.