未设置随机种子时XGBoost(1.7.4)为何仍具确定性?
XGBoost 1.7.4无随机状态却结果一致的原因
子采样默认全量使用,无随机逻辑:XGBoost中
subsample(样本子采样)、colsample_bytree(特征子采样)这类核心随机采样参数的默认值都是1.0,意味着训练时会用到全部样本和特征,完全没触发随机采样流程。只有将这些参数设置为小于1的值(比如subsample=0.8),才会在每次训练时随机挑选部分样本/特征,结果才会产生差异。默认树构建过程是确定的:XGBoost默认的
tree_method参数值为auto,多数场景下会选用精确或近似树构建算法,这些算法在默认配置下没有任何随机分支选择逻辑。只有当你开启子采样,或配置sampling_method这类触发随机的参数时,才会引入随机性。对SGD的误解:你提到的随机梯度下降(SGD),XGBoost默认采用的是梯度提升树(GBRT)框架,并非传统的SGD。只有当你指定
booster='gblinear'(线性 booster),并配置SGD相关的更新器时,才会涉及SGD的随机步骤;默认的树模型训练流程和SGD的随机性无关。随机状态参数仅在有随机操作时生效:
seed或random_state参数的作用是固定随机操作的种子,但如果训练过程中根本没有任何随机步骤(比如所有采样参数都是默认值),那不管设不设这个参数,训练过程都是完全确定的,结果自然完全一致。
你可以做个验证测试:把subsample设为0.7,不设置seed,多次训练后结果会出现差异;此时再设置seed=42,每次训练的结果就会固定下来。
内容的提问来源于stack exchange,提问作者rtgguy
相关产品推荐
相关产品推荐

