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

oho*_*hoh 26 python classification machine-learning xgboost xgbclassifier

我已经使用 XGB 分类器训练了数据集,但在本地出现此错误。它在 Colab 上有效,而且我的朋友对相同的代码也没有任何问题。我不知道这个错误意味着什么...

Invalid classes inferred from unique values of y. Expected: [0 1 2 3 4 5], got [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)
Run Code Online (Sandbox Code Playgroud)

小智 44

发生这种情况是因为类列必须从 0 开始(自版本 1.3.2 以来要求如此)。解决这个问题的一个简单方法是使用sklearn.preprocssing 库中的LabelEncoder

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

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)


SOM*_*SAR 9

这是因为 y_train 在训练之前必须在更新的 XGBoost 模型中进行编码,即,您必须使用一些分类转换,例如标签编码器:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)
Run Code Online (Sandbox Code Playgroud)

然后应用到XGBoost模型中进行训练:

from xgboost import XGBClassifier
classifier = XGBClassifier()
classifier.fit(X = X_train,y =  y_train)
Run Code Online (Sandbox Code Playgroud)

在训练找出其混淆矩阵后,您必须对预测的 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)
Run Code Online (Sandbox Code Playgroud)


小智 2

新版本的xgboost出现该错误,卸载当前的Xgboost并安装xgboost 0.90

pip uninstall xgboost 

pip install xgboost==0.90
Run Code Online (Sandbox Code Playgroud)