我意识到,与scikit学习相反,为以下内容设置一个固定的值。random_state
并不能保证模型每次都能输出相同的结果。
因此,我无法从XGBoostRegressor中得到可重复的结果,即使通过设置 seed
, random_state
, colsample_bytree
和 subsample
.
这是一个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)
回答你的问题,轻微的差异可以用浮点求和顺序和多线程的非确定性来解释,但总体来说,梯度提升并不适合建立可重现的模型。你可以通过调整参数来控制很多随机性(例如设置random_state、seed、输入特征、模型参数以及我在上面评论中提出的建议),但总体来说,由于算法的工作方式,在建立模型时你会期待一些小的变化;尤其是当数据中的信号不强时。
作为参考,问题不在于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)