各繰り返しで勾配の更新を追跡するには、Pythonで訓練ループを公開し(C++実装で内部的に実行するのではなく)、勾配ループとヘッセンの実装を提供する必要があります。多くの標準損失関数、例えば二乗損失、ロジスティック損失については、これは非常に簡単であり、標準的な参考文献で見つけることは困難ではない。ロジスティック回帰のトレーニングループを公開する方法の例を示します。
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)
ありがとうございます。私は勾配統計を得るのが難しい特別な方法があることを知っていました。私は私が知らなかったことを知るようになります。どうも。 – semenbari