2016-11-26 7 views
1

Ich versuche xgboost zu verwenden Python ausführen -verwenden - auf einem Klassifikationsproblem, wo ich die Daten in einer numpy Matrix X (rows = Beobachtungen & Spalten = Merkmale) haben und die Etiketten in einem numpy array y. Da meine Daten spärlich sind, möchte ich sie mit einer spärlichen Version von X ausführen lassen, aber anscheinend fehlt mir etwas, wenn ein Fehler auftritt.XGBoost und Sparse Matrix

Hier ist, was ich tue:

# 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 ...

Jetzt habe ich einen Fehler, wenn der Klassifikator zu passen versuchen:

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

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

Nun suchte ich eine während weiter, wo es herkommen könnte, und glaube, dass es mit dem spärlichen Format zu tun hat, das ich verwenden möchte. Aber was es ist, und wie ich es beheben konnte, habe ich keine Ahnung.

Ich würde jede Hilfe oder Kommentare begrüßen! Vielen Dank

+0

funktioniert das mit 'X'? Was sagt 'xgb' zur Verwendung der Sparse-Matrix? Sie sind oft kein Ersatz. – hpaulj

Antwort

0

X_csr = csr_matrix(X) hat viele der gleichen Eigenschaften wie X, einschließlich .shape. Aber es ist keine Unterklasse und kein Ersatz. Der Code muss spärlich sein. sklearn qualifiziert; Tatsächlich fügt es eine Anzahl seiner eigenen schnellen Sparse-Utility-Funktionen hinzu.

Aber ich weiß nicht, wie gut die xgb sparse Matrizen behandelt, noch, wie es mit sklearn spielt.

Angenommen, das Problem ist mit xgtrain, müssen Sie auf seine Art und Eigenschaften aussehen. Wie vergleicht es mit dem mit xgb.DMatrix(X, label = y)?

Wenn Sie Hilfe von jemandem benötigen, der nicht bereits ein xgboost Benutzer ist, müssen Sie viel mehr Informationen über die Objekte in Ihrem Code bereitstellen.

1

Ich bevorzuge den XGBoost Trainingswrapper im Gegensatz zum XGBoost Sklearn Wrapper. Sie können einen Klassifikator erstellen wie folgt:

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

Diese API hat auch eine eingebaute Kreuzvalidierung xgb.cv, die viel besser mit XGBoost funktioniert.

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

Tonnen mehr Beispiele hier https://github.com/dmlc/xgboost/tree/master/demo/guide-python

Hoffnung, das hilft.

1

Sie verwenden die API xgboost scikit-learn (http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn), so dass Sie Ihre Daten nicht in eine DMatrix konvertieren müssen, um sie an den XGBClassifier() anzupassen.Nur das Entfernen der Leitung

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

funktionieren sollte:

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

die Ausgänge:

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)