Sklearn StackingRegressor设置相同random_state后预测结果不可复现
StackingRegressor训练结果不可复现原因及解决方案
导致每次运行预测结果不一致的原因主要有3个:
- 多线程并行的计算不确定性
你所有模型都设置了n_jobs=-1开启多线程训练,XGBoost、LightGBM、随机森林在多线程模式下,不同线程的计算完成顺序不固定,浮点运算的累加顺序差异会产生微小误差,经过多轮树迭代累计后,最终会产生可观测的结果差异。如果需要完全复现,可将所有模型的n_jobs参数设置为1关闭并行。 - 交叉验证拆分未显式固定随机状态
你传入了cv=5使用默认的交叉验证拆分逻辑,回归场景下默认使用无shuffle的KFold,但如果数据顺序存在变动、或是scikit-learn版本默认逻辑有差异,会导致元特征生成过程不一致。可以显式传入固定随机种子的CV拆分器,示例如下:
from sklearn.model_selection import KFold stacked_mdl = StackingRegressor( estimators=base_estimators, final_estimator=final_estimator, cv=KFold(n_splits=5, shuffle=False, random_state=random_seed), passthrough=True )
- 缺少全局随机种子及框架确定性配置
除了每个模型单独设置的random_state,你还需要在代码入口处设置全局随机种子,同时开启对应框架的确定性训练开关,避免底层依赖全局随机状态的逻辑产生波动:
import numpy as np import random import os random_seed = 42 # 全局随机种子设置 random.seed(random_seed) np.random.seed(random_seed) # LightGBM确定性训练开关 os.environ['LIGHTGBM_DETERMINISTIC'] = '1' # XGBoost确定性训练可额外添加参数 deterministic_histogram=True
内容的提问来源于stack exchange,提问作者Nimar
相关产品推荐
相关产品推荐

