修改LGBMClassifier的random_state后预测结果无变化如何解决
问题根源
- 核心原因是你当前使用的LGBM参数关闭了所有引入随机性的训练逻辑:你配置的
subsample=1.0(行采样比例为100%,无随机采样)、colsample_bytree=1.0(特征采样比例为100%,无随机采样)、subsample_freq=0(完全关闭bagging逻辑),训练过程没有任何随机步骤,修改random_state、bagging_seed自然不会对结果产生任何影响。 - 次要原因是参数设置存在冲突:你初始化Pipeline时给LGBM设置的
max_depth=20,但实际生效的参数中max_depth=50,需要确认是否有其他逻辑覆盖了你预期的参数配置。 - 若你调整了数据shuffle顺序仍无变化,也是因为上述参数关闭了随机逻辑,样本顺序不会影响确定性的树分裂结果。
解决方法
- 第一步:开启LGBM的随机训练逻辑,修改以下参数即可引入随机性:
- 将
subsample调整为小于1的值,比如0.8,代表每轮迭代随机选择80%的训练样本 - 将
colsample_bytree调整为小于1的值,比如0.8,代表每棵树训练时随机选择80%的特征 - 将
subsample_freq调整为大于等于1的值,比如1,代表每1轮迭代就执行一次样本采样
三个参数修改完成后,调整random_state或bagging_seed就会生成不同的训练结果。
- 将
- 第二步:如果Pipeline中的preprocessor包含随机性步骤(比如随机采样、随机降采样等),也要同步修改preprocessor对应的
random_state参数,避免preprocessor输出固定导致后续模型结果不变。 - 第三步:若担心Pipeline实例复用存在缓存问题,可以直接把Pipeline初始化逻辑放到for循环内部,每次循环新建一个实例,彻底排除历史训练结果的干扰。
修改后参考代码
states = [0,1,2,3] for state in states: train_temp = train.copy() # 每次循环新建Pipeline实例,避免缓存影响 t_clf = Pipeline(steps=[ ('preprocessor', preprocessor), ('lgbm', LGBMClassifier( class_weight="balanced", random_state=state, max_depth=20, min_child_samples=20, num_leaves=31, subsample=0.8, # 开启行随机采样 colsample_bytree=0.8, # 开启特征随机采样 subsample_freq=1 # 每轮迭代执行采样 )) ]) t_clf.fit(train_temp, train_temp['label']) pred_proba = t_clf.predict_proba(test) # 此时不同state对应的预测概率会产生差异
内容的提问来源于stack exchange,提问作者Jonesn11
相关产品推荐
相关产品推荐

