xgboost模型输出的解释
使用经典的鸢尾花的数据来说明.,这是一个二分类的问题,判断是不是鸢尾花, 这里只取前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
首先,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 #这个值跟输出的概率值是对应的。
残差即损失函数的导数,而对于均方差square loss function,其导数正好是真实值减预测值的相反数,只是残差的一个特例而已。
先学习一棵回归树,迭代树时,会把残差作为目标值,学习下一个回归树,继续求残差,直到建立的回归树的数目达到一定要求或者残差能够容忍,停止学习。
输出是指,先看各个样本在所有树中属于哪个节点,然后将各个树中的节点的值累加起来,然后还要乘以学习率才是输出,即叶子节点权重累加值乘以学习率。然后看objective是分类还是回归,如果是logistic,则求sigmoid即为概率值。
将输出值代入loss function,可以求出loss。
然后看objective是分类还是回归,如果是logistic,则求sigmoid即为概率值。
将输出值代入loss function,可以求出loss。