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

LightGBM分类器训练不平衡数据时预测全为1的问题求助

解决LightGBM在不平衡数据集上全预测多数类的问题

针对你遇到的模型全输出类别1的问题,核心原因是数据集极度不平衡(类别1占比~92%),加上参数设置和特征处理不到位,导致模型偏向多数类。以下是具体的解决思路和调整方案:

1. 必须显式处理分类特征

你有17个分类特征,但当前代码未对其做任何特殊处理。LightGBM不会自动识别分类特征,会默认将其当作数值特征处理,这会丢失分类特征的类别信息,让模型更难捕捉少数类的模式。

解决方法:

  • 在fit方法中通过categorical_feature参数指定分类特征的列名或索引,例如:
    # 假设你的分类特征是前17列,替换为实际的列名/索引列表
    categorical_features = list(range(17))
    model.fit(..., categorical_feature=categorical_features)
    
  • 或者提前将分类特征转换为pandas的category类型:
    X_train[categorical_cols] = X_train[categorical_cols].astype('category')
    X_valid[categorical_cols] = X_valid[categorical_cols].astype('category')
    

2. 调整模型参数,弱化多数类偏见

(1)降低min_child_samples

你设置的min_child_samples=1000过大——少数类样本总共才2898个,这意味着模型的叶子节点很难包含足够的少数类样本,自然学不到区分少数类的规则。建议将其调整为200-300,让模型能够捕捉到少数类的局部模式。

(2)修正参数名错误

注意LGBMClassifier的参数名和原生LightGBM略有差异:

  • 迭代次数参数是n_estimators,不是num_iterations;
  • 早停轮数参数是early_stopping_rounds,不是early_stopping_round。
    你原来的参数名错误可能导致早停逻辑未生效,模型一直迭代到500轮但始终偏向多数类。

(3)优化权重与学习率

  • 可以替换is_unbalance=True为class_weight='balanced',让模型自动根据样本比例计算类别权重,对少数类给予更高权重;
  • 原learning_rate=0.01过小,结合n_estimators=500会导致模型学习步长不足,建议调大学习率到0.1,同时将n_estimators提升到1000,让模型有足够的学习空间。

3. 改用不平衡数据友好的评估指标

默认的binary_logloss指标对不平衡数据不敏感,模型可能在降低多数类损失的同时完全忽略少数类。建议添加针对少数类的评估指标,让训练过程更关注少数类的表现:

在参数中加入:

eval_metric=['auc', 'recall', 'binary_logloss']

并在fit时开启verbose,实时监控这些指标的变化,确保模型在验证集上的召回率(针对少数类)稳步提升。

4. 调整早停逻辑

将早停的监控指标改为recall(少数类召回率),避免模型因多数类损失降低而提前停止:

model.fit(..., early_stopping_rounds=30, eval_metric='recall')

修改后的完整示例代码

import lightgbm as lgbm

# 假设分类特征为前17列,替换为实际列名/索引
categorical_cols = list(range(17))

params_dict = dict(
    objective="binary",
    early_stopping_rounds=30,
    num_threads=-1,
    learning_rate=0.1,
    verbosity=1,
    class_weight='balanced',
    max_depth=10,  # 原15过深,易过拟合,适当降低
    num_leaves=60,  # 遵循num_leaves ≤ 2^max_depth的原则
    n_estimators=1000,
    min_child_samples=200,
    eval_metric=['auc', 'recall']
)

model = lgbm.LGBMClassifier(**params_dict)
model.fit(
    X=X_train, y=y_train,
    eval_set=[(X_valid, y_valid)],
    categorical_feature=categorical_cols,
    verbose=10  # 每10轮打印一次评估结果
)

内容的提问来源于stack exchange,提问作者Ayan Biswas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:55:21