You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 00:33:03