多标签数据集上的 XGBoost 出现 ValueError:预期类别 0-8,实际为 0-9

问题描述 投票:0回答:1

在多标签数据集上运行 XGBoost 模型时,我遇到了

ValueError
。错误消息为: ValueError: 预期的类标签 {0,1,2,3,4,5,6,7,8},得到 {0,1,3,4,5,6,7,8,9}

我的数据集由 500 个实例组成,标签范围从 0 到 9,总共有 10 个类。少数类(标签

9
)有 37 个实例。尽管如此,我还是收到一条错误,指示意外的类标签
9

我已经尝试使用不同的值进行交叉验证(3、5 和 10),但没有成功。有趣的是,来自

sklearn
的其他模型,例如随机森林和 AdaBoost,不会产生此错误并按预期工作。

有没有人在 XGBoost 上遇到过类似的问题或者可以找出导致此错误的可能原因?任何有关如何解决此问题的见解或建议将不胜感激。

将 xgboost 导入为 xgb 从 sklearn.model_selection 导入 train_test_split 从 sklearn.metrics 导入 precision_score

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 42)

模型 = xgb.XGBClassifier() model.fit(X_train, y_train)

y_pred = model.predict(X_test) 打印(准确度分数(y_test,y_pred))

python xgboost multilabel-classification
1个回答
0
投票

我要检查两件事:

  1. XGBoost 要求类标签从 0 开始,一直到
    n_classes - 1

y
符合这个格式吗?尝试
print(np.unique(y))
检查您是否获得
[0, 1, 2, ..., n_classes -1]

  1. 相对较小的数据集大小,加上指定测试大小为 0.2,意味着不常见的标签可能不会出现在测试集中。

要强制从两个拆分中的所有标签进行采样,请尝试将代码修改为

... = train_test_split(..., stratify=y)
。一切都和以前一样,但是这次确保测试分割的标签分布接近原始,因此不会丢失任何标签。

我认为即使你没有得到错误(特别是当存在不平衡时),分层也是一个好主意,因为它使测试分割的分布代表原始数据集,而不是具有被随机采样过程扭曲的分布.

© www.soinside.com 2019 - 2024. All rights reserved.