2017-07-23 3 views
3

Ich trainiere einen XGBoostClassifier für mein Trainingssatz.XGBoostError: b '[19:12:58] src/metrisch/rank_metric.cc: 89: Prüfung fehlgeschlagen: (preds.size()) == (info.labels.size()) Etikettengröße Größe vorhersagen stimmt nicht überein'

Meine Trainingsfunktionen sind in der Form von (45001, 10338), die eine Reihe ist und meine Training Etiketten sind in der Form von (45001,) [Ich habe 1161 einzigartige Etiketten, so habe ich eine Label-Codierung für die Etiketten], die auch ein numpliges Array ist.

Aus der Dokumentation wird deutlich, dass ich DMatrix aus numpy Array erstellen kann. Daher verwende ich die oben genannten Trainingsfunktionen und -kennzeichnungen sofort als numplige Arrays. Aber ich bin immer die folgende Fehler

--------------------------------------------------------------------------- 
XGBoostError        Traceback (most recent call last) 
<ipython-input-30-3de36245534e> in <module>() 
    13 scale_pos_weight=1, 
    14 seed=27) 
---> 15 modelfit(xgb1, train_x, train_y) 

<ipython-input-27-9d215eac135e> in modelfit(alg, train_data_features, train_labels, useTrainCV, cv_folds, early_stopping_rounds) 
     6   xgtrain = xgb.DMatrix(train_data_features, label=train_labels) 
     7   cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds, 
----> 8    metrics='auc',early_stopping_rounds=early_stopping_rounds) 
     9   alg.set_params(n_estimators=cvresult.shape[0]) 
    10 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/training.py in cv(params, dtrain, num_boost_round, nfold, stratified, folds, metrics, obj, feval, maximize, early_stopping_rounds, fpreproc, as_pandas, verbose_eval, show_stdv, seed, callbacks) 
    399   for fold in cvfolds: 
    400    fold.update(i, obj) 
--> 401   res = aggcv([f.eval(i, feval) for f in cvfolds]) 
    402 
    403   for key, mean, std in res: 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/training.py in <listcomp>(.0) 
    399   for fold in cvfolds: 
    400    fold.update(i, obj) 
--> 401   res = aggcv([f.eval(i, feval) for f in cvfolds]) 
    402 
    403   for key, mean, std in res: 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/training.py in eval(self, iteration, feval) 
    221  def eval(self, iteration, feval): 
    222   """"Evaluate the CVPack for one iteration.""" 
--> 223   return self.bst.eval_set(self.watchlist, iteration, feval) 
    224 
    225 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/core.py in eval_set(self, evals, iteration, feval) 
    865    _check_call(_LIB.XGBoosterEvalOneIter(self.handle, iteration, 
    866             dmats, evnames, len(evals), 
--> 867             ctypes.byref(msg))) 
    868    return msg.value 
    869   else: 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/core.py in _check_call(ret) 
    125  """ 
    126  if ret != 0: 
--> 127   raise XGBoostError(_LIB.XGBGetLastError()) 
    128 
    129 

XGBoostError: b'[19:12:58] src/metric/rank_metric.cc:89: Check failed: (preds.size()) == (info.labels.size()) label size predict size not match' 

finden Sie mein Modell-Code unten:

def modelfit(alg, train_data_features, train_labels,useTrainCV=True, cv_folds=5, early_stopping_rounds=50): 

    if useTrainCV: 
     xgb_param = alg.get_xgb_params() 
     xgb_param['num_class'] = 1161 
     xgtrain = xgb.DMatrix(train_data_features, label=train_labels) 
     cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds, 
      metrics='auc',early_stopping_rounds=early_stopping_rounds) 
     alg.set_params(n_estimators=cvresult.shape[0]) 

    #Fit the algorithm on the data 
    alg.fit(train_data_features, train_labels, eval_metric='auc') 

    #Predict training set: 
    dtrain_predictions = alg.predict(train_data_features) 
    dtrain_predprob = alg.predict_proba(train_data_features)[:,1] 

    #Print model report: 
    print("\nModel Report") 
    print("Accuracy : %.4g" % metrics.accuracy_score(train_labels, dtrain_predictions)) 

Wo bin ich falsch läuft in der obigen Stelle?

Mein Klassifikator wie folgt:

xgb1 = xgb.XGBClassifier(
learning_rate =0.1, 
n_estimators=50, 
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) 

EDIT - 2 Nach Auswertung metrische Änderung

--------------------------------------------------------------------------- 
XGBoostError        Traceback (most recent call last) 
<ipython-input-9-30c62a886c2e> in <module>() 
    13 scale_pos_weight=1, 
    14 seed=27) 
---> 15 modelfit(xgb1, train_x_trail, train_y_trail) 

<ipython-input-8-9d215eac135e> in modelfit(alg, train_data_features, train_labels, useTrainCV, cv_folds, early_stopping_rounds) 
     6   xgtrain = xgb.DMatrix(train_data_features, label=train_labels) 
     7   cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds, 
----> 8    metrics='auc',early_stopping_rounds=early_stopping_rounds) 
     9   alg.set_params(n_estimators=cvresult.shape[0]) 
    10 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/training.py in cv(params, dtrain, num_boost_round, nfold, stratified, folds, metrics, obj, feval, maximize, early_stopping_rounds, fpreproc, as_pandas, verbose_eval, show_stdv, seed, callbacks) 
    398       evaluation_result_list=None)) 
    399   for fold in cvfolds: 
--> 400    fold.update(i, obj) 
    401   res = aggcv([f.eval(i, feval) for f in cvfolds]) 
    402 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/training.py in update(self, iteration, fobj) 
    217  def update(self, iteration, fobj): 
    218   """"Update the boosters for one iteration""" 
--> 219   self.bst.update(self.dtrain, iteration, fobj) 
    220 
    221  def eval(self, iteration, feval): 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/core.py in update(self, dtrain, iteration, fobj) 
    804 
    805   if fobj is None: 
--> 806    _check_call(_LIB.XGBoosterUpdateOneIter(self.handle, iteration, dtrain.handle)) 
    807   else: 
    808    pred = self.predict(dtrain) 

/home/carnd/anaconda3/envs/dl/lib/python3.5/site-packages/xgboost/core.py in _check_call(ret) 
    125  """ 
    126  if ret != 0: 
--> 127   raise XGBoostError(_LIB.XGBGetLastError()) 
    128 
    129 

XGBoostError: b'[03:43:03] src/objective/multiclass_obj.cc:42: Check failed: (info.labels.size()) != (0) label set cannot be empty' 

Antwort

4

Der ursprüngliche Fehler, den Sie erhalten, liegt daran, dass diese Metrik nicht für eine Mehrklassenklassifizierung ausgelegt wurde (siehe here).

Sie könnten scikit learn wrapper von xgboost verwenden, um dieses Problem zu beheben. Ich habe Ihren Code mit diesem Wrapper modifiziert, um ähnliche Funktionen zu erzeugen. Ich bin mir nicht sicher, warum Sie Gridsearch tun, da Sie nicht über Parameter aufzählen. Stattdessen verwenden Sie die Parameter, die Sie in xgb1 angegeben haben. Hier ist der modifizierte Code:

import xgboost as xgb 
import sklearn 
import numpy as np 
from sklearn.model_selection import GridSearchCV 

def modelfit(alg, train_data_features, train_labels,useTrainCV=True, cv_folds=5): 

    if useTrainCV: 
     params=alg.get_xgb_params() 
     xgb_param=dict([(key,[params[key]]) for key in params]) 

     boost = xgb.sklearn.XGBClassifier() 
     cvresult = GridSearchCV(boost,xgb_param,cv=cv_folds) 
     cvresult.fit(X,y) 
     alg=cvresult.best_estimator_ 


    #Fit the algorithm on the data 
    alg.fit(train_data_features, train_labels) 

    #Predict training set: 
    dtrain_predictions = alg.predict(train_data_features) 
    dtrain_predprob = alg.predict_proba(train_data_features)[:,1] 

    #Print model report: 
    print("\nModel Report") 
    print("Accuracy : %.4g" % sklearn.metrics.accuracy_score(train_labels, dtrain_predictions)) 

xgb1 = xgb.sklearn.XGBClassifier(
learning_rate =0.1, 
n_estimators=50, 
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)  


X=np.random.normal(size=(200,30)) 
y=np.random.randint(0,5,200) 

modelfit(xgb1, X, y) 

Die Ausgabe, die ich erhalte, ist

Model Report 
Accuracy : 1 

Bitte beachte, dass ich viele kleinere Größe für die Daten verwendet. Mit der Größe, die Sie erwähnten, kann der Algorithmus sehr langsam sein.

+0

In Tensorflow erstellen wir Stapel und führen sie aus. Kann ich diesen Algorithmus im Batch ausführen? Sagen wir 100 Sätze nach dem anderen? Wie kann ich dieses Modell speichern und erneut trainieren? Ich werde Ihre Antwort annehmen –

+0

Wenn Sie neuronales Netzwerk auf Tensorflow trainieren, verwenden Sie Batch-Gradienten-Abstieg. So können Sie das in Chunks machen. Xgboost funktioniert jedoch anders, Sie können es nicht einfach in Abschnitte aufteilen. Allerdings habe ich auf xgboost faq page: http://xgboost.readthedocs.io/en/latest/faq.html, und im Abschnitt über große Datensätze schreiben sie dies: XGBoost ist so konzipiert, Speicher effizient sein.Normalerweise kann es Probleme behandeln, solange die Daten in Ihren Speicher passen (Dies bedeutet normalerweise Millionen von Instanzen). Wenn Sie nicht mehr genügend Arbeitsspeicher zur Verfügung haben, prüfen Sie die externe Speicherversion oder die verteilte Version von xgboost. –

+0

Auf der Grundlage des obigen Zitats scheint es also so zu sein, dass Sie versuchen können, den Code auf Ihrem Computer so auszuführen, wie er ist. Sie können in GridSearchCV auch verbose = 2 eingeben, sodass während der Ausführung weitere Details gedruckt werden. Wenn es nicht funktioniert, können Sie die verteilte Version ausprobieren. Sie geben einen Link dazu von der FAQ-Seite (die ich im vorherigen Kommentar verlinkt habe). Sie könnten auch useTrainCV = False setzen. Da Sie einen Parametersatz haben, brauchen Sie die Gridsearch-Funktion nicht wirklich, Sie können also diesen Teil Ihres Codes überspringen (der momentan der schwerste Teil in Ihrem Code ist). –

2

Der Fehler ist b/c Sie versuchen, AUC Bewertungsmetrik für mehrklassige Klassifizierung zu verwenden, aber AUC ist nur für Zwei-Klassen-Probleme anwendbar. In der xgboost-Implementierung erwartet "auc", dass die Vorhersagegröße der Etikettengröße entspricht, während die Vorhersagegröße für die Mehrfachklasse 45001 * 1161 beträgt. Verwenden Sie entweder "mlogloss" oder "merror" Multiclass-Metriken.

P.S .: derzeit, Xgboost wäre ziemlich langsam mit so vielen Klassen, da es einige Ineffizienz mit Vorhersagen Caching während des Trainings gibt.

+0

Bitte überprüfen Sie den obigen neuen Fehler, nachdem Sie die Bewertungsmetrik geändert haben –

Verwandte Themen