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