2017-07-23 6 views
3

J'entraîne un XGBoostClassifier pour mon ensemble d'entraînement. Mes caractéristiques d'entraînement ont la forme de (45001, 10338) qui est un tableau numpy et mes étiquettes d'entraînement ont la forme de (45001,) [J'ai 1161 étiquettes uniques donc j'ai fait un codage d'étiquette pour le labels] qui est aussi un tableau numpy. De la documentation, il est clairement indiqué que je peux créer DMatrix à partir d'un tableau numpy. Donc, j'utilise les fonctionnalités d'entraînement et les étiquettes mentionnées ci-dessus comme des tableaux numpy immédiatement. Mais je reçois l'erreur suivanteXGBoostError: b '[19:12:58] src/metric/rank_metric.cc: 89: Échec de la vérification: (preds.size()) == (info.labels.size()) taille de l'étiquette prédire la taille ne correspond pas'

--------------------------------------------------------------------------- 
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' 

S'il vous plaît trouver mon code de modèle ci-dessous:

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)) 

Où vais-je mal à l'endroit ci-dessus?

Mon classificateur comme suit:

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 Après avoir changé métrique d'évaluation,

--------------------------------------------------------------------------- 
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' 

Répondre

4

L'erreur d'origine que vous obtenez est parce que cette mesure n'a pas été conçu pour la classification multi-classe (voir here).

Vous pouvez utiliser scikit learn wrapper de xgboost pour surmonter ce problème. J'ai modifié votre code avec cette enveloppe, pour produire une fonction similaire. Je ne suis pas sûr de savoir pourquoi vous faites de la recherche de grids, car vous n'énumérez pas les paramètres. Au lieu de cela, vous utilisez les paramètres que vous avez spécifiés dans xgb1. Voici le code modifié:

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) 

La sortie que je reçois est

Model Report 
Accuracy : 1 

Notez que je taille beaucoup plus petite pour les données. Avec la taille que vous avez mentionnée, l'algorithme peut être très lent.

+0

Dans tensorflow, nous créons des lots et de les exécuter. puis-je exécuter cet algorithme en batch? Disons 100 enregistrements après l'autre? Comment puis-je sauvegarder ce modèle et le former à nouveau? J'accepterai votre réponse –

+0

Lorsque vous formez un réseau de neurones sur tensorflow, vous utilisez la descente en gradient de lot. Ainsi, vous pouvez le faire en morceaux. Cependant, xgboost fonctionne différemment, donc vous ne pouvez pas le séparer en morceaux. Cependant, j'ai regardé la page de faq de xgboost: http://xgboost.readthedocs.io/en/latest/faq.html, et dans la section au sujet des grands ensembles de données ils écrivent ceci: XGBoost est conçu pour être efficace de mémoire.Habituellement, il peut gérer les problèmes aussi longtemps que les données entrent dans votre mémoire (Cela signifie généralement des millions d'instances). Si vous manquez de mémoire, vérifiez la version de la mémoire externe ou la version distribuée de xgboost –

+0

Ainsi, en fonction de la citation ci-dessus, il semble que vous pouvez essayer d'exécuter le code sur votre ordinateur tel qu'il est. Vous pouvez également mettre verbose = 2 dans GridSearchCV afin qu'il imprime plus de détails pendant son exécution. Si cela ne fonctionne pas, vous pouvez essayer la version distribuée. Ils donnent un lien à partir de la page faq (celle à laquelle je me suis connecté dans le commentaire précédent). Vous pouvez aussi mettre useTrainCV = False. Comme vous avez un ensemble de paramètres, vous n'avez pas vraiment besoin de la recherche de grille, vous pouvez donc ignorer cette partie de votre code (qui est actuellement la partie la plus lourde de votre code). –

2

L'erreur est b/c que vous essayez d'utiliser métrique d'évaluation AUC pour la classification multiclassent, mais AUC est seulement applicable pour les problèmes à deux classes. Dans l'implémentation de xgboost, "auc" s'attend à ce que la taille de prédiction soit la même que la taille de l'étiquette, alors que la taille de prédiction multiclasse serait 45001 * 1161. Utilisez les métriques multiclass "mlogloss" ou "merror".

P.S .: actuellement, xgboost serait plutôt lent avec tant de classes, car il y a une certaine inefficacité avec les prévisions de mise en cache pendant la formation.

+0

S'il vous plaît vérifier la nouvelle erreur ci-dessus après avoir changé la métrique d'évaluation –