2017-07-05 2 views
1

Ich studiere xgboost und Anfänger für Gradientenboost. Bei der Gradientenbaumverstärkung wird die Verlustfunktion durch Approximationsberechnung zweiter Ordnung gi, hi abgeleitet. Sie können es auf https://xgboost.readthedocs.io/en/latest/model.html#the-structure-score sehen. Bei einem Datensatz, wie kann ich den Wert gi, hi wie g1, h1, g2, h2, ..?Wie erhalten oder sehen Sie den Gradient Statistics Wert von xgboost?

Ich sah _train_internal und mehrere Funktionen in training.py und sklean.py. Aber ich habe es nicht gefunden. Wenn man versteht, wie es berechnet und effizient umgesetzt wurde, könnte es möglich sein, einen weiteren in xgboost verwendeten Algorithmus wie Quantil-Perzentilskizze anzuwenden.

Danke.

Antwort

2

Um die Gradientenaktualisierungen in jeder Iteration zu verfolgen, müssten Sie die Trainingsschleife in Python verfügbar machen (anstatt sie intern in der C++ - Implementierung auszuführen) und benutzerdefinierte Gradienten- und Hessian-Implementierungen bereitstellen. Für viele der Standardverlustfunktionen, z. B. Quadratverlust, logistischer Verlust, ist dies ziemlich einfach und nicht schwer in Standardreferenzen zu finden. Hier ist ein Beispiel, wie die Trainingsschleife für die logistische Regression offen gelegt wird.

import numpy as np 
import xgboost as xgb 
from sklearn.datasets import make_classification 
from sklearn.metrics import confusion_matrix 


def sigmoid(x): 
    return 1/(1 + np.exp(-x)) 


def logregobj(preds, dtrain): 
    """log likelihood loss""" 
    labels = dtrain.get_label() 
    preds = sigmoid(preds) 
    grad = preds - labels 
    hess = preds * (1.0-preds) 
    return grad, hess 


# Build a toy dataset. 
X, Y = make_classification(n_samples=1000, n_features=5, n_redundant=0, n_informative=3, 
          random_state=1, n_clusters_per_class=1) 

# Instantiate a Booster object to do the heavy lifting 
dtrain = xgb.DMatrix(X, label=Y) 
params = {'max_depth': 2, 'eta': 1, 'silent': 1} 
num_round = 2 
model = xgb.Booster(params, [dtrain]) 

# Run 10 boosting iterations 
# g and h can be monitored for gradient statistics 
for _ in range(10): 
    pred = model.predict(dtrain) 
    g, h = logregobj(pred, dtrain) 
    model.boost(dtrain, g, h) 

# Evaluate predictions  
yhat = model.predict(dtrain) 
yhat = 1.0/(1.0 + np.exp(-yhat)) 
yhat_labels = np.round(yhat) 
confusion_matrix(Y, yhat_labels) 
+0

Vielen Dank, es funktioniert. Ich wusste, dass es spezielle und schwierige Methoden gibt, Gradientenstatistiken zu erhalten. Ich werde wissen, was ich nicht wusste. Danke. – semenbari

Verwandte Themen