如何获取或查看xgboost的梯度统计值?

我正在学习xgboost,并且对梯度提升是新手。在梯度树提升中,损失函数通过二阶近似计算gi, hi来推导。你可以在https://xgboost.readthedocs.io/en/latest/model.html#the-structure-score上看到这一点。给定一个数据集,我如何查看gi, hi的值,例如g1, h1, g2, h2,..?

我在training.py和sklean.py中看到了_train_internal和几个函数。但我没有找到它。通过理解它是如何计算和高效获取的,可能可以应用xgboost中使用的进一步算法,例如分位数百分比草图。

谢谢。


回答:

要跟踪每次迭代中的梯度更新,你需要在python中暴露训练循环(而不是让它在C++实现中内部执行),并提供自定义的梯度和黑森矩阵实现。对于许多标准损失函数,例如平方损失、逻辑损失,这非常简单,并且在标准参考文献中很容易找到。这里有一个示例,展示了如何为逻辑回归暴露训练循环。

import numpy as npimport xgboost as xgbfrom sklearn.datasets import make_classificationfrom sklearn.metrics import confusion_matrixdef 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 liftingdtrain = xgb.DMatrix(X, label=Y)params = {'max_depth': 2, 'eta': 1, 'silent': 1}num_round = 2model = xgb.Booster(params, [dtrain])# Run 10 boosting iterations# g and h can be monitored for gradient statisticsfor _ 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)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注