从`y`的唯一值推断出的无效类别。期望值为:[0 1 2 3 4 5],实际值为:[1 2 3 4 5 6]。

26

我使用了XGB分类器训练数据集,但本地出现了错误。在Colab上它可以正常工作,而且我的朋友们用同样的代码也没有任何问题。

从y的唯一值推断无效的类。期望:[0 1 2 3 4 5],得到:[1 2 3 4 5 6]

这是我的代码,但我猜这不是原因。

start_time = time.time()
xgb = XGBClassifier(n_estimators = 400, learning_rate = 0.1, max_depth = 3)
xgb.fit(X_train.values, y_train)
print('Fit time : ', time.time() - start_time)

你是如何创建y_train和y_test向量的?看起来它们中的一个从1开始编号,而另一个从0开始。 - user2261062
您还可以将变量转换为一种独热编码表示形式。 - Daniel González Cortés
8个回答

42

这是因为类别列必须从0开始(自1.3.2版本以来要求如此)。解决方法是使用sklearn.preprocssing库中的LabelEncoder,这很容易实现。

解决方案(适用于1.6版本):

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)

然后再次尝试/运行您的代码:

start_time = time.time()
xgb = XGBClassifier(n_estimators = 400, learning_rate = 0.1, max_depth = 3)
xgb.fit(X_train.values, y_train)
print('Fit time : ', time.time() - start_time)

9

这是因为在训练新版本的XGBoost模型之前,y_train必须进行编码,也就是说,你必须使用一些分类转换方法,如标签编码器:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)

然后将其应用于XGBoost模型进行训练:
from xgboost import XGBClassifier
classifier = XGBClassifier()
classifier.fit(X = X_train,y =  y_train)

训练后,为了找出混淆矩阵,您必须反转预测的y值,如下所示:
from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = classifier.predict(X_test)
y_pred = le.inverse_transform(y_pred)
cm = confusion_matrix(y_test, y_pred)
print(cm)
accuracy_score(y_test, y_pred)

4
试着在 train_test_split 代码中添加 stratify 参数:
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=test_size, stratify = labels)

这不是问题。使用LabelEncoder可以正常工作。 - undefined

2

降级到1.5.0版本对我有效。

在执行过程中,我也收到了此警告消息。

用户警告:在XGBClassifier中使用标签编码器已被弃用,并将在将来的版本中删除。

使用1.6中的Label编码器会为我返回此错误:

MultiClassEvaluation:标签必须在[0,num_class)范围内,num_class=6但在标签中找到6。


2

这个错误是由于新版本的xgboost引起的,需要卸载当前的xgboost并安装xgboost 0.90。

pip uninstall xgboost 

pip install xgboost==0.90

1
如果有帮助的话,我刚刚回滚到了1.2.1版本。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0
请使用与Colab中相同的Python版本3.7。

0
这是因为您的xgboost版本问题,所以:
尝试这个:
y_train_xgb = y_train.map({"1": 0, "2": 1, "3": 2}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接