7.2 模型接口
7.2.1 Booster
Booster
是xgboost
的模型,它包含了训练、预测、评估等任务的底层实现。xbgoost.Booster(params=None,cache=(),model_file=None)
参数:
params
: 一个字典,给出了模型的参数。该
Booster
将调用self.set_param(params)
方法来设置模型的参数。cache
:一个列表,给出了缓存的项。其元素是DMatrix
的对象。模型从这些DMatrix
对象中读取特征名字和特征类型(要求这些DMatrix
对象具有相同的特征名字和特征类型)model_file
: 一个字符串,给出了模型文件的位置。如果给出了
model_file
,则调用self.load_model(model_file)
来加载模型。
属性:
通过方法来存取、设置属性。
方法:
.attr(key)
: 获取booster
的属性。如果该属性不存在,则返回None
参数:
key
: 一个字符串,表示要获取的属性的名字
.set_attr(**kwargs)
: 设置booster
的属性参数:
kwargs
: 关键字参数。注意:参数的值目前只支持字符串。如果参数的值为
None
,则表示删除该参数
.attributes()
: 以字典的形式返回booster
的属性.set_param(params,value=None)
: 设置booster
的参数参数:
params
: 一个列表(元素为键值对)、一个字典、或者一个字符串。表示待设置的参数value
: 如果params
为字符串,那么params
就是键,而value
就是参数值。
.boost(dtrain,grad,hess)
: 执行一次训练迭代参数:
dtrain
: 一个DMatrix
对象,表示训练集grad
: 一个列表,表示一阶的梯度hess
: 一个列表,表示二阶的偏导数
.update(dtrain,iteration,fobj=None)
: 对一次迭代进行更新参数:
dtrain
: 一个DMatrix
对象,表示训练集iteration
: 一个整数,表示当前的迭代步数编号fobj
: 一个函数,表示自定义的目标函数
由于
Booster
没有.train()
方法,因此需要用下面的策略进行迭代:for i in range(0,100):
booster.update(train_matrix,iteration=i)
.copy()
: 拷贝当前的booster
,并返回一个新的Booster
对象.dump_model(fout,fmap='',with_stats=False)
:dump
模型到一个文本文件中。参数:
fout
: 一个字符串,表示输出文件的文件名fmap
: 一个字符串,表示存储feature map
的文件的文件名。booster
需要从它里面读取特征的信息。该文件每一行依次代表一个特征。每一行的格式为:
feature name:feature type
。 其中feature type
为int
、float
等表示数据类型的字符串。with_stats
: 一个布尔值。如果为True
,则输出split
的统计信息
.get_dump(fmap='',with_stats=False,dump_format='text')
:dump
模型为字符的列表(而不是存到文件中)。参数:
fmap
: 一个字符串,表示存储feature map
的文件的文件名。booster
需要从它里面读取特征的信息。with_stats
: 一个布尔值。如果为True
,则输出split
的统计信息dump_format
: 一个字符串,给出了输出的格式
- 返回值:一个字符串的列表。每个字符串描述了一棵子树。
.eval(data,name='eval',iteration=0)
: 对模型进行评估参数:
data
: 一个DMatrix
对象,表示数据集name
: 一个字符串,表示数据集的名字iteration
: 一个整数,表示当前的迭代编号
- 返回值:一个字符串,表示评估结果
.eval_set(evals,iteration=0,feval=None)
: 评估一系列的数据集参数:
evals
: 一个列表,列表元素为元组(DMatrix,string)
, 它给出了待评估的数据集iteration
: 一个整数,表示当前的迭代编号feval
: 一个函数,给出了自定义的评估函数
- 返回值:一个字符串,表示评估结果
.get_fscore(fmap='')
: 返回每个特征的重要性参数:
fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。
- 返回值:一个字典,给出了每个特征的重要性
.get_score(fmap='',importance_type='weight')
: 返回每个特征的重要性参数:
fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。importance_type
: 一个字符串,给出了特征的衡量指标。可以为:'weight'
: 此时特征重要性衡量标准为:该特征在所有的树中,被用于划分数据集的总次数。'gain'
: 此时特征重要性衡量标准为:该特征在树的'cover'
中,获取的平均增益。
- 返回值:一个字典,给出了每个特征的重要性
.get_split_value_histogram(feature,fmap='',bins=None,as_pandas=True)
: 获取一个特征的划分value histogram
。参数:
feature
: 一个字符串,给出了划分特征的名字fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。bins
: 最大的分桶的数量。如果bins=None
或者bins>n_unique
,则分桶的数量实际上等于n_unique
。 其中n_unique
是划分点的值的unique
as_pandas
:一个布尔值。如果为True
,则返回一个pandas.DataFrame
; 否则返回一个numpy ndarray
。
- 返回值:以一个
numpy ndarray
或者pandas.DataFrame
形式返回的、代表拆分点的histogram
的结果。
.load_model(fname)
: 从文件中加载模型。- 参数:
fname
: 一个文件或者一个内存buffer
,xgboost
从它加载模型
- 参数:
.save_model(fname)
: 保存模型到文件中- 参数:
fname
: 一个字符串,表示文件名
- 参数:
save_raw()
: 将模型保存成内存buffer
- 返回值:一个内存
buffer
,代表该模型
- 返回值:一个内存
.load_rabit_checkpoint()
: 从rabit checkpoint
中初始化模型。- 返回值:一个整数,表示模型的版本号
.predict(data,output_margin=False,ntree_limit=0,pred_leaf=False,pred_contribs=False,approx_contribs=False)
: 执行预测该方法不是线程安全的。对于每个
booster
来讲,你只能在某个线程中调用它的.predict
方法。如果你在多个线程中调用.predict
方法,则可能会有问题。要想解决该问题,你必须在每个线程中调用
booster.copy()
来拷贝该booster
到每个线程中参数:
data
: 一个DMatrix
对象,表示测试集output_margin
: 一个布尔值。表示是否输出原始的、未经过转换的margin value
ntree_limit
: 一个整数。表示使用多少棵子树来预测。默认值为0,表示使用所有的子树。如果训练的时候发生了早停,则你可以使用
booster.best_ntree_limit
。pred_leaf
: 一个布尔值。如果为True
,则会输出每个样本在每个子树的哪个叶子上。它是一个nsample x ntrees
的矩阵。每个子树的叶节点都是从
1
开始编号的。pred_contribs
: 一个布尔值。如果为True
, 则输出每个特征对每个样本预测结果的贡献程度。它是一个nsample x ( nfeature+1)
的矩阵。之所以加1,是因为有
bias
的因素。它位于最后一列。其中样本所有的贡献程度相加,就是该样本最终的预测的结果。
approx_contribs
: 一个布尔值。如果为True
,则大致估算出每个特征的贡献程度。
返回值:一个
ndarray
,表示预测结果
Booster
没有train
方法。因此有两种策略来获得训练好的Booster
- 从训练好的模型的文件中
.load_model()
来获取 - 多次调用
.update()
方法
- 从训练好的模型的文件中
示例:
import xgboost as xgt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
_label_map={
# 'Iris-setosa':0, #经过裁剪的,去掉了 iris 中的 setosa 类
'Iris-versicolor':0,
'Iris-virginica':1
}
class BoosterTest:
'''
测试 Booster
'''
def __init__(self):
df=pd.read_csv('./data/iris.csv')
_feature_names=['Sepal Length','Sepal Width','Petal Length','Petal Width']
x=df[_feature_names]
y=df['Class'].map(lambda x:_label_map[x])
train_X,test_X,train_Y,test_Y=train_test_split(x,y,
test_size=0.3,stratify=y,shuffle=True,random_state=1)
self._train_matrix=xgt.DMatrix(data=train_X,label=train_Y,
eature_names=_feature_names,
feature_types=['float','float','float','float'])
self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y,
feature_names=_feature_names,
feature_types=['float', 'float', 'float', 'float'])
self._booster=xgt.Booster(params={
'booster':'gbtree',
'silent':0,#打印消息
'eta':0.1, #学习率
'max_depth':5,
'tree_method':'exact',
'objective':'binary:logistic',
'eval_metric':'auc',
'seed':321},
cache=[self._train_matrix,self._validate_matrix])
def test_attribute(self):
'''
测试属性的设置和获取
:return:
'''
self._booster.set_attr(key1= '1')
print('attr:key1 -> ',self._booster.attr('key1'))
print('attr:key2 -> ',self._booster.attr('key2'))
print('attributes -> ',self._booster.attributes())
def test_dump_model(self):
'''
测试 dump 模型
:return:
'''
_dump_str=self._booster.get_dump(fmap='model/booster.feature',
with_stats=True,dump_format='text')
print('dump:',_dump_str[0][:20]+'...' if _dump_str else [])
self._booster.dump_model('model/booster.model',
fmap='model/booster.feature',with_stats=True)
def test_train(self):
'''
训练
:return:
'''
for i in range(0,100):
self._booster.update(self._train_matrix,iteration=i)
print(self._booster.eval(self._train_matrix, name='train', iteration=i))
print(self._booster.eval(self._validate_matrix,name='eval',iteration=i))
def test_importance(self):
'''
测试特征重要性
:return:
'''
print('fscore:',self._booster.get_fscore('model/booster.feature'))
print('score.weight:', self._booster.get_score(importance_type='weight'))
print('score.gain:', self._booster.get_score(importance_type='gain'))
def test(self):
self.test_attribute()
# attr:key1 -> 1
# attr:key2 -> None
# attributes -> {'key1': '1'}
self.test_dump_model()
# dump: []
self.test_train()
# [0] train-auc:0.980816
# [0] eval-auc:0.933333
# ...
# [99] train-auc:0.998367
# [99] eval-auc:0.995556
self.test_dump_model()
# dump: 0:[f2<4.85] yes=1,no...
self.test_importance()
# score: {'f2': 80, 'f3': 72, 'f0': 6, 'f1': 5}
# score.weight: {'Petal Length': 80, 'Petal Width': 72, 'Sepal Length': 6, 'Sepal Width': 5}
# score.gain: {'Petal Length': 3.6525380337500004, 'Petal Width': 2.2072901486111114, 'Sepal Length': 0.06247816666666667, 'Sepal Width': 0.09243024}
if __name__ == '__main__':
BoosterTest().test()
7.2.2 直接学习
xgboost.train()
: 使用给定的参数来训练一个booster
xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None,
maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True,
xgb_model=None, callbacks=None, learning_rates=None)
参数:
params
: 一个列表(元素为键值对)、一个字典,表示训练的参数dtrain
:一个DMatrix
对象,表示训练集num_boost_round
: 一个整数,表示boosting
迭代数量evals
: 一个列表,元素为(DMatrix,string)
。 它给出了训练期间的验证集,以及验证集的名字(从而区分验证集的评估结果)。obj
:一个函数,它表示自定义的目标函数feval
: 一个函数,它表示自定义的evaluation
函数maximize
: 一个布尔值。如果为True
,则表示是对feval
求最大值;否则为求最小值early_stopping_rounds
:一个整数,表示早停参数。如果在
early_stopping_rounds
个迭代步内,验证集的验证误差没有下降,则训练停止。该参数要求
evals
参数至少包含一个验证集。如果evals
参数包含了多个验证集,则使用最后的一个。返回的模型是最后一次迭代的模型(而不是最佳的模型)。
如果早停发生,则模型拥有三个额外的字段:
.best_score
: 最佳的分数.best_iteration
: 最佳的迭代步数.best_ntree_limit
: 最佳的子模型数量
evals_result
: 一个字典,它给出了对测试集要进行评估的指标。verbose_eval
: 一个布尔值或者整数。- 如果为
True
,则evalutation metric
将在每个boosting stage
打印出来 - 如果为一个整数,则
evalutation metric
将在每隔verbose_eval
个boosting stage
打印出来。另外最后一个boosting stage
,以及早停的boosting stage
的evalutation metric
也会被打印
- 如果为
learning_rates
: 一个列表,给出了每个迭代步的学习率。- 你可以让学习率进行衰减
xgb_model
: 一个Booster
实例,或者一个存储了xgboost
模型的文件的文件名。它给出了待训练的模型。这种做法允许连续训练。
callbacks
: 一个回调函数的列表,它给出了在每个迭代步结束之后需要调用的那些函数。你可以使用
xgboost
中预定义的一些回调函数(位于xgboost.callback
模块) 。如:xgboost.reset_learning_rate(custom_rates)
返回值:一个
Booster
对象,表示训练好的模型
xgboost.cv()
: 使用给定的参数执行交叉验证 。它常用作参数搜索 。xgboost.cv(params, dtrain, num_boost_round=10, nfold=3, stratified=False, folds=None,
metrics=(), obj=None, feval=None, maximize=False, early_stopping_rounds=None,
fpreproc=None, as_pandas=True, verbose_eval=None, show_stdv=True, seed=0,
callbacks=None, shuffle=True)
参数:
params
: 一个列表(元素为键值对)、一个字典,表示训练的参数dtrain
:一个DMatrix
对象,表示训练集num_boost_round
: 一个整数,表示boosting
迭代数量nfold
: 一个整数,表示交叉验证的fold
的数量stratified
: 一个布尔值。如果为True
,则执行分层采样folds
: 一个scikit-learn
的KFold
实例或者StratifiedKFold
实例。metrics
:一个字符串或者一个字符串的列表,指定了交叉验证时的evaluation metrics
如果同时在
params
里指定了eval_metric
,则metrics
参数优先。obj
:一个函数,它表示自定义的目标函数feval
: 一个函数,它表示自定义的evaluation
函数maximize
: 一个布尔值。如果为True
,则表示是对feval
求最大值;否则为求最小值early_stopping_rounds
:一个整数,表示早停参数。如果在
early_stopping_rounds
个迭代步内,验证集的验证误差没有下降,则训练停止。- 返回
evaluation history
结果中的最后一项是最佳的迭代步的评估结果
- 返回
fpreproc
: 一个函数。它是预处理函数,其参数为(dtrain,dtest,param)
, 返回值是经过了变换之后的(dtrain,dtest,param)
as_pandas
: 一个布尔值。如果为True
,则返回一个pandas.DataFrame
;否则返回一个numpy.ndarray
verbose_eval
: 参考xgboost.train()
show_stdv
: 一个布尔值。是否verbose
中打印标准差。它对返回结果没有影响。返回结果始终包含标准差。
seed
: 一个整数,表示随机数种子callbacks
: 参考xgboost.train()
shuffle
: 一个布尔值。如果为True
,则创建folds
之前先混洗数据。
返回值:一个字符串的列表,给出了
evaluation history
。它给的是早停时刻的history
(此时对应着最优模型),早停之后的结果被抛弃。
示例:
class TrainTest:
def __init__(self):
df = pd.read_csv('./data/iris.csv')
_feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']
x = df[_feature_names]
y = df['Class'].map(lambda x: _label_map[x])
train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.3,
stratify=y, shuffle=True, random_state=1)
self._train_matrix = xgt.DMatrix(data=train_X, label=train_Y,
feature_names=_feature_names,
feature_types=['float', 'float', 'float', 'float'])
self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y,
feature_names=_feature_names,
feature_types=['float', 'float', 'float', 'float'])
def train_test(self):
params={
'booster':'gbtree',
'eta':0.01,
'max_depth':5,
'tree_method':'exact',
'objective':'binary:logistic',
'eval_metric':['logloss','error','auc']
}
eval_rst={}
booster=xgt.train(params,self._train_matrix,num_boost_round=20,
evals=([(self._train_matrix,'valid1'),(self._validate_matrix,'valid2')]),
early_stopping_rounds=5,evals_result=eval_rst,verbose_eval=True)
## 训练输出
# Multiple eval metrics have been passed: 'valid2-auc' will be used for early stopping.
# Will train until valid2-auc hasn't improved in 5 rounds.
# [0] valid1-logloss:0.685684 valid1-error:0.042857 valid1-auc:0.980816 valid2-logloss:0.685749 valid2-error:0.066667 valid2-auc:0.933333
# ...
# Stopping. Best iteration:
# [1] valid1-logloss:0.678149 valid1-error:0.042857 valid1-auc:0.99551 valid2-logloss:0.677882 valid2-error:0.066667 valid2-auc:0.966667
print('booster attributes:',booster.attributes())
# booster attributes: {'best_iteration': '1', 'best_msg': '[1]\tvalid1-logloss:0.678149\tvalid1-error:0.042857\tvalid1-auc:0.99551\tvalid2-logloss:0.677882\tvalid2-error:0.066667\tvalid2-auc:0.966667', 'best_score': '0.966667'}
print('fscore:', booster.get_fscore())
# fscore: {'Petal Length': 8, 'Petal Width': 7}
print('eval_rst:',eval_rst)
# eval_rst: {'valid1': {'logloss': [0.685684, 0.678149, 0.671075, 0.663787, 0.656948, 0.649895], 'error': [0.042857, 0.042857, 0.042857, 0.042857, 0.042857, 0.042857], 'auc': [0.980816, 0.99551, 0.99551, 0.99551, 0.99551, 0.99551]}, 'valid2': {'logloss': [0.685749, 0.677882, 0.670747, 0.663147, 0.656263, 0.648916], 'error': [0.066667, 0.066667, 0.066667, 0.066667, 0.066667, 0.066667], 'auc': [0.933333, 0.966667, 0.966667, 0.966667, 0.966667, 0.966667]}}
def cv_test(self):
params = {
'booster': 'gbtree',
'eta': 0.01,
'max_depth': 5,
'tree_method': 'exact',
'objective': 'binary:logistic',
'eval_metric': ['logloss', 'error', 'auc']
}
eval_history = xgt.cv(params, self._train_matrix,num_boost_round=20,
nfold=3,stratified=True,metrics=['error', 'auc'],
early_stopping_rounds=5,verbose_eval=True,shuffle=True)
## 训练输出
# [0] train-auc:0.974306+0.00309697 train-error:0.0428743+0.0177703 test-auc:0.887626+0.0695933 test-error:0.112374+0.0695933
#....
print('eval_history:', eval_history)
# eval_history: test-auc-mean test-auc-std test-error-mean test-error-std \
# 0 0.887626 0.069593 0.112374 0.069593
# 1 0.925821 0.020752 0.112374 0.069593
# 2 0.925821 0.020752 0.098485 0.050631
# train-auc-mean train-auc-std train-error-mean train-error-std
# 0 0.974306 0.003097 0.042874 0.01777
# 1 0.987893 0.012337 0.042874 0.01777
# 2 0.986735 0.011871 0.042874 0.01777
7.2.3 Scikit-Learn API
xgboost
给出了针对scikit-learn
接口的API
xgboost.XGBRegressor
: 它实现了scikit-learn
的回归模型API
class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100,
silent=True, objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None,
gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1,
colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)
参数:
max_depth
: 一个整数,表示子树的最大深度learning_rate
: 一个浮点数,表示学习率n_estimators
:一个整数,表示预期需要学习的子树的数量silent
: 一个布尔值。如果为False
,则打印中间信息objective
: 一个字符串或者可调用对象,指定了目标函数。其函数签名为:objective(y_true,y_pred) -> gra,hess
。 其中:y_true
: 一个形状为[n_sample]
的序列,表示真实的标签值y_pred
: 一个形状为[n_sample]
的序列,表示预测的标签值grad
: 一个形状为[n_sample]
的序列,表示每个样本处的梯度hess
: 一个形状为[n_sample]
的序列,表示每个样本处的二阶偏导数
booster
: 一个字符串。指定了用哪一种基模型。可以为:'gbtree','gblinear','dart'
n_jobs
: 一个整数,指定了并行度,即开启多少个线程来训练。如果为-1
,则使用所有的CPU
gamma
: 一个浮点数,也称作最小划分损失min_split_loss
。 它刻画的是:对于一个叶子节点,当对它采取划分之后,损失函数的降低值的阈值。- 如果大于该阈值,则该叶子节点值得继续划分
- 如果小于该阈值,则该叶子节点不值得继续划分
min_child_weight
: 一个整数,子节点的权重阈值。它刻画的是:对于一个叶子节点,当对它采取划分之后,它的所有子节点的权重之和的阈值。- 如果它的所有子节点的权重之和大于该阈值,则该叶子节点值得继续划分
- 如果它的所有子节点的权重之和小于该阈值,则该叶子节点不值得继续划分
所谓的权重:
- 对于线性模型(
booster=gblinear
),权重就是:叶子节点包含的样本数量。 因此该参数就是每个节点包含的最少样本数量。 - 对于树模型(
booster=gbtree,dart
),权重就是:叶子节点包含样本的所有二阶偏导数之和。
max_delta_step
: 一个整数,每棵树的权重估计时的最大delta step
。取值范围为 ,0 表示没有限制,默认值为 0 。subsample
:一个浮点数,对训练样本的采样比例。取值范围为(0,1]
,默认值为 1 。如果为
0.5
, 表示随机使用一半的训练样本来训练子树。它有助于缓解过拟合。colsample_bytree
: 一个浮点数,构建子树时,对特征的采样比例。取值范围为(0,1]
, 默认值为 1。如果为
0.5
, 表示随机使用一半的特征来训练子树。它有助于缓解过拟合。colsample_bylevel
: 一个浮点数,寻找划分点时,对特征的采样比例。取值范围为(0,1]
, 默认值为 1。如果为
0.5
, 表示随机使用一半的特征来寻找最佳划分点。它有助于缓解过拟合。reg_alpha
: 一个浮点数,是L1
正则化系数。它是xgb
的alpha
参数reg_lambda
: 一个浮点数,是L2
正则化系数。它是xgb
的lambda
参数scale_pos_weight
: 一个浮点数,用于调整正负样本的权重,常用于类别不平衡的分类问题。默认为 1。一个典型的参数值为:
负样本数量/正样本数量
base_score
:一个浮点数, 给所有样本的一个初始的预测得分。它引入了全局的bias
random_state
: 一个整数,表示随机数种子。missing
: 一个浮点数,它的值代表发生了数据缺失。默认为np.nan
kwargs
: 一个字典,给出了关键字参数。它用于设置Booster
对象
xgboost.XGBClassifier
:它实现了scikit-learn
的分类模型API
class xgboost.XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=100,
silent=True, objective='binary:logistic', booster='gbtree', n_jobs=1,
nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1,
colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1,
scale_pos_weight=1, base_score=0.5, random_state=0, seed=None,
missing=None, **kwargs)
参数参考
xgboost.XGBRegressor
xgboost.XGBClassifier
和xgboost.XGBRegressor
的方法:.fit()
: 训练模型fit(X, y, sample_weight=None, eval_set=None, eval_metric=None,
early_stopping_rounds=None,verbose=True, xgb_model=None)
参数:
X
: 一个array-like
,表示训练集y
: 一个序列,表示标记sample_weight
: 一个序列,给出了每个样本的权重eval_set
: 一个列表,元素为(X,y)
,给出了验证集及其标签。它们用于早停。如果有多个验证集,则使用最后一个
eval_metric
: 一个字符串或者可调用对象,用于evaluation metric
- 如果为字符串,则是内置的度量函数的名字
- 如果为可调用对象,则它的签名为
(y_pred,y_true)==>(str,value)
early_stopping_rounds
: 指定早停的次数。参考xgboost.train()
verbose
: 一个布尔值。如果为True
,则打印验证集的评估结果。xgb_model
:一个Booster
实例,或者一个存储了xgboost
模型的文件的文件名。它给出了待训练的模型。这种做法允许连续训练。
.predict()
:执行预测predict(data, output_margin=False, ntree_limit=0)
参数:
data
: 一个DMatrix
对象,表示测试集output_margin
: 一个布尔值。表示是否输出原始的、未经过转换的margin value
ntree_limit
: 一个整数。表示使用多少棵子树来预测。默认值为0,表示使用所有的子树。如果训练的时候发生了早停,则你可以使用
booster.best_ntree_limit
。
返回值:一个
ndarray
,表示预测结果- 对于回归问题,返回的就是原始的预测结果
- 对于分类问题,返回的就是预测类别(阈值为 0.5 )
.predict_proba(data, output_margin=False, ntree_limit=0)
: 执行预测,预测的是各类别的概率参数:参考
.predict()
返回值:一个
ndarray
,表示预测结果它只用于分类问题,返回的是预测各类别的概率
.evals_result()
: 返回一个字典,给出了各个验证集在各个验证参数上的历史值它不同于
cv()
函数的返回值。cv()
函数返回evaluation history
是早停时刻的。而这里返回的是所有的历史值
示例:
class SKLTest:
def __init__(self):
df = pd.read_csv('./data/iris.csv')
_feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']
x = df[_feature_names]
y = df['Class'].map(lambda x: _label_map[x])
self.train_X, self.test_X, self.train_Y, self.test_Y = \
train_test_split(x, y, test_size=0.3, stratify=y, shuffle=True, random_state=1)
def train_test(self):
clf=xgt.XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=100)
clf.fit(self.train_X,self.train_Y,eval_metric='auc',
eval_set=[( self.test_X,self.test_Y),],
early_stopping_rounds=3)
# 训练输出:
# Will train until validation_0-auc hasn't improved in 3 rounds.
# [0] validation_0-auc:0.933333
# ...
# Stopping. Best iteration:
# [2] validation_0-auc:0.997778
print('evals_result:',clf.evals_result())
# evals_result: {'validation_0': {'auc': [0.933333, 0.966667, 0.997778, 0.997778, 0.997778]}}
print('predict:',clf.predict(self.test_X))
# predict: [1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0]