7.2 模型接口

7.2.1 Booster

  1. Boosterxgboost 的模型,它包含了训练、预测、评估等任务的底层实现。

    1. 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) 来加载模型。

  2. 属性:

    通过方法来存取、设置属性。

  3. 方法:

    • .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() 方法,因此需要用下面的策略进行迭代:

      1. for i in range(0,100):
      2. 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 typeintfloat 等表示数据类型的字符串。

        • 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: 一个文件或者一个内存bufferxgboost 从它加载模型
    • .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,表示预测结果

  4. Booster 没有 train 方法。因此有两种策略来获得训练好的 Booster

    • 从训练好的模型的文件中.load_model() 来获取
    • 多次调用.update() 方法
  5. 示例:

    1. import xgboost as xgt
    2. import numpy as np
    3. import pandas as pd
    4. from sklearn.model_selection import train_test_split
    5. _label_map={
    6. # 'Iris-setosa':0, #经过裁剪的,去掉了 iris 中的 setosa 类
    7. 'Iris-versicolor':0,
    8. 'Iris-virginica':1
    9. }
    10. class BoosterTest:
    11. '''
    12. 测试 Booster
    13. '''
    14. def __init__(self):
    15. df=pd.read_csv('./data/iris.csv')
    16. _feature_names=['Sepal Length','Sepal Width','Petal Length','Petal Width']
    17. x=df[_feature_names]
    18. y=df['Class'].map(lambda x:_label_map[x])
    19. train_X,test_X,train_Y,test_Y=train_test_split(x,y,
    20. test_size=0.3,stratify=y,shuffle=True,random_state=1)
    21. self._train_matrix=xgt.DMatrix(data=train_X,label=train_Y,
    22. eature_names=_feature_names,
    23. feature_types=['float','float','float','float'])
    24. self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y,
    25. feature_names=_feature_names,
    26. feature_types=['float', 'float', 'float', 'float'])
    27. self._booster=xgt.Booster(params={
    28. 'booster':'gbtree',
    29. 'silent':0,#打印消息
    30. 'eta':0.1, #学习率
    31. 'max_depth':5,
    32. 'tree_method':'exact',
    33. 'objective':'binary:logistic',
    34. 'eval_metric':'auc',
    35. 'seed':321},
    36. cache=[self._train_matrix,self._validate_matrix])
    37. def test_attribute(self):
    38. '''
    39. 测试属性的设置和获取
    40. :return:
    41. '''
    42. self._booster.set_attr(key1= '1')
    43. print('attr:key1 -> ',self._booster.attr('key1'))
    44. print('attr:key2 -> ',self._booster.attr('key2'))
    45. print('attributes -> ',self._booster.attributes())
    46. def test_dump_model(self):
    47. '''
    48. 测试 dump 模型
    49. :return:
    50. '''
    51. _dump_str=self._booster.get_dump(fmap='model/booster.feature',
    52. with_stats=True,dump_format='text')
    53. print('dump:',_dump_str[0][:20]+'...' if _dump_str else [])
    54. self._booster.dump_model('model/booster.model',
    55. fmap='model/booster.feature',with_stats=True)
    56. def test_train(self):
    57. '''
    58. 训练
    59. :return:
    60. '''
    61. for i in range(0,100):
    62. self._booster.update(self._train_matrix,iteration=i)
    63. print(self._booster.eval(self._train_matrix, name='train', iteration=i))
    64. print(self._booster.eval(self._validate_matrix,name='eval',iteration=i))
    65. def test_importance(self):
    66. '''
    67. 测试特征重要性
    68. :return:
    69. '''
    70. print('fscore:',self._booster.get_fscore('model/booster.feature'))
    71. print('score.weight:', self._booster.get_score(importance_type='weight'))
    72. print('score.gain:', self._booster.get_score(importance_type='gain'))
    73. def test(self):
    74. self.test_attribute()
    75. # attr:key1 -> 1
    76. # attr:key2 -> None
    77. # attributes -> {'key1': '1'}
    78. self.test_dump_model()
    79. # dump: []
    80. self.test_train()
    81. # [0] train-auc:0.980816
    82. # [0] eval-auc:0.933333
    83. # ...
    84. # [99] train-auc:0.998367
    85. # [99] eval-auc:0.995556
    86. self.test_dump_model()
    87. # dump: 0:[f2<4.85] yes=1,no...
    88. self.test_importance()
    89. # score: {'f2': 80, 'f3': 72, 'f0': 6, 'f1': 5}
    90. # score.weight: {'Petal Length': 80, 'Petal Width': 72, 'Sepal Length': 6, 'Sepal Width': 5}
    91. # score.gain: {'Petal Length': 3.6525380337500004, 'Petal Width': 2.2072901486111114, 'Sepal Length': 0.06247816666666667, 'Sepal Width': 0.09243024}
    92. if __name__ == '__main__':
    93. BoosterTest().test()

7.2.2 直接学习

  1. xgboost.train(): 使用给定的参数来训练一个booster

    1. xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None,
    2. maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True,
    3. 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_evalboosting stage 打印出来。另外最后一个boosting stage,以及早停的boosting stageevalutation metric 也会被打印
      • learning_rates: 一个列表,给出了每个迭代步的学习率。

        • 你可以让学习率进行衰减
      • xgb_model: 一个Booster实例,或者一个存储了xgboost 模型的文件的文件名。它给出了待训练的模型。

        这种做法允许连续训练。

      • callbacks: 一个回调函数的列表,它给出了在每个迭代步结束之后需要调用的那些函数。

        你可以使用xgboost 中预定义的一些回调函数(位于xgboost.callback 模块) 。如:

        xgboost.reset_learning_rate(custom_rates)

    • 返回值:一个Booster 对象,表示训练好的模型

  2. xgboost.cv(): 使用给定的参数执行交叉验证 。它常用作参数搜索 。

    1. xgboost.cv(params, dtrain, num_boost_round=10, nfold=3, stratified=False, folds=None,
    2. metrics=(), obj=None, feval=None, maximize=False, early_stopping_rounds=None,
    3. fpreproc=None, as_pandas=True, verbose_eval=None, show_stdv=True, seed=0,
    4. callbacks=None, shuffle=True)
    • 参数:

      • params: 一个列表(元素为键值对)、一个字典,表示训练的参数

      • dtrain:一个DMatrix 对象,表示训练集

      • num_boost_round: 一个整数,表示boosting 迭代数量

      • nfold: 一个整数,表示交叉验证的fold 的数量

      • stratified: 一个布尔值。如果为True,则执行分层采样

      • folds: 一个scikit-learnKFold 实例或者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(此时对应着最优模型),早停之后的结果被抛弃。

  3. 示例:

    1. class TrainTest:
    2. def __init__(self):
    3. df = pd.read_csv('./data/iris.csv')
    4. _feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']
    5. x = df[_feature_names]
    6. y = df['Class'].map(lambda x: _label_map[x])
    7. train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.3,
    8. stratify=y, shuffle=True, random_state=1)
    9. self._train_matrix = xgt.DMatrix(data=train_X, label=train_Y,
    10. feature_names=_feature_names,
    11. feature_types=['float', 'float', 'float', 'float'])
    12. self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y,
    13. feature_names=_feature_names,
    14. feature_types=['float', 'float', 'float', 'float'])
    15. def train_test(self):
    16. params={
    17. 'booster':'gbtree',
    18. 'eta':0.01,
    19. 'max_depth':5,
    20. 'tree_method':'exact',
    21. 'objective':'binary:logistic',
    22. 'eval_metric':['logloss','error','auc']
    23. }
    24. eval_rst={}
    25. booster=xgt.train(params,self._train_matrix,num_boost_round=20,
    26. evals=([(self._train_matrix,'valid1'),(self._validate_matrix,'valid2')]),
    27. early_stopping_rounds=5,evals_result=eval_rst,verbose_eval=True)
    28. ## 训练输出
    29. # Multiple eval metrics have been passed: 'valid2-auc' will be used for early stopping.
    30. # Will train until valid2-auc hasn't improved in 5 rounds.
    31. # [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
    32. # ...
    33. # Stopping. Best iteration:
    34. # [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
    35. print('booster attributes:',booster.attributes())
    36. # 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'}
    37. print('fscore:', booster.get_fscore())
    38. # fscore: {'Petal Length': 8, 'Petal Width': 7}
    39. print('eval_rst:',eval_rst)
    40. # 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]}}
    41. def cv_test(self):
    42. params = {
    43. 'booster': 'gbtree',
    44. 'eta': 0.01,
    45. 'max_depth': 5,
    46. 'tree_method': 'exact',
    47. 'objective': 'binary:logistic',
    48. 'eval_metric': ['logloss', 'error', 'auc']
    49. }
    50. eval_history = xgt.cv(params, self._train_matrix,num_boost_round=20,
    51. nfold=3,stratified=True,metrics=['error', 'auc'],
    52. early_stopping_rounds=5,verbose_eval=True,shuffle=True)
    53. ## 训练输出
    54. # [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
    55. #....
    56. print('eval_history:', eval_history)
    57. # eval_history: test-auc-mean test-auc-std test-error-mean test-error-std \
    58. # 0 0.887626 0.069593 0.112374 0.069593
    59. # 1 0.925821 0.020752 0.112374 0.069593
    60. # 2 0.925821 0.020752 0.098485 0.050631
    61. # train-auc-mean train-auc-std train-error-mean train-error-std
    62. # 0 0.974306 0.003097 0.042874 0.01777
    63. # 1 0.987893 0.012337 0.042874 0.01777
    64. # 2 0.986735 0.011871 0.042874 0.01777

7.2.3 Scikit-Learn API

  1. xgboost 给出了针对scikit-learn 接口的API

  2. xgboost.XGBRegressor: 它实现了scikit-learn 的回归模型API

    1. class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100,
    2. silent=True, objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None,
    3. gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1,
    4. colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1,
    5. 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。取值范围为 7.2 模型接口 - 图1 ,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 正则化系数。它是xgbalpha 参数

    • reg_lambda: 一个浮点数,是L2 正则化系数。它是xgblambda 参数

    • scale_pos_weight: 一个浮点数,用于调整正负样本的权重,常用于类别不平衡的分类问题。默认为 1。

      一个典型的参数值为: 负样本数量/正样本数量

    • base_score:一个浮点数, 给所有样本的一个初始的预测得分。它引入了全局的bias

    • random_state: 一个整数,表示随机数种子。

    • missing: 一个浮点数,它的值代表发生了数据缺失。默认为np.nan

    • kwargs: 一个字典,给出了关键字参数。它用于设置Booster 对象

  3. xgboost.XGBClassifier :它实现了scikit-learn 的分类模型API

    1. class xgboost.XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=100,
    2. silent=True, objective='binary:logistic', booster='gbtree', n_jobs=1,
    3. nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1,
    4. colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1,
    5. scale_pos_weight=1, base_score=0.5, random_state=0, seed=None,
    6. missing=None, **kwargs)

    参数参考xgboost.XGBRegressor

  4. xgboost.XGBClassifierxgboost.XGBRegressor 的方法:

    • .fit(): 训练模型

      1. fit(X, y, sample_weight=None, eval_set=None, eval_metric=None,
      2. 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():执行预测

      1. 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 是早停时刻的。而这里返回的是所有的历史值

  5. 示例:

    1. class SKLTest:
    2. def __init__(self):
    3. df = pd.read_csv('./data/iris.csv')
    4. _feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width']
    5. x = df[_feature_names]
    6. y = df['Class'].map(lambda x: _label_map[x])
    7. self.train_X, self.test_X, self.train_Y, self.test_Y = \
    8. train_test_split(x, y, test_size=0.3, stratify=y, shuffle=True, random_state=1)
    9. def train_test(self):
    10. clf=xgt.XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=100)
    11. clf.fit(self.train_X,self.train_Y,eval_metric='auc',
    12. eval_set=[( self.test_X,self.test_Y),],
    13. early_stopping_rounds=3)
    14. # 训练输出:
    15. # Will train until validation_0-auc hasn't improved in 3 rounds.
    16. # [0] validation_0-auc:0.933333
    17. # ...
    18. # Stopping. Best iteration:
    19. # [2] validation_0-auc:0.997778
    20. print('evals_result:',clf.evals_result())
    21. # evals_result: {'validation_0': {'auc': [0.933333, 0.966667, 0.997778, 0.997778, 0.997778]}}
    22. print('predict:',clf.predict(self.test_X))
    23. # 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]