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

LGBMClassifier训练多分类模型时能否使用-1、0、1作为类别标签?

解决LGBMClassifier多分类标签非连续整数的问题

首先明确说:多分类任务完全不需要强制使用0、1、2这类连续整数作为标签,LightGBM是支持自定义类别标签的,你遇到的错误只是因为默认配置下模型期望标签是从0开始的连续索引而已。

错误原因

默认情况下,LGBMClassifier会自动推断类别标签的范围,它期望标签是从0开始的连续整数(比如3分类就是0、1、2),所以当你的标签里出现-1时,就会触发Label must be in [0, 3), but found -1 in label这个错误。

解决方案

你只需要在模型的参数里明确指定类别数量和你的原始标签列表,就能解决这个问题。以下是可行的配置代码:

import lightgbm as lgb
import numpy as np

# 定义包含自定义标签的参数字典
hyperparameter_dictionary = {
    'task': 'train',
    'boosting_type': 'gbdt',
    'objective': 'multiclass',
    'metric': 'multi_logloss',
    'num_leaves': 100,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.9,
    'bagging_freq': 0,
    'verbose': -1,
    'num_class': 3,  # 指定总类别数
    'classes': [-1, 0, 1]  # 明确告诉模型你的原始标签集合
}

# 初始化模型并训练
model = lgb.LGBMClassifier(**hyperparameter_dictionary)
model.fit(X, y)

重要注意事项

训练完成后,调用model.predict()时,输出的会是每个样本对应各个类别的概率向量(长度等于类别数)。如果你用np.argmax()取概率最高的类别,得到的结果会是0、1、2这类索引值(对应classes参数里标签的顺序),这时候需要把它转换回你的原始标签:

# 示例:将预测的索引转换为原始标签
original_classes = [-1, 0, 1]
# 获取概率向量并取最大概率的索引
predicted_indices = np.argmax(model.predict(X_test), axis=1)
# 映射回原始标签
predicted_labels = [original_classes[idx] for idx in predicted_indices]

内容的提问来源于stack exchange,提问作者Bernard Esterhuyse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:43:12