2017-07-05 6 views
1

私は勾配ブーストのためにxgboostと初心者を勉強しています。 グラジエントツリーブースティングでは、損失関数はgi、hiを計算する2次近似によって導かれます。 https://xgboost.readthedocs.io/en/latest/model.html#the-structure-scoreにそれを見ることができます。 データセットを指定すると、g1、h1、g2、h2などの値gi、hiをどのように見ることができますか?xgboostの勾配統計値を取得または表示するにはどうすればよいですか?

training.pyとsklean.pyに_train_internalといくつかの関数があります。しかし私はそれを見つけられませんでした。それがどのように計算されて効率的になったかを理解することによって、xgboostで使用されるquantile percentileスケッチなどのアルゴリズムをさらに適用することができます。

ありがとうございました。

答えて

2

各繰り返しで勾配の更新を追跡するには、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) 
+0

ありがとうございます。私は勾配統計を得るのが難しい特別な方法があることを知っていました。私は私が知らなかったことを知るようになります。どうも。 – semenbari

関連する問題