Как использовать мультиклассовую классификацию XGBoost softprob, чтобы я не получил ошибку для num_class? - PullRequest
0 голосов
/ 03 октября 2018

Ниже приведен мой код перед настройкой гиперпараметра.Я пролил свои данные в тест и обучил, используя разделение ограничений:

class_label=repair['PART_NO']
x=repair.drop('PART_NO',1)

X_train, X_test, y_train, y_test=cross_validation.train_test_split(x,class_label, train_size = 0.80)

def modelfit(alg, X_train, y_train ,useTrainCV=True, cv_folds=5,early_stopping_rounds=50):

if useTrainCV:
    xgb_param = alg.get_xgb_params()
    xgtrain = xgb.DMatrix(X_train, label=y_train)
    extra = {'num_class': 2182}
    xgb_param.update(extra)
    cvresult = xgb.cv(xgb_param, 
                      xgtrain, 
                      num_boost_round=alg.get_params()['n_estimators'], 
                      nfold=cv_folds,
                      stratified=True,
                      metrics={'merror'},
                      early_stopping_rounds=early_stopping_rounds,
                      seed=0,
                      callbacks=[xgb.callback.print_evaluation(show_stdv=False)]),
    print cvresult
    alg.set_params(n_estimators=cvresult.shape[0])


#Fit the algorithm on the data
alg.fit(X_train, y_train,eval_metric='merror')

#Predict training set:
dtrain_predictions = alg.predict(X_test)
dtrain_predprob = alg.predict_proba(X_test)

#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score( dtrain_predictions,y_test)
print "Merror Score (Train): %f" % metrics.merror_score( dtrain_predprob,y_test)

feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')

После этого я пытаюсь выбрать все предикторы, кроме цели, и получить количество оценок, как показано ниже:

xgb1 = XGBClassifier(
learning_rate =0.1,
n_estimators=280,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8, 
colsample_bytree=0.8,
objective= 'multi:softprob',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb1, X_train, y_train)

Однако при этом я получаю следующую ошибку, хотя я упоминал num_class в моем xgb_params и мой y_train имеет тип int.Подскажите пожалуйста что делать?Точная ошибка указана ниже:

--------------------------------------------------------------------------- Трассировка XGBoostError (последний вызов был последним) в() 12 scale_pos_weight = 1, 13 seed = 27) ---> 14 fitfit (xgb1, X_train, y_train)

в modelfit (alg, X_train, y_train, useTrainCV, cv_folds, early_stopping_rounds) 14 early_stopping_rounds = early_stopping, 15 seed = 0, ---> 16 обратных вызовов = [xgb.callback.print_evaluation (show_stdv = False)]), 17 print cvresult 18 alg.set_params (n_estimators = cvresult.shape [0])

/Users/sayontimondal/anaconda2/lib/python2.7/site-packages/xgboost/training.pyc в cv (params, dtrain, num_boost_round, nfold, стратифицированные, сгибы, метрики, obj, feval, максимизировать, early_stopping_rounds, fprepas,, verbose_eval, show_stdv, seed, callbacks, shuffle) 404valuation_result_list = нет)) 405 для сгиба в cvfolds: -> 406 fold.update (i, obj) 407 res = aggcv ([f.eval (i, feval) дляf в cvfolds]) 408

/ Пользователи / sayontimondal / anaconda2 / lib / python2.7 / site-packages / xgboost / training.pyc in update (self, iteration, fobj) 216 def update (self, iteration, fobj): 217 "" "" Обновлять бустеры за одну итерацию"" "-> 218 self.bst.update (self.dtrain, iteration, fobj) 219 220 def eval (self, iteration, feval):

/ Users / sayontimondal / anaconda2 / lib / python2.7 / site-packages / xgboost / core.pyc в обновлении (self, dtrain, iteration, fobj) 892, если fobj равен None: 893 _check_call (_LIB.XGBoosterUpdateOneIter (self.handle, ctypes.c_int (итерация), -> 894)dtrain.handle)) 895 else: 896 pred = self.predict (dtrain)

/ Users / sayontimondal / anaconda2 / lib / python2.7 / site-packages / xgboost / core.pyc в _check_call (ret)128 "" "129 if ret! = 0: -> 130 поднять XGBoostError (_LIB.XGBGetLastError ()) 131 132

XGBoostError: [13:34:08] src / target / multiclass_obj.cc: 78: Проверка не пройдена: label_error> = 0 && label_error

Трассировка стека вернула 7 записей: [bt] (0) 0 libxgboost.dylib
0x000000010d0684a0 dmlc :: StackTrace () + 288 [bt] (1) 1
libxgboost.dylib 0x000000010d06823MageFat :: ::. Dmlc ::~ LogMessageFatal () + 47 [bt] (2) 2
libxgboost.dylib 0x000000010d0dcf9a xgboost :: obj :: SoftmaxMultiClassObj :: GetGradient (xgboost :: HostDeviceVector *, xgboost & gt;1027 *

) + 2218 [bt] (3) 3 libxgboost.dylib 0x000000010d0645f9 xgboost :: LearnerImpl :: UpdateOneIter (int, xgboost :: DMatrix ) + 1017 [bt] (4)) 4 libxgboost.dylib
0x000000010d07ef07 XGBoosterUpdateOneIter + 87 [bt] (5) 5 _ctypes.so 0x0000000103528677 ffi_call_unix64 + 79 [bt] (6) 6 ???
036000 080009 0800071036 *

И поиск по Google не показывает результатов.

1 Ответ

0 голосов
/ 14 февраля 2019

Ваши ярлыки должны начинаться с 0 до общего количества классов - 1. Например, если у вас есть ярлыки классов как (1,2,3,4,5).Чтобы передать его в цель multi: softprob, вам необходимо преобразовать его в (0,1,2,3,4) классы.Это можно сделать с помощью y.replace ({1: 0, 2: 1, 3: 2, 4: 3, 5: 4}, inplace = True)

...