xgboost输出模型解释

xgboost模型输出的解释

【目标】

  • 掌握xgboost中,predict方法对应不同的参数,输出的含义
  • 掌握xgboost中,dump出model的树结构的含义

【数据集与代码】

使用经典的鸢尾花的数据来说明.,这是一个二分类的问题,判断是不是鸢尾花, 这里只取前100行的数据,并对训练集和测试集进行了切分。默认有25个样本作测试集。

代码如下:

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,roc_auc_score, log_loss
from sklearn.model_selection import GridSearchCV
from sklearn import datasets

iris = datasets.load_iris()
data = iris.data[:100]
label = iris.target[:100]

train_x, test_x, train_y, test_y = train_test_split(data, label, random_state=0)

dtrain = xgb.DMatrix(train_x, label=train_y)
dtest = xgb.DMatrix(test_x)

params={'booster':'gbtree',
        'objective': 'binary:logistic',
        'eval_metric': ['logloss'],
        'max_depth':4,
        'lambda':10,
        'subsample':0.75,
        'colsample_bytree':0.75,
        'min_child_weight':2,
        'eta': 0.1,
        'seed':0,
        'nthread':8,
        'silent':1}
watchlist = [(dtrain, 'train')]
bst = xgb.train(params, dtrain, num_boost_round=10, evals=watchlist)
bst.dump_model('iris_model.txt')
ypred = bst.predict(dtest)
print ypred
ypred_output = bst.predict(dtest, output_margin=True)
print ypred_output
ypred_leaf = bst.predict(dtest, pred_leaf=True)
print ypred_leaf

【输出与解释】

输出的结果以及树结构如下:
xgboost输出模型解释_第1张图片
xgboost输出模型解释_第2张图片

首先,predict函数无参数,默认输出的是概率值。

当设置output_margin=True时,输出的不是概率值,而是每个样本在xgboost生成的所有树中叶子节点的累加值,因为在训练模型时,objective选择了logistic,所以用这个累加值做sigmoid就是predict函数无参数时的概率值。如何知道每个样本在xgboost生成的所有树中是哪个叶子节点呢?

当设置pred_leaf=True时,会输出每个样本在所有树中的叶子节点

ypred_leaf = bst.predict(dtest, pred_leaf=True)

即测试集有25个样本,xgboost生成了10棵树,则样本在所有树中的叶子节点对应了一个(25, 10)的矩阵。例如,第一个样本在10棵树中的叶子节点都是第一个。第二个样本在10棵树中的叶子节点都是第二个。

再看树结构,共有10个booster,编号0~9,对应10棵树。对于第一个booster,当f3<0.75时,分到leaf1,f3>=0.75时,分到leaf2,缺失该特征,分到leaf1。我们将10棵树中的leaf1的值全部加起来,即:

-0.0787879-0.0823941-0.0743093-0.0591238-0.0662177-0.0670728-0.068963-0.0610322-0.0576446-0.0599772=-0.6755226

-0.6755226即为叶子节点权重的累加值,在这里,所有叶子节点的权重已经乘了学习率,对-0.6755226求sigmoid:

1 / float(1 + np.exp(0.6755226)) = 0.337261343368 #这个值跟输出的概率值是对应的。

【残差、输出与loss】

残差即损失函数的导数,而对于均方差square loss function,其导数正好是真实值减预测值的相反数,只是残差的一个特例而已。

先学习一棵回归树,迭代树时,会把残差作为目标值,学习下一个回归树,继续求残差,直到建立的回归树的数目达到一定要求或者残差能够容忍,停止学习。

输出是指,先看各个样本在所有树中属于哪个节点,然后将各个树中的节点的值累加起来,然后还要乘以学习率才是输出,即叶子节点权重累加值乘以学习率。然后看objective是分类还是回归,如果是logistic,则求sigmoid即为概率值。

将输出值代入loss function,可以求出loss。

然后看objective是分类还是回归,如果是logistic,则求sigmoid即为概率值。

将输出值代入loss function,可以求出loss。

你可能感兴趣的:(xgboost算法)