

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# XGBoost 版本 0.72
<a name="xgboost-72"></a>

**重要**  
亚马逊 AI 已弃用 xgBoost 0.72。 SageMaker 您仍然可以通过拉取其映像 URI 来使用这个旧版本的 XGBoost（作为内置算法），如以下代码示例所示。对于 XGBoost，以 `:1` 结尾的映像 URI 针对的是旧版本。  

```
import boto3
from sagemaker.amazon.amazon_estimator import get_image_uri

xgb_image_uri = get_image_uri(boto3.Session().region_name, "xgboost", repo_version="1")
```

```
import boto3
from sagemaker import image_uris

xgb_image_uri = image_uris.retrieve("xgboost", boto3.Session().region_name, "1")
```
如果您要使用较新的版本，则必须明确指定图像 URI 标签（请参阅[支持的版本](xgboost.md#xgboost-supported-versions)）。

之前版本的亚马逊 A SageMaker I XGBoost 算法基于 0.72 版本。[XGBoost](https://github.com/dmlc/xgboost) (eXtreme Gradient Boosting) 是梯度提升树算法的一种流行且高效的开源实施。梯度提升是一种指导式学习算法，它尝试将一组较简单、较弱的模型的估计值结合在一起，从而准确地预测目标变量。XGBoost 在机器学习竞赛中表现出色，因为它能够强健处理各种数据类型、关系、分布以及由于大量的超参数（可进行优化和调整来改进拟合）。这种灵活性使 XGBoost 成为回归、分类（二元和多元）和排名问题的坚实选择。

客户应考虑使用 [使用亚马逊 AI 的 xgBoost 算法 SageMaker](xgboost.md) 的新版本。他们可以将其用作 A SageMaker I 内置算法，也可以将其用作在本地环境中运行脚本的框架，就像通常使用 Tensorflow 深度学习框架一样。新实施占用内存更少，并且具有更好的日志记录、改进的超参数验证以及一组扩展的指标。如果客户需要推迟迁移到新版本，则以前的 XGBoost 实施仍可供客户使用。但是之前的此实施仍然与 XGBoost 的 0.72 版本保持关联。

## Input/Output xgBoost 版本 0.72 的接口
<a name="xgboost-72-InputOutput"></a>

梯度提升对表格数据进行操作，其中行表示观察、一个列表示目标变量或标签，其余列表示特征。

xgBoost SageMaker 的人工智能实现支持 CSV 和 libsvm 格式进行训练和推理：
+ 对于 “训练” ContentType，有效输入为 *text/libsvm*（默认）或*text/csv*。
+ 对于推理 ContentType，有效输入为*text/libsvm*或（默认）*text/csv*。

**注意**  
对于 CSV 训练，算法假定目标变量在第一列中，而 CSV 没有标头记录。对于 CSV 推理，算法假定 CSV 输入没有标签列。  
对于 libsvm 训练，算法假定标签在第一列中。后续的列包含特征的索引值对（从零开始）。因此，每一行的格式为：<label> <index0>:<value0> <index1>:<value1> ... libsvm 的推理请求可能有也可能没有 libsvm 格式的标签。

这与其他 SageMaker AI 算法不同，后者使用 protobuf 训练输入格式来保持与标准 XGBoost 数据格式的更大一致性。

对于 CSV 训练输入模式，可用于算法的总内存 (实例计数 \* `InstanceType` 中的可用内存) 必须能够容纳训练数据集。对于 libsvm 训练输入模式，它不是必需的，但我们建议使用它。

SageMaker AI xgBoost 在模型中使用 Python pickle 模块，该模块可用于 saving/loading 模型。 serialize/deserialize 

**在开源 xgBoost 中使用使用 SageMaker AI xgBoost 训练过的模型**
+ 使用以下 Python 代码：

  ```
  import pickle as pkl 
  import tarfile
  import xgboost
  
  t = tarfile.open('model.tar.gz', 'r:gz')
  t.extractall()
  
  model = pkl.load(open({{model_file_path}}, 'rb'))
  
  # prediction with test data
  pred = model.predict({{dtest}})
  ```

**使用实例权重支持区分标记数据点的重要性**
+ SageMaker AI xgBoost 允许客户通过为每个实例分配权重值来区分已标记数据点的重要性。对于*text/libsvm*输入，客户可以通过在标签后面附加权重值来为数据实例分配权重值。例如 `label:weight idx_0:val_0 idx_1:val_1...`。要进行*text/csv*输入，客户需要在参数中打开`csv_weights`标记，并在标签后面的列中附加重量值。例如：`label,weight,val_0,val_1,...`。

## XGBoost 版本 0.72 的 EC2 实例推荐
<a name="xgboost-72-Instance"></a>

SageMaker AI xgBoost 目前只能使用 CPU 进行训练。它是一种内存限制型（而不是计算限制型）算法。因此，一般用途的计算实例 (例如 M4) 是比计算优化的实例 (例如 C4) 更适合的选择。此外，我们建议您在选定的实例中有足够的总内存来保存训练数据。尽管它支持使用磁盘空间来处理无法放入主内存的数据 (libsvm 输入模式下可用的内核外功能)，但在磁盘上写入缓存文件会减慢算法处理时间。

## XGBoost 版本 0.72 示例笔记本
<a name="xgboost-72-sample-notebooks"></a>

有关演示如何使用最新版本的 SageMaker AI xgBoost 作为内置算法来训练和托管回归模型的示例笔记本，请参阅使用 [Amazon A SageMaker I XGBoost 算法进行回归](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_abalone.html)。要使用 0.72 版本的 XGBoost，您需要将示例代码中的版本更改为 0.72。有关如何创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择 “**SageMaker AI 示例**” 选项卡以查看所有 SageMaker AI 示例的列表。使用 XGBoost 算法的主题建模示例笔记本位于 **Amazon 算法简介**部分中。要打开笔记本，请单击**使用** 选项卡，然后选择**创建副本**。

## XGBoost 版本 0.72 超参数
<a name="xgboost-72-hyperparameters"></a>

下表包含 XGBoost 算法的超参数。这些是由用户设置的参数，以便于从数据中评估模型参数。首先，按字母顺序列出必须设置的所需超参数。接下来，也按字母顺序列出可以设置的可选超参数。 SageMaker AI xgBoost 算法是开源 XGBoost 软件包的实现。当前 SageMaker AI 支持 0.72 版。有关此 XGBoost 版本的超参数配置的详细信息，请参阅 [XGBoost 参数](https://xgboost.readthedocs.io/en/release_0.72/parameter.html)。


| 参数名称 | 说明 | 
| --- | --- | 
| num\_class | 类的数量。<br />在 `objective` 设置为 *multi:softmax* 或 *multi:softprob* 时**必需**。<br />有效值：整数 | 
| num\_round | 运行训练的轮数。<br />**必填**<br />有效值：整数 | 
| alpha | 权重上的 L1 正则化项。增加此值会使模型更加保守。<br />**可选**<br />有效值：浮点值<br />默认值：0 | 
| base\_score | 所有实例的初始预测分数，全局偏移。<br />**可选**<br />有效值：浮点值<br />默认值：0.5 | 
| booster | 要使用的助推程序。`gbtree` 和 `dart` 值使用基于树的模型，而 `gblinear` 使用线性函数。<br />**可选**<br />有效值：字符串。`gbtree`、`gblinear` 或 `dart`。<br />默认值：`gbtree` | 
| colsample\_bylevel | 每个级别中每个拆分的列的子样本比率。<br />**可选**<br />有效值：浮点值。范围：[0,1]。<br />默认值：1 | 
| colsample\_bytree | 构造每个树时列的子样本比率。<br />**可选**<br />有效值：浮点值。范围：[0,1]。<br />默认值：1 | 
| csv\_weights | 启用此标志时，对于 csv 输入，XGBoost 通过获取训练数据中的第二列（标签后的一列）作为实例权重，以此来区分实例的重要性。<br />**可选**<br />有效值：0 或 1<br />默认值：0 | 
| early\_stopping\_rounds | 模型会一直训练直到验证分数停止改善。要继续训练，验证错误至少需要在每 `early_stopping_rounds` 轮中有所减少。 SageMaker AI 托管使用最佳模型进行推理。<br />**可选**<br />有效值：整数<br />默认值: - | 
| eta | 在更新中用于防止过度适合的步骤大小收缩。在每个提升步骤之后，您可以直接获得新特征的权重。`eta` 参数实际上缩小了特征权重，使提升过程更加保守。<br />**可选**<br />有效值：浮点值。范围：[0,1]。<br />默认值：0.3 | 
| eval\_metric | 验证数据的评估指标。根据目标分配默认指标：+  `rmse`：用于回归 <br />+  `error`：用于分类 <br />+  `map`：用于排名 <br />有关有效输入的列表，请参阅 [XGBoost 参数](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。<br />**可选**<br />有效值：字符串<br />默认值：根据目标默认。 | 
| gamma | 在树的叶节点上进行进一步分区所需的最小损失减少。该值越大，算法越保守。<br />**可选**<br />有效值：浮点值。范围：[0,∞)。<br />默认值：0 | 
| grow\_policy | 控制将新节点添加到树中的方式。目前，仅在 `tree_method` 设置为 `hist` 时受支持。<br />**可选**<br />有效值：字符串。`depthwise` 或 `lossguide`。<br />默认值：`depthwise` | 
| lambda | 权重上的 L2 正则化项。增加此值会使模型更加保守。<br />**可选**<br />有效值：浮点值<br />默认值：1 | 
| lambda\_bias | 偏移上的 L2 正则化项。<br />**可选**<br />有效值：浮点值。范围：[0.0, 1.0]。<br />默认值：0 | 
| max\_bin | 离散分箱到存储桶连续特征的最大数量。仅在 `tree_method` 设置为 `hist` 时才会使用。<br />**可选**<br />有效值：整数<br />默认值：256 | 
| max\_delta\_step | 每个树的权重估计允许的最大增量步骤。当使用正整数时，它有助于使更新更加保守。首选选项是在逻辑回归中使用它。将其设置为 1-10 可帮助控制更新。<br />**可选**<br />有效值：整数。范围：[0,∞)。<br />默认值：0 | 
| max\_depth | 树的最大深度。增加这个值会使模型更复杂，并可能会过度拟合。0 表示没有限制。当 `grow_policy`=`depth-wise` 时，需要限制。<br />**可选**<br />有效值：整数。范围：[0,∞)<br />默认值：6 | 
| max\_leaves | 要添加的最大节点数。仅当 `grow_policy` 设为 `lossguide` 时相关。<br />**可选**<br />有效值：整数<br />默认值：0 | 
| min\_child\_weight | 子项中所需的最小实例权重总和 (hessian)。如果树分区步骤导致叶节点的实例权重总和小于 `min_child_weight` 的总和，则生成过程会放弃进一步的分区。在线性回归模型中，这只是对应于每个节点中所需的最小实例数。算法越大，就越保守。<br />**可选**<br />有效值：浮点值。范围：[0,∞)。<br />默认值：1 | 
| normalize\_type | 标准化算法的类型。<br />**可选**<br />有效值：*tree* 或 *forest*。<br />默认值：*tree* | 
| nthread | 用于运行 *xgboost* 的并行线程数量。<br />**可选**<br />有效值：整数<br />默认值：最大线程数。 | 
| objective | 指定学习任务和相应的学习目标。示例：`reg:logistic`、`reg:softmax`、`multi:squarederror`。有关有效输入的完整列表，请参阅 [XGBoost 参数](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。<br />**可选**<br />有效值：字符串<br />默认值：`reg:squarederror` | 
| one\_drop | 启用此标记后，在丢弃期间至少会丢弃一个树。<br />**可选**<br />有效值：0 或 1<br />默认值：0 | 
| process\_type | 要运行的提升过程的类型。<br />**可选**<br />有效值：字符串。`default` 或 `update`。<br />默认值：`default` | 
| rate\_drop | 丢弃比率，指定在丢弃期间要丢弃的一小部分以前的树。<br />**可选**<br />有效值：浮点值。范围：[0.0, 1.0]。<br />默认值：0.0 | 
| refresh\_leaf | 这是“刷新”更新者插件的参数。当设置为 `true` (1) 时，树叶和树节点统计数据会更新。当设置为 `false` (0) 时，只有树节点统计数据会更新。<br />**可选**<br />有效值： 0/1<br />默认值：1 | 
| sample\_type | 采样算法的类型。<br />**可选**<br />有效值：`uniform` 或 `weighted`。<br />默认值：`uniform` | 
| scale\_pos\_weight | 控制正负权重的平衡。它对不平衡的类很有用。可考虑的典型值：`sum(negative cases)` / `sum(positive cases)`。<br />**可选**<br />有效值：浮点值<br />默认值：1 | 
| seed | 随机数种子。<br />**可选**<br />有效值：整数<br />默认值：0 | 
| silent | 0 表示打印运行消息，1 表示静默模式。<br />有效值：0 或 1<br />**可选**<br />默认值：0 | 
| sketch\_eps | 仅用于近似贪婪算法。这会转换为 O(1 / `sketch_eps`) 分箱数。与直接选择分箱数相比，这附带了具有草图准确率的理论保证。<br />**可选**<br />有效值：浮点型，范围：[0, 1]。<br />默认值：0.03 | 
| skip\_drop | 在提升迭代期间跳过丢弃过程的概率。<br />**可选**<br />有效值：浮点值。范围：[0.0, 1.0]。<br />默认值：0.0 | 
| subsample | 训练实例的子样本比率。将其设置为 0.5 意味着 XGBoost 随机收集一半数据实例来让树长大。这会防止过度适合<br />**可选**<br />有效值：浮点值。范围：[0,1]。<br />默认值：1 | 
| tree\_method | 在 XGBoost 中使用的树构造算法。<br />**可选**<br />有效值：`auto`、`exact`、`approx` 或 `hist` 之一。<br />默认值：`auto` | 
| tweedie\_variance\_power | 控制 Tweedie 分布的方差的参数。<br />**可选**<br />有效值：浮点值。范围：(1, 2)。<br />默认值：1.5 | 
| updater | 一个逗号分隔的字符串，它定义要运行的树更新者序列。这提供了构造和修改树的模块化方法。<br />有关有效输入的完整列表，请参阅 [XGBoost 参数](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst)。<br />**可选**<br />有效值：逗号分隔的字符串。<br />默认值：`grow_colmaker`、prune | 

## 调整 XGBoost 版本 0.72 模型
<a name="xgboost-72-tuning"></a>

*自动模型调整*也称作超参数调整，是指通过在您的训练数据集和验证数据集上运行多个作业来测试一系列超参数，从而查找模型的最佳版本。您可以选择三种类型的超参数：
+ 一个学习 `objective` 函数，用于在模型训练期间进行优化
+ `eval_metric`，用于在验证期间评估性能
+ 自动调整模型时要使用的一组超参数和一系列值，供每个参数使用

您可以从算法计算的评估指标集合中选择一个评估指标。自动模型优化将搜索所选超参数，以找到值组合，获得能够对评估指标进行优化的模型。

有关模型优化的更多信息，请参阅[使用 SageMaker AI 自动调整模型](automatic-model-tuning.md)。

### 由 XGBoost 版本 0.72 算法计算的指标
<a name="xgboost-72-metrics"></a>

基于版本 0.72 的 XGBoost 算法计算以下九个指标，以用于模型验证。在调整模型时，请从这些指标中选择一个来评估模型。有关有效 `eval_metric` 值的完整列表，请参阅 [XGBoost 学习任务参数](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。


| 指标名称 | 说明 | 优化方向 | 
| --- | --- | --- | 
| validation:auc | 曲线下方的区域。 | 最大化 | 
| validation:error | 二元分类错误率，计算方式为错误用例数/所有用例数。 | 最小化 | 
| validation:logloss | 负对数似然。 | 最小化 | 
| validation:mae | 平均绝对误差。 | 最小化 | 
| validation:map | 平均查准率。 | 最大化 | 
| validation:merror | 多元分类错误率，计算方式为错误用例数/所有用例数。 | 最小化 | 
| validation:mlogloss | 多元分类的负对数似然。 | 最小化 | 
| validation:ndcg | 标准化折扣累积收益。 | 最大化 | 
| validation:rmse | 均方根误差。 | 最小化 | 

### 可优化 XGBoost 版本 0.72 超参数
<a name="xgboost-72-tunable-hyperparameters"></a>

使用以下超参数优化 XGBoost 模型。对优化 XGBoost 评估指标影响最大的超参数包括：`alpha`、`min_child_weight`、`subsample`、`eta` 和 `num_round`。


| 参数名称 | 参数类型 | 建议的范围 | 
| --- | --- | --- | 
| alpha | ContinuousParameterRanges | MinValue: 0, MaxValue: 1000 | 
| colsample\_bylevel | ContinuousParameterRanges | MinValue: 0.1， MaxValue: 1 | 
| colsample\_bytree | ContinuousParameterRanges | MinValue: 0.5， MaxValue: 1 | 
| eta | ContinuousParameterRanges | MinValue: 0.1， MaxValue: 0.5 | 
| gamma | ContinuousParameterRanges | MinValue: 0, MaxValue: 5 | 
| lambda | ContinuousParameterRanges | MinValue: 0, MaxValue: 1000 | 
| max\_delta\_step | IntegerParameterRanges | [0, 10] | 
| max\_depth | IntegerParameterRanges | [0, 10] | 
| min\_child\_weight | ContinuousParameterRanges | MinValue: 0, MaxValue: 120 | 
| num\_round | IntegerParameterRanges | [1, 4000] | 
| subsample | ContinuousParameterRanges | MinValue: 0.5， MaxValue: 1 | 