在为巨大问题实施XGboost时出现此错误
xgb.iter.update中的错误(bst $ handle,dtrain,iteration - 1,obj):
[03:26:03] amalgamation /../ src / objective / multiclass_obj.cc:75:检查 失败:label_error> = 0&& label_error< nclass SoftmaxMultiClassObj: label必须在[0,num_class),num_class = 2中,但在标签中找到2。
以下是我的代码:
#Parameter ie no of class
nc <- length(unique(train_label))
nc
xgb_params <- list("objective"="multi:softprob",
"eval_metric"="mlogloss",
"num_class"=nc)
watchlist <- list(train=train_matix,test=test_matix)
#XGB Model
bst_model <- xgb.train(params = xgb_params,data = train_matix, nrounds = 100,watchlist = watchlist)
我该如何解决这个问题?
答案 0 :(得分:0)
我猜你有多标签问题。
由于没有例子,我只能猜测你应该通过Python 3.6.4
>>> import xlrd
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
ModuleNotFoundError: No module named 'xlrd'
而不是nc。
祝你好运。
答案 1 :(得分:0)
我这样解决了。我的班级标签是-1、0和1。所以我的num_class = 3。为了与范围[0,3)兼容,我不得不将类标签加1。请注意,在此范围内3被排除,有效标签为0、1、2。因此,我转换后的类标签为0、1、2。
此外,我更改了用于多类分类的代码。
目标已更改为“ multi:softmax”,并添加了“ num_class”参数。
xgb1 = XGBClassifier(
learning_rate=0.1,
n_estimators=1000,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective='multi:softmax',
nthread=4,
scale_pos_weight=1,
seed=27,
num_class=3,
)
在modelfit()函数中,“ auc”被替换为“ merror”
def modelfit(alg, dtrain, predictors, useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
if useTrainCV:
xgb_param = alg.get_xgb_params()
#change the class labels
dtrain[target] = dtrain[target] + 1
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=xgb_param['n_estimators'], nfold=cv_folds,
metrics='merror', early_stopping_rounds=early_stopping_rounds)
alg.set_params(n_estimators=cvresult.shape[0])
print(cvresult.shape[0])
# Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain[target], eval_metric='merror')
# Predict training set:
dtrain_predictions = alg.predict(dtrain[predictors])
# Print model report:
print("\nModel Report")
print("Accuracy : %.4g" % metrics.accuracy_score(dtrain[target].values, dtrain_predictions))