2016-11-26 2 views
1

Je suis en train d'utiliser xgboost pour exécuter -en utilisant python - sur un problème de classification, où j'ai les données dans une matrice numpy X (lignes = observations & colonnes = caractéristiques) et les étiquettes dans un tableau numpy y. Parce que mes données sont rares, je voudrais le faire fonctionner en utilisant une version clairsemée de X, mais il semble qu'il me manque quelque chose comme une erreur se produit.XGBoost et matrice clairsemée

Voici ce que je fais:

# Library import 

import numpy as np 
import xgboost as xgb 
from xgboost.sklearn import XGBClassifier 
from scipy.sparse import csr_matrix 

# Converting to sparse data and running xgboost 

X_csr = csr_matrix(X) 
xgb1 = XGBClassifier() 
xgtrain = xgb.DMatrix(X_csr, label = y)  #to work with the xgb format 
xgtest = xgb.DMatrix(Xtest_csr) 
xgb1.fit(xgtrain, y, eval_metric='auc') 
dtrain_predictions = xgb1.predict(xgtest) 

etc ...

Maintenant, j'obtiens une erreur en essayant de tenir le classificateur:

File ".../xgboost/python-package/xgboost/sklearn.py", line 432, in fit 
self._features_count = X.shape[1] 

AttributeError: 'DMatrix' object has no attribute 'shape' 

Maintenant, je cherchais un alors que d'où il pourrait venir, et je crois qu'il a à voir avec le format clairsemé que je souhaite utiliser. Mais ce que c'est, et comment je pourrais le réparer, je n'ai aucune idée.

Je serais heureux de recevoir de l'aide ou des commentaires! Merci beaucoup

+0

Est-ce que ce travail avec 'X'? Que dit 'xgb' à propos de l'utilisation d'une matrice éparse? Ils ne sont souvent pas tomber dans les remplacements. – hpaulj

Répondre

0

X_csr = csr_matrix(X) a plusieurs des mêmes propriétés que X, y compris .shape. Mais ce n'est pas une sous-classe, et pas une baisse de remplacement. Le code doit être "sparse-aware". sklearn qualifie; en fait, il ajoute un certain nombre de ses propres fonctions d'utilitaires rapides et clairsemés.

Mais je ne sais pas comment le xgb gère les matrices creuses, ni comment il joue avec sklearn.

En supposant que le problème est avec xgtrain, vous devez examiner son type et ses propriétés. Comment compare-t-il avec celui fait avec xgb.DMatrix(X, label = y)?

Si vous voulez de l'aide de quelqu'un qui n'est pas déjà un utilisateur xgboost, vous devrez fournir beaucoup plus d'informations sur les objets dans votre code.

1

Je préfère utiliser l'empaqueteuse d'entraînement XGBoost par opposition à l'enrubanneuse XGBoost. Vous pouvez créer un classificateur comme suit:

params = { 
    # I'm assuming you are doing binary classification 
    'objective':'binary:logistic' 
    # any other training params here 
    # full parameter list here https://github.com/dmlc/xgboost/blob/master/doc/parameter.md 
} 
booster = xgb.train(params, xgtrain, metrics=['auc']) 

Cette API a également une validation croisée xgb.cv qui fonctionne builtin beaucoup mieux avec XGBoost.

https://xgboost.readthedocs.io/en/latest/get_started/index.html#python

tonnes d'autres exemples ici https://github.com/dmlc/xgboost/tree/master/demo/guide-python

Hope this helps.

1

Vous utilisez l'API scikit-learn xgboost (http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn), vous n'avez donc pas besoin de convertir vos données en une DMatrix pour s'adapter à XGBClassifier().Il suffit de retirer la ligne

xgtrain = xgb.DMatrix(X_csr, label = y) 

devrait fonctionner:

type(X_csr) #scipy.sparse.csr.csr_matrix 
type(y) #numpy.ndarray 
xgb1 = xgb.XGBClassifier() 
xgb1.fit(X_csr, y) 

qui délivre en sortie:

XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, 
    gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3, 
    min_child_weight=1, missing=None, n_estimators=100, nthread=-1, 
    objective='binary:logistic', reg_alpha=0, reg_lambda=1, 
    scale_pos_weight=1, seed=0, silent=True, subsample=1)