

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# XGBoost 演算法搭配 Amazon SageMaker AI
<a name="xgboost"></a>

[XGBoost](https://github.com/dmlc/xgboost) (eXtreme Gradient Boosting) 為一款熱門的有效率梯度提升樹演算法開放原始碼實作。梯度提升是監督式學習演算法，藉由結合一組較簡單模型的多個預估值，來嘗試精確預測目標變數。XGBoost 演算法在機器學習競賽中表現優異，原因如下：
+ 它能夠穩健地處理各種資料類型、關係、分佈。
+ 它擁有豐富的超參數可供微調。

您可以使用 XGBoost 為問題進行迴歸、分類 (二進位和多類) 和排名。

您可以將新版本的 XGBoost 演算法用作：
+ Amazon SageMaker AI 內建演算法。
+ 在本機環境中執行訓練指令碼的架構。

相較於原始版本，此實作具有更小的記憶體使用量、更好的記錄、已改善的超參數驗證，以及更大的指標集。它提供 XGBoost `estimator`，可在受管 XGBoost 環境中執行訓練指令碼。SageMaker AI XGBoost 的目前版本是以原始 XGBoost 版本 1.0、1.2、1.3、1.5、1.7 和 3.0 為基礎。

如需 Amazon SageMaker AI XGBoost 演算法的詳細資訊，請參閱下列部落格文章：
+ [開放原始碼 Amazon SageMaker AI XGBoost 演算法容器簡介](https://aws.amazon.com/blogs/machine-learning/introducing-the-open-source-amazon-sagemaker-xgboost-algorithm-container/)
+ [Amazon SageMaker AI XGBoost 現在提供完全分散式 GPU 訓練](https://aws.amazon.com/blogs/machine-learning/amazon-sagemaker-xgboost-now-offers-fully-distributed-gpu-training/)

## 支援的版本
<a name="xgboost-supported-versions"></a>

如需詳細資訊，請參閱我們的[支援政策](https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-support-policy.html#pre-built-containers-support-policy-ml-framework)。
+ 架構 （開放原始碼） 模式：1.2-1、1.2-2、1.3-1、1.5-1、1.7-1、3.0-5
+ 演算法模式：1.2-1、1.2-2、1.3-1、1.5-1、1.7-1、3.0-5

**警告**  
由於所需的運算容量，SageMaker AI XGBoost 3.0-5 版與 P3 執行個體系列中用於訓練或推論的 GPU 執行個體不相容。

**警告**  
由於套件相容，SageMaker AI XGBoost 3.0-5 版不支援 SageMaker 除錯器。

**警告**  
由於所需的運算容量，SageMaker AI XGBoost 1.7-1 版與 P2 執行個體系列用於訓練或推論的 GPU 執行個體不相容。

**警告**  
網路隔離模式：請勿升級超過 25.2 版的 pip。較新版本可能會嘗試在模組安裝期間從 PyPI 擷取設定工具。

**重要**  
擷取 SageMaker AI XGBoost 映像 URI 時，請勿使用 `:latest` 或 `:1` 作為映像 URI 標記。您必須指定 [支援的版本](#xgboost-supported-versions) 其中之一，才能選擇由 SageMaker AI 管理的 XGBoost 容器，其中包含您要使用的原生 XGBoost 套件版本。若要尋找移轉至 SageMaker AI XGBoost 容器的套件版本，請參閱 [Docker 登錄檔路徑和範例程式碼](https://docs.aws.amazon.com/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths.html)。然後選擇您的 AWS 區域，然後導覽至 **XGBoost （演算法） **區段。

**警告**  
XGBoost 0.90 版本已停用。不再對 XGBoost 0.90 進行安全性更新或錯誤修正。強烈建議您將 XGBoost 版本升級至較新的版本之一。

**注意**  
SageMaker AI 不支援 XGBoost 1.1 版。當測試輸入的特徵少於 LIBSVM 輸入內的訓練資料時，XGBoost 1.1 執行預測的功能會中斷。這項功能在 XGBoost v1.2 已恢復。請考慮使用 SageMaker AI XGBoost 1.2-2 或更新的版本。

**注意**  
您可以使用 XGBoost 1.0-1 版，但並未正式支援。

## 適用於 XGBoost 演算法的 EC2 執行個體建議
<a name="Instance-XGBoost"></a>

SageMaker AI XGBoost 支援 CPU 和 GPU 訓練和推論。建議的執行個體取決於訓練和推論需求，以及 XGBoost 演算法的版本。請選擇以下選項，以取得詳細的資訊：
+ [CPU 訓練](#Instance-XGBoost-training-cpu)
+ [GPU 訓練](#Instance-XGBoost-training-gpu)
+ [分散式 GPU 訓練](#Instance-XGBoost-distributed-training-cpu)
+ [分散式 GPU 訓練](#Instance-XGBoost-distributed-training-gpu)
+ [Inference](#Instance-XGBoost-inference)

### 培訓
<a name="Instance-XGBoost-training"></a>

SageMaker AI XGBoost 演算法支援 CPU 和 GPU 訓練。

#### CPU 訓練
<a name="Instance-XGBoost-training-cpu"></a>

SageMaker AI XGBoost 1.0-1 或之前版本，僅使用 CPU 進行訓練。這是一個記憶體限制型 (相對於運算限制型) 的演算法。因此，一般用途的運算執行個體 (如 M5) 相較於運算最佳化執行個體 (如 C4)，是較好的選擇。此外，我們建議您在所選執行個體中需有足夠的總記憶體才可保留訓練資料。它支援使用磁碟空間來處理不符合主要記憶體的資料。這是 libsvm 輸入模式的核心外功能的結果。即使如此，將快取檔案寫入磁碟也會減慢演算法處理時間。

#### GPU 訓練
<a name="Instance-XGBoost-training-gpu"></a>

SageMaker AI XGBoost 1.2-2 版或更新的版本支援 GPU 訓練。雖然每個執行個體的成本較高，但 GPU 的訓練速度更快，更具成本效益。

SageMaker AI XGBoost 1.2-2 版或更新的版本支援 P2、P3、G4dn 和 G5 GPU 執行個體系列。

SageMaker AI XGBoost 1.7-1 版本或更新的版本支援 P3、G4dn 和 G5 GPU 執行個體系列。請注意，由於運算容量需求，1.7-1 版或更新的版本不支援 P2 執行個體系列。

SageMaker AI XGBoost 3.0-5 版或更新版本支援 G4dn 和 G5 GPU 執行個體系列。請注意，由於運算容量需求，3.0-5 版或更新版本不支援 P3 執行個體系列。

若要利用 GPU 訓練：
+ 將執行個體類型指定為其中一個 GPU 執行個體 （例如 G4dn) 
+ 在您現有的 XGBoost 指令碼中將 `tree_method` 超參數設定為 `gpu_hist`

### 分散式訓練
<a name="Instance-XGBoost-distributed-training"></a>

SageMaker AI XGBoost 支援 CPU 和 GPU 執行個體用於分散式訓練。

#### 分散式 GPU 訓練
<a name="Instance-XGBoost-distributed-training-cpu"></a>

若要在多個執行個體上執行 CPU 訓練，請將估算器的參數 `instance_count` 設定為大於 1 的值。輸入資料必須分割予全數的執行個體。

##### 分割輸入資料予多個執行個體
<a name="Instance-XGBoost-distributed-training-divide-data"></a>

使用以下步驟分割輸入資料：

1. 將輸入資料分解成較小的檔案。檔案數目至少應等於用於分散式訓練的執行個體總數。使用多個較小的檔案 (而不是一個大型檔案) 也會減少訓練工作資料下載時間。

1. 建立您的[訓練輸入](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)時，請將分配參數設定為 `ShardedByS3Key`。使用此設定，如果在訓練任務中指定了 *n* 個執行個體，則每個執行個體在 S3 中取得的檔案數量約為 *1/n*。

#### 分散式 GPU 訓練
<a name="Instance-XGBoost-distributed-training-gpu"></a>

您可以將分散式訓練用於單一 GPU 或多 GPU 執行個體。

**單一 GPU 執行個體分散式訓練**

SageMaker AI XGBoost 1.2-2 至 1.3-1 版僅支援單一 GPU 執行個體訓練。這表示即使您選取了一個多 GPU 執行個體，每個執行個體也只會使用一個 GPU。

如果出現以下情況，則必須將輸入資料分割予全數的執行個體：
+ 您使用 XGBoost 1.2-2 版到 1.3-1 版。
+ 您不需要使用多 GPU 執行個體。

 如需詳細資訊，請參閱[分割輸入資料予多個執行個體](#Instance-XGBoost-distributed-training-divide-data)。

**注意**  
1.2-2 至 1.3-1 版的 SageMaker AI XGBoost 每個執行個體只使用一個 GPU，即使您選擇了多 GPU 執行個體亦然。

**用多 GPU 執行個體進行分散式訓練**

從 1.5-1 版開始，SageMaker AI XGBoost 以 [Dask](https://www.dask.org/) 提供分散式 GPU 訓練。使用 Dask，您可以在使用一個或多個多 GPU 執行個體時，用上所有的 GPU。在使用單一 GPU 執行個體時也可以使用 Dask。

使用下列步驟以 Dask 進行訓練：

1. 您可以省略[訓練輸入](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html)中的 `distribution` 參數，或將其設定為 `FullyReplicated`。

1. 定義超參數時，請將 `use_dask_gpu_training` 設定為 `"true"`。

**重要**  
Dask 的分散式訓練僅支援 CSV 和 Parquet 輸入格式。如果您使用其他資料格式 (例如 LIBSVM 或 PROTOBUF)，則訓練工作會失敗。  
對於 Parquet 資料，請確保欄的名稱儲存為字串。名稱為其他資料類型的欄將無法載入。

**重要**  
Dask 的分散式訓練不支援管道模式。如果指定管道模式，則訓練工作會失敗。

以 Dask 訓練 SageMaker AI XGBoost 時，有些事項需要注意。請務必將您的資料分割成較小的檔案。Dask 讀取每個 Parquet 檔案時，將其視為一個分割區。每個 GPU 都有一個 Dask 工作者。因此檔案數量應大於 GPU 的總數 (執行個體數 \$1 每個執行個體的 GPU 數)。有大量的檔案也會降低效能。如需詳細資訊，請參閱 [Dask 最佳實務](https://docs.dask.org/en/stable/best-practices.html)。

#### 輸出的變化
<a name="Instance-XGBoost-distributed-training-output"></a>

指定的超參數 `tree_method` 會決定用於 XGBoost 訓練的演算法。樹方法 `approx`、`hist` 和 `gpu_hist` 都是近似法，且使用草圖進行分位數計算。如需詳細資訊，請參閱 XGBoost 文件中的[樹方法](https://xgboost.readthedocs.io/en/stable/treemethod.html)一節。草圖是一種近似值演算法。因此，您可以預期模型會有變化，這取決於一些因素，例如選擇用於分散式訓練的工作者數量。變化的意義與資料有關。

### Inference
<a name="Instance-XGBoost-inference"></a>

SageMaker AI XGBoost 支援以 CPU 和 GPU 執行個體進行推論。如需用於推論之執行個體類型的相關資訊，請參閱 [Amazon SageMaker AI ML 執行個體類型](https://aws.amazon.com/sagemaker/pricing/)。

# 如何使用 SageMaker AI XGBoost
<a name="xgboost-how-to-use"></a>

您可以透過 SageMaker AI 使用 XGBoost 做為內建演算法或框架。將 XGBoost 作為框架時，您具備更多彈性並且可存取更進階的案例，因為您可以自訂自己的訓練指令碼。下列各節說明如何搭配 SageMaker Python SDK 使用 XGBoost，以及 XGBoost 演算法的輸入/輸出介面。如需如何從 Amazon SageMaker Studio Classic 使用者介面使用 XGBoost 的資訊，請參閱[SageMaker JumpStart 預先訓練模型](studio-jumpstart.md)。

**Topics**
+ [使用 XGBoost 做為框架](#xgboost-how-to-framework)
+ [使用 XGBoost 做為內建演算法](#xgboost-how-to-built-in)
+ [XGBoost 演算法的輸入/輸出介面](#InputOutput-XGBoost)

## 使用 XGBoost 做為框架
<a name="xgboost-how-to-framework"></a>

使用 XGBoost 做為執行您自訂指令碼的框架，可將其他資料處理納入您的訓練任務。在下列程式碼範例中，SageMaker Python SDK 提供 XGBoost API 做為架構。此功能類似於 SageMaker AI 提供其他架構 API (例如 TensorFlow、MXNet 和 PyTorch) 的方式。

```
import boto3
import sagemaker
from sagemaker.xgboost.estimator import XGBoost
from sagemaker.session import Session
from sagemaker.inputs import TrainingInput

# initialize hyperparameters
hyperparameters = {
        "max_depth":"5",
        "eta":"0.2",
        "gamma":"4",
        "min_child_weight":"6",
        "subsample":"0.7",
        "verbosity":"1",
        "objective":"reg:squarederror",
        "num_round":"50"}

# set an output path where the trained model will be saved
bucket = sagemaker.Session().default_bucket()
prefix = 'DEMO-xgboost-as-a-framework'
output_path = 's3://{}/{}/{}/output'.format(bucket, prefix, 'abalone-xgb-framework')

# construct a SageMaker AI XGBoost estimator
# specify the entry_point to your xgboost training script
estimator = XGBoost(entry_point = "your_xgboost_abalone_script.py", 
                    framework_version='1.7-1',
                    hyperparameters=hyperparameters,
                    role=sagemaker.get_execution_role(),
                    instance_count=1,
                    instance_type='ml.m5.2xlarge',
                    output_path=output_path)

# define the data type and paths to the training and validation datasets
content_type = "libsvm"
train_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'train'), content_type=content_type)
validation_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'validation'), content_type=content_type)

# execute the XGBoost training job
estimator.fit({'train': train_input, 'validation': validation_input})
```

如需使用 SageMaker AI XGBoost 做為框架的完整範例，請參閱[使用 Amazon SageMaker AI XGBoost 進行迴歸](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_abalone_dist_script_mode.html)

## 使用 XGBoost 做為內建演算法
<a name="xgboost-how-to-built-in"></a>

使用 XGBoost 內建演算法來建置 XGBoost 訓練容器，如下面的程式碼範例所示。您可以使用 SageMaker AI `image_uris.retrieve` API 自動找出 XGBoost 內建演算法映像 URI。如果使用 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 第 1 版，請使用 `get_image_uri` API。若要確保 `image_uris.retrieve` API 找到正確的 URI，請參閱[內建演算法的常見參數](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html)。然後從內建演算法映像 URI 和可用區域的完整清單中查詢 `xgboost`。

指定 XGBoost 映像 URI 後，您可以透過使用 XGBoost 容器來建置使用 SageMaker AI 估算器 API 的估算器，並啟動訓練任務。這個 XGBoost 內建演算法模式不會納入您自己的 XGBoost 訓練指令碼中，並且會直接在輸入資料集上執行。

**重要**  
擷取 SageMaker AI XGBoost 映像 URI 時，請勿使用 `:latest` 或 `:1` 作為映像 URI 標記。您必須指定 [支援的版本](xgboost.md#xgboost-supported-versions) 其中之一，才能選擇由 SageMaker AI 管理的 XGBoost 容器，其中包含您要使用的原生 XGBoost 套件版本。若要尋找移轉至 SageMaker AI XGBoost 容器的套件版本，請參閱 [Docker 登錄檔路徑和範例程式碼](https://docs.aws.amazon.com/sagemaker/latest/dg-ecr-paths/sagemaker-algo-docker-registry-paths.html)。然後選擇您的 AWS 區域、導覽至 **XGBoost (演算法)** 區段。

```
import sagemaker
import boto3
from sagemaker import image_uris
from sagemaker.session import Session
from sagemaker.inputs import TrainingInput

# initialize hyperparameters
hyperparameters = {
        "max_depth":"5",
        "eta":"0.2",
        "gamma":"4",
        "min_child_weight":"6",
        "subsample":"0.7",
        "objective":"reg:squarederror",
        "num_round":"50"}

# set an output path where the trained model will be saved
bucket = sagemaker.Session().default_bucket()
prefix = 'DEMO-xgboost-as-a-built-in-algo'
output_path = 's3://{}/{}/{}/output'.format(bucket, prefix, 'abalone-xgb-built-in-algo')

# this line automatically looks for the XGBoost image URI and builds an XGBoost container.
# specify the repo_version depending on your preference.
xgboost_container = sagemaker.image_uris.retrieve("xgboost", region, "1.7-1")

# construct a SageMaker AI estimator that calls the xgboost-container
estimator = sagemaker.estimator.Estimator(image_uri=xgboost_container, 
                                          hyperparameters=hyperparameters,
                                          role=sagemaker.get_execution_role(),
                                          instance_count=1, 
                                          instance_type='ml.m5.2xlarge', 
                                          volume_size=5, # 5 GB 
                                          output_path=output_path)

# define the data type and paths to the training and validation datasets
content_type = "libsvm"
train_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'train'), content_type=content_type)
validation_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'validation'), content_type=content_type)

# execute the XGBoost training job
estimator.fit({'train': train_input, 'validation': validation_input})
```

如需如何將 XGBoost 設定為內建演算法的詳細資訊，請參閱下列筆記本範例。
+ [XGBoost 的受管 Spot 訓練](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_managed_spot_training.html)
+ [使用 Amazon SageMaker AI XGBoost 進行迴歸 (Parquet 輸入)](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_parquet_input_training.html)

## XGBoost 演算法的輸入/輸出介面
<a name="InputOutput-XGBoost"></a>

梯度提升在表格式資料中操作，含有代表觀察的行、還有一個代表目標變數或標籤的欄，而剩下的欄則代表功能。

XGBoost 的 SageMaker AI 實作支援以下資料格式用於訓練與推論：
+  *text/libsvm* (預設值) 
+  *text/csv*
+  *application/x-parquet*
+  *application/x-recordio-protobuf*

**注意**  
關於訓練和推論的輸入，有些注意事項需注意：  
為了提高效能，我們建議使用具有*檔案模式*的 XGBoost，其中來自 Amazon S3 的資料存放在訓練執行個體磁碟區中。
以單欄式輸入的訓練，演算法假設目標變數 (標籤) 是在第一欄。對於推論，演算法假設輸入中沒有標籤欄。
對於 CSV 資料，輸入中不應有標題記錄。
對於 LIBSVM 訓練，演算法會假設標籤欄後續各欄包含零基特徵的索引值配對。因此每個資料列的格式皆為：<label> <index0>:<value0> <index1>:<value1>。
如需執行個體類型和分散式訓練的資訊，請參閱[適用於 XGBoost 演算法的 EC2 執行個體建議](xgboost.md#Instance-XGBoost)。

對於 CSV 訓練輸入模式，可供演算法使用的總記憶體需可保留訓練資料集。可用的記憶體總數計算為 `Instance Count * the memory available in the InstanceType`。libsvm 訓練輸入模式並非必要，但建議使用。

針對 v1.3-1 及更新的版本，SageMaker AI XGBoost 使用 `Booster.save_model` 以 XGBoost 內部二進位格式儲存模型。之前的版本使用 Python 保存模組將模型序列化/取消序列化。

**注意**  
在開放原始碼 XGBoost 中使用 SageMaker AI XGBoost 模型時，請留意其版本。1.3-1 版及更新的版本使用 XGBoost 內部二進位格式，而之前的版本使用 Python 保存模組。

**在開放原始碼 XGBoost 中使用以 SageMaker AI XGBoost v1.3-1 或更新的版本訓練的模型**
+ 使用以下 Python 程式碼：

  ```
  import xgboost as xgb
  
  xgb_model = xgb.Booster()
  xgb_model.load_model(model_file_path)
  xgb_model.predict(dtest)
  ```

**在開放原始碼 XGBoost 中使用以之前的 SageMaker AI XGBoost 版本訓練的模型**
+ 使用以下 Python 程式碼：

  ```
  import pickle as pkl 
  import tarfile
  
  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 範例筆記本
<a name="xgboost-sample-notebooks"></a>

下列清單包含了解決 Amazon SageMaker AI XGBoost 演算法不同使用案例的各種範例 Jupyter 筆記本。
+ [如何建立自訂 XGBoost 容器](https://sagemaker-examples.readthedocs.io/en/latest/aws_sagemaker_studio/sagemaker_studio_image_build/xgboost_bring_your_own/Batch_Transform_BYO_XGB.html) – 本筆記本說明如何使用 Amazon SageMaker AI Batch Transform 建立自訂的 XGBoost 容器。
+ [使用 Parquet 進行 XGBoost 迴歸](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_parquet_input_training.html) – 此筆記本展示如何使用 Parquet 中的鮑魚資料集來訓練 XGBoost 模型。
+ [如何訓練和託管多類別分類模型](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_mnist/xgboost_mnist.html) – 此筆記本說明如何使用 MNIST 資料集來訓練和託管多類別分類模型。
+ [如何訓練客戶流失預測模型](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_applying_machine_learning/xgboost_customer_churn/xgboost_customer_churn.html) – 此筆記本說明如何訓練模型以預測手機客戶流失，以便找出不滿意的客戶。
+ [介紹適用於 XGBoost 訓練的 Amazon SageMaker AI 受管 Spot 基礎設施](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_managed_spot_training.html) – 此筆記本說明如何使用 Spot 執行個體搭配 XGBoost 容器進行訓練。
+ [如何使用 Amazon SageMaker Debugger 即時對 XGBoost 訓練任務進行偵錯](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-debugger/xgboost_census_explanations/xgboost-census-debugger-rules.html) – 此筆記本說明如何使用 Amazon SageMaker Debugger 監控訓練任務，以內建偵錯規則偵測不一致的情況。

有關如何建立和存取可用於在 SageMaker AI 中執行範例的 Jupyter 筆記本執行個體的說明，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。建立並開啟筆記本執行個體後，請選擇 **SageMaker AI 範例**索引標籤，查看所有 SageMaker AI 範例清單。使用線性學習演算法模組化範例筆記本的主題位於 **Amazon 演算法簡介**一節。若要開啟筆記本，請選擇其**使用**標籤，然後選擇**建立複本**。

# SageMaker AI XGBoost 演算法的運作方式
<a name="xgboost-HowItWorks"></a>

[XGBoost](https://github.com/dmlc/xgboost) 為一款熱門的有效率梯度提升樹演算法開放原始碼實作。梯度提升是監督式學習演算法，會藉由結合一組較簡單、較脆弱的模型預估值來嘗試精確預測目標變數。

針對迴歸使用[梯度提升](https://en.wikipedia.org/wiki/Gradient_boosting)時，較弱的學習程式為迴歸樹，而每個迴歸樹都會將一個輸入資料點映射到其中一個包含連續分數的分葉。XGBoost 會將標準化 (L1 and L2) 目標函式最小化，結合凸面遺失函式 (根據預測與目標輸出間的差異) 以及模型複雜度的懲罰詞彙 (也就是回歸樹函式)。訓練將反覆執行，加入預測舊樹的殘差或錯誤的新樹狀，接著將舊樹與新樹結合以執行最終預測。這便稱為梯度提升，因為它使用梯度下降演算法來降低新增模型時造成的遺失。

 下面是關於梯度樹提升如何運作的簡要說明。

![\[說明梯度樹提升的圖表。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/xgboost_illustration.png)


**如需 XGBoost 的詳細資訊，請參閱：**
+ [XGBoost：可擴展的樹提升系統](https://arxiv.org/pdf/1603.02754.pdf)
+ [梯度樹提升](https://www.sas.upenn.edu/~fdiebold/NoHesitations/BookAdvanced.pdf#page=380)
+ [提升樹簡介](https://xgboost.readthedocs.io/en/latest/tutorials/model.html)

# XGBoost 超參數
<a name="xgboost_hyperparameters"></a>

下表包含 Amazon SageMaker AI XGBoost 演算法所需或最常用的超參數子集。這些是由使用者設定的參數，用來協助從資料預估模型參數。首先列出的是必須設定的超參數，依字母順序排列。接著列出的是選用的超參數，也是依字母順序排列。SageMaker AI XGBoost 演算法是開放原始碼 DMLC XGBoost 套件的實作。如需可針對此版本 XGBoost 設定的一組完整超參數詳細資訊，請參閱 [XGBoost 參數](https://xgboost.readthedocs.io/en/release_1.2.0/)。


| 參數名稱 | Description | 
| --- | --- | 
| num\$1class |  類別數。 若 `objective` 設為 *multi:softmax* 或 *multi:softprob* 則為**必要**。 有效值：整數。  | 
| num\$1round |  執行訓練的捨入數。 **必要** 有效值：整數。  | 
| alpha |  權重的 L1 正規化詞彙。增加此值可讓模型更為保守。 **選用** 有效值：浮點數。 預設值：0  | 
| base\$1score |  所有執行個體、全域偏差的初始預測分數。 **選用** 有效值：浮點數。 預設值：0.5  | 
| booster |  要使用哪些提升工具。`gbtree` 和 `dart` 值使用樹狀模型，而 `gblinear` 使用線性函式。 **選用** 有效值：字串。`"gbtree"`、`"gblinear"` 或 `"dart"` 其中之一。 預設值：`"gbtree"`  | 
| colsample\$1bylevel |  每個層級中的每個分割之欄次取樣率。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1  | 
| colsample\$1bynode |  每個節點中資料欄的次取樣率。 **選用** 有效值：浮點數。範圍：(0,1]。 預設值：1  | 
| colsample\$1bytree |  建構每棵樹時的欄次取樣率。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1  | 
| csv\$1weights |  啟用此標記時，XGBoost 會採用訓練資料的第二個欄 (標籤後面的欄) 做為執行個體權重，區隔 csv 輸入的執行個體重要性。 **選用** 有效值：0 或 1 預設值：0  | 
| deterministic\$1histogram |  啟用此標記時，XGBoost 會決定性地在 GPU 上建立直方圖。僅於 `tree_method` 設為 `gpu_hist` 時才使用。 如需有效輸入的完整清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst)。 **選用** 有效值：字串。範圍：`"true"` 或 `"false"`。 預設值：`"true"`  | 
| early\$1stopping\$1rounds |  模型會一直訓練到驗證分數停止上升為止。驗證錯誤需至少以每 `early_stopping_rounds` 的速率降低才可繼續訓練。SageMaker AI 託管使用最佳模型進行推論。 **選用** 有效值：整數。 預設值：-  | 
| eta |  用於更新以避免過度擬合的步驟大小收縮。在每個提升步驟後，您可以直接取得新功能的權重。`eta` 參數會縮減功能權重，讓提升程序更保守。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：0.3  | 
| eval\$1metric |  驗證資料的評估指標。預設指標是根據目標指派： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/xgboost_hyperparameters.html) 如需有效輸入清單，請參閱 [XGBoost 學習任務參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。 **選用** 有效值：字串。 預設值：根據目標預設。  | 
| gamma |  進一步在樹上的葉片節點分區所需的最低遺失縮減量。演算法越大就越保守。 **選用** 有效值：浮點數。範圍：[0,∞)。 預設值：0  | 
| grow\$1policy |  控制新增節點到樹的方式。目前只有 `tree_method` 設為 `hist` 時才受支援。 **選用** 有效值：字串。`"depthwise"` 或 `"lossguide"`。 預設值：`"depthwise"`  | 
| interaction\$1constraints |  指定允許互動的變數群組。 **選用** 有效值：嵌套的整數清單。每個整數表示一個特徵，每個嵌套清單包含允許互動的特徵，例如 [[1,2]、[3,4,5]]。 預設值：NONE  | 
| lambda |  權重的 L2 正規化詞彙。增加此值可讓模型更為保守。 **選用** 有效值：浮點數。 預設值：1  | 
| lambda\$1bias |  偏差的 L2 正規化詞彙。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0  | 
| max\$1bin |  最大數量的分散式資料匣，以儲存持續功能。僅於 `tree_method` 設為 `hist` 時才使用。 **選用** 有效值：整數。 預設值：256  | 
| max\$1delta\$1step |  每個樹的權重估值允許使用最高差量步驟。使用正整數時，有助於讓更新更為保守。偏好選項是在邏輯回歸中使用。設定為 1-10，以協助控制更新。 **選用** 有效值：整數。範圍：[0,∞)。 預設值：0  | 
| max\$1depth |  最大樹深度。增加此值可讓模型更為複雜也更有可能過度擬合。0 表示無限制。當 `grow_policy`=`depth-wise` 時便需要限制。 **選用** 有效值：整數。範圍：[0,∞) 預設值：6  | 
| max\$1leaves |  要新增的最大節點數量。只有 `grow_policy` 設為 `lossguide` 時才相關。 **選用** 有效值：整數。 預設值：0  | 
| min\$1child\$1weight |  子系中需要執行個體權重的最低總和 (hessian)。如果葉片節點中的樹狀分區步驟的執行個體權重總和少於 `min_child_weight`，建置程序將提供進一步的分區。在線性回歸模型中，這就是對應各節點中所需的最低執行個體數量。演算法越大就越保守。 **選用** 有效值：浮點數。範圍：[0,∞)。 預設值：1  | 
| monotone\$1constraints |  指定任何特徵的單調性限制條件。 **選用** 有效值：整數元組。有效整數：-1 (遞減限制條件)、0 (無限制條件)、1 (增加限制條件)。 例如，(0, 1)：第一個預測器沒有限制條件，在第二個預測器增加限制條件。(-1，1)：在第一個預測器減少限制條件，並在第二個預測器增加限制條件。 預設值：(0, 0)  | 
| normalize\$1type |  標準化演算法類型。 **選用** 有效值：*tree* 或 *forest*。 預設值：*tree*  | 
| nthread |  用於執行 *xgboost* 的平行執行緒數量。 **選用** 有效值：整數。 預設值：最大執行緒數量。  | 
| objective |  指定學習任務和對應的學習目標。範例：`reg:logistic`、`multi:softmax`、`reg:squarederror`。如需有效輸入的完整清單，請參閱 [XGBoost 學習任務參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。 **選用** 有效值：字串 預設值：`"reg:squarederror"`  | 
| one\$1drop |  當啟用此旗標時，至少有一棵樹一律在退出時刪除。 **選用** 有效值：0 或 1 預設值：0  | 
| process\$1type |  要執行的提升程序類型。 **選用** 有效值：字串。`"default"` 或 `"update"`。 預設值：`"default"`  | 
| rate\$1drop |  退出率，指定在退出時刪除一小部分的舊樹。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0.0  | 
| refresh\$1leaf |  這是 '重新整理' 更新工具外掛程式的參數。當設定為 `true` (1) 時，會更新樹分葉與樹節點的統計資料。當設定為 `false` (0) 時，只更新樹節點的統計資料。 **選用** 有效值：0/1 預設值：1  | 
| sample\$1type |  取樣演算法類型。 **選用** 有效值：`uniform` 或 `weighted`。 預設值：`uniform`  | 
| scale\$1pos\$1weight |  控制正負加權的平衡。對於不平衡的分類非常實用。要考慮的典型值：`sum(negative cases)` / `sum(positive cases)`。 **選用** 有效值：浮點數 預設值：1  | 
| seed |  隨機數量種子。 **選用** 有效值：整數 預設值：0  | 
| single\$1precision\$1histogram |  啟用此標記時，XGBoost 會使用單一精確度而非雙精確度來建立直方圖。僅於 `tree_method` 設為 `hist` 或 `gpu_hist` 時才使用。 如需有效輸入的完整清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst)。 **選用** 有效值：字串。範圍：`"true"` 或 `"false"` 預設值：`"false"`  | 
| sketch\$1eps |  僅適用於預估值貪婪演算法。這會轉譯為 O(1/`sketch_eps`) 個資料匣。相較於直接選擇資料匣數量，這會搭配含有示意圖精準度的理論保證。 **選用** 有效值：浮動、範圍：[0, 1]。 預設值：0.03  | 
| skip\$1drop |  反覆提升時略過退出程序的可能性。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0.0  | 
| subsample |  訓練執行個體的次取樣率。將其設定為 0.5 表示 XGBoost 會隨機收集一半的資料執行個體來培養樹。這可避免過度擬合。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1  | 
| tree\$1method |  XGBoost 中使用的樹建構演算法。 **選用** 有效值：`auto`、`exact`、`approx`、`hist` 或 `gpu_hist` 其中之一。 預設值：`auto`  | 
| tweedie\$1variance\$1power |  控制 Tweedie 分發的方差之參數。 **選用** 有效值：浮點數。範圍：(1, 2)。 預設值：1.5  | 
| updater |  以逗號分隔的字串，用於定義要執行的樹更新工具序列。這提供模組化方式來建構和修改樹。 如需有效輸入的完整清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst)。 **選用** 有效值：逗號分隔字串。 預設值：`grow_colmaker`、prune  | 
| use\$1dask\$1gpu\$1training |  如果您要使用 Dask 執行分散式 GPU 訓練，請將 `use_dask_gpu_training` 設定為 `"true"`。Dask GPU 訓練僅支援 1.5-1 及更新的版本。對於 1.5-1 之前的版本，請勿將此值設定為 `"true"`。如需詳細資訊，請參閱[分散式 GPU 訓練](xgboost.md#Instance-XGBoost-distributed-training-gpu)。 **選用** 有效值：字串。範圍：`"true"` 或 `"false"` 預設值：`"false"`  | 
| verbosity | 列印訊息的詳細資訊等級。 有效值：0 (無訊息)、1 (警告)、2 (資訊)、3 (除錯)。 **選用** 預設值：1  | 

# 調校 XGBoost 模型
<a name="xgboost-tuning"></a>

*自動模型調校*，又稱為超參數調校，會透過在您的訓練和驗證資料集上，執行許多測試超參數範圍的任務，來尋找最佳版本的模型。您可以選擇三種類型的超參數：
+ 學習 `objective` 功能，用於在模型訓練期間最佳化
+ `eval_metric`，用於在驗證期間評估模型效能
+ 一組超參數和一系列值，各別用於自動調校模型

您可以從演算法計算的評估指標集中，選擇評估指標。自動模型調校會搜尋所選擇的超參數，以找出產生之模型可最佳化評估指標的值組合。

**注意**  
XGBoost 0.90 的自動模型調校只能從 Amazon SageMaker SDK 使用，無法從 SageMaker AI 主控台使用。

如需模型調校的詳細資訊，請參閱[使用 SageMaker AI 執行自動模型調校](automatic-model-tuning.md)。

## XGBoost 演算法計算的評估指標
<a name="xgboost-metrics"></a>

XGBoost 演算法會計算下列指標，用於模型驗證。調校模型時，請選擇這些指標的其中之一以評估模型。如需有效 `eval_metric` 值的完整清單，請參閱 [XGBoost 學習任務參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| validation:accuracy |  分類率，計算方式為 \$1(正確)/\$1(所有案例)。  |  最大化  | 
| validation:auc |  曲線下的區域。  |  最大化  | 
| validation:error |  二元分類錯誤率，計算方式為 \$1(錯誤案例)/\$1(所有案例)。  |  最小化  | 
| validation:f1 |  分類準確性的指標，計算方式為精確度和回呼的調和平均值。  |  最大化  | 
| validation:logloss |  不記錄的機率。  |  最小化  | 
| validation:mae |  絕對平均值錯誤。  |  最小化  | 
| validation:map |  平均值的平均精度。  |  最大化  | 
| validation:merror |  多類別分類錯誤率，計算方式為 \$1(錯誤案例)/\$1(所有案例)。  |  最小化  | 
| validation:mlogloss |  多類別分類的不記錄機率。  |  最小化  | 
| validation:mse |  均方錯差。  |  最小化  | 
| validation:ndcg |  正規化的折扣累計收益。  |  最大化  | 
| validation:rmse |  均方根錯誤。  |  最小化  | 

## 可調校的 XGBoost 超參數
<a name="xgboost-tunable-hyperparameters"></a>

使用下列超參數調校 XGBoost 模型。對 XGBoost 評估指標最佳化影響最大的超參數為：`alpha`、`min_child_weight`、`subsample`、`eta` 和 `num_round`。


| 參數名稱 | 參數類型 | 建議範圍 | 
| --- | --- | --- | 
| alpha |  ContinuousParameterRanges  |  MinValue：0、MaxValue：1000  | 
| colsample\$1bylevel |  ContinuousParameterRanges  |  MinValue：0.1、MaxValue：1  | 
| colsample\$1bynode |  ContinuousParameterRanges  |  MinValue：0.1、MaxValue：1  | 
| colsample\$1bytree |  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\$1delta\$1step |  IntegerParameterRanges  |  [0, 10]  | 
| max\$1depth |  IntegerParameterRanges  |  [0, 10]  | 
| min\$1child\$1weight |  ContinuousParameterRanges  |  MinValue：0、MaxValue：120  | 
| num\$1round |  IntegerParameterRanges  |  [1, 4000]  | 
| subsample |  ContinuousParameterRanges  |  MinValue：0.5、MaxValue：1  | 

# 已棄用的 XGBoost 版本和升級
<a name="xgboost-previous-versions"></a>

此主題包含舊版本 Amazon SageMaker AI XGBoost 的文件，這些文件仍可用，但已棄用。它也提供如何在可能的情況下將棄用的 XGBoost 版本升級到最新版本的指示。

**Topics**
+ [將 XGBoost 0.90 版升級至 1.5 版](xgboost-version-0.90.md)
+ [XGBoost 0.72 版](xgboost-72.md)

# 將 XGBoost 0.90 版升級至 1.5 版
<a name="xgboost-version-0.90"></a>

如果您正在使用 SageMaker Python SDK，若要將現有的 XGBoost 0.90 版任務升級至 1.5 版，您必須安裝 SDK 的 2.x 版，並將 XGBoost `version` 和 `framework_version` 參數變更為 1.5-1 版。如果您正在使用 Boto3，則需要更新 Docker 映像，以及一些超參數和學習目標。

**Topics**
+ [將 SageMaker AI Python SDK 1.x 版升級至 2.x 版](#upgrade-xgboost-version-0.90-sagemaker-python-sdk)
+ [將映像標籤變更為 1.5-1 版](#upgrade-xgboost-version-0.90-change-image-tag)
+ [變更適用於 Boto3 的 Docker 映像](#upgrade-xgboost-version-0.90-boto3)
+ [更新超參數和學習目標](#upgrade-xgboost-version-0.90-hyperparameters)

## 將 SageMaker AI Python SDK 1.x 版升級至 2.x 版
<a name="upgrade-xgboost-version-0.90-sagemaker-python-sdk"></a>

如果您還在使用 SageMaker Python SDK 的 1.x 版，您必須升級至 SageMaker Python SDK 的 2.x 版。有關 SageMaker Python SDK 的最新版本的資訊，請參閱[使用 SageMaker Python SDK 的版本 2.x](https://sagemaker.readthedocs.io/en/stable/v2.html)。若要安裝最新版本，請執行：

```
python -m pip install --upgrade sagemaker
```

## 將映像標籤變更為 1.5-1 版
<a name="upgrade-xgboost-version-0.90-change-image-tag"></a>

如果您正在使用 SageMaker Python SDK 和 XGBoost 內建演算法，請變更 `image_uris.retrive` 中的版本參數。

```
from sagemaker import image_uris
image_uris.retrieve(framework="xgboost", region="us-west-2", version="1.5-1")

estimator = sagemaker.estimator.Estimator(image_uri=xgboost_container, 
                                          hyperparameters=hyperparameters,
                                          role=sagemaker.get_execution_role(),
                                          instance_count=1, 
                                          instance_type='ml.m5.2xlarge', 
                                          volume_size=5, # 5 GB 
                                          output_path=output_path)
```

如果您正在使用 SageMaker Python SDK 和 XGBoost 內建演算法做為架構來執行自訂的訓練指令碼，請在 XGBoost API 中變更 `framework_version` 參數。

```
estimator = XGBoost(entry_point = "your_xgboost_abalone_script.py", 
                    framework_version='1.5-1',
                    hyperparameters=hyperparameters,
                    role=sagemaker.get_execution_role(),
                    instance_count=1,
                    instance_type='ml.m5.2xlarge',
                    output_path=output_path)
```

在 SageMaker Python SDK 1.x 版中的 `sagemaker.session.s3_input` 已重新命名為 `sagemaker.inputs.TrainingInput`。您必須使用 `sagemaker.inputs.TrainingInput`，如下列範例所示。

```
content_type = "libsvm"
train_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'train'), content_type=content_type)
validation_input = TrainingInput("s3://{}/{}/{}/".format(bucket, prefix, 'validation'), content_type=content_type)
```

 有關 SageMaker Python SDK 2.x 版更改的完整清單，請參閱[使用 SageMaker Python SDK 的版本 2.x](https://sagemaker.readthedocs.io/en/stable/v2.html)。

## 變更適用於 Boto3 的 Docker 映像
<a name="upgrade-xgboost-version-0.90-boto3"></a>

如果您正在使用 Boto3 訓練或部署您的模型，請將 Docker 映像標籤 (1 版、0.72 版、0.90-1 版或 0.90-2 版) 變更為 1.5-1 版。

```
{
    "AlgorithmSpecification":: {
        "TrainingImage": "746614075791.dkr.ecr.us-west-1.amazonaws.com/sagemaker-xgboost:1.5-1"
    }
    ...
}
```

如果您正在使用 SageMaker Python SDK 擷取登錄檔路徑，請變更 `image_uris.retrieve` 中的 `version` 參數。

```
from sagemaker import image_uris
image_uris.retrieve(framework="xgboost", region="us-west-2", version="1.5-1")
```

## 更新超參數和學習目標
<a name="upgrade-xgboost-version-0.90-hyperparameters"></a>

無訊息參數已棄用，而且在 XGBoost 1.5 及更新版本中不再可用。請改用 `verbosity`。如果您使用的是 `reg:linear` 學習目標，它也已被棄用，由 ` reg:squarederror` 取而代之。請改用 `reg:squarederror`。

```
hyperparameters = {
    "verbosity": "2",
    "objective": "reg:squarederror",
    "num_round": "50",
    ...
}

estimator = sagemaker.estimator.Estimator(image_uri=xgboost_container, 
                                          hyperparameters=hyperparameters,
                                          ...)
```

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

**重要**  
Amazon SageMaker AI 已棄用 XGBoost 0.72 版。您仍可以透過提取舊版 XGBoost 的映像 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))。

這個舊版 Amazon SageMaker AI XGBoost 演算法是以 0.72 版為基礎。[XGBoost](https://github.com/dmlc/xgboost) (eXtreme Gradient Boosting) 為一款熱門的有效率梯度提升樹演算法開放原始碼實作。梯度提升是監督式學習演算法，藉由結合一組較簡單、較脆弱的模型預估值來嘗試精確預測目標變數。XGBoost 在機器學習競賽中表現出色，歸因於它能夠穩固地處理各種資料類型、關聯與分發，且因為可調校並微調大量超參數來提升相符性。這樣的彈性讓 XGBoost 成為回歸、分類 (二進位與多類別) 以及排序等問題的有效解決方法。

客戶應考慮使用新版 [XGBoost 演算法搭配 Amazon SageMaker AI](xgboost.md)。他們可以使用它做為 SageMaker AI 內建演算法，或做為在其本機環境中執行指令碼的框架，例如，如同他們通常使用 Tensorflow 深度學習框架所做一般。新的實作具有更小的記憶體使用量、更好的記錄、已改善的超參數驗證，以及已擴展的指標集。如果客戶需要延後遷移到新版本，則 XGBoost 的先前實作仍可供客戶使用。但是，這個先前的實作仍將繫結至 0.72 版的 XGBoost。

## XGBoost 0.72 版的輸入/輸出介面
<a name="xgboost-72-InputOutput"></a>

梯度提升在表格式資料中操作，含有代表觀察的行、還有一個代表目標變數或標籤的欄，而剩下的欄則代表功能。

XGBoost 的 SageMaker AI 實作支援訓練與推論的 CSV 與 libsvm 格式：
+ 針對 Training ContentType，有效輸入為 *text/libsvm* (預設值) 或 *text/csv*。
+ 針對 Inference ContentType，有效輸入為 *text/libsvm* 或 *text/csv* (預設值)。

**注意**  
對於 CSV 訓練，演算法假設目標變數在第一個欄，且 CSV 沒有標題記錄。對於 CSV 推論，演算法假設 CSV 輸入沒有標籤欄。  
針對 libsvm 訓練，演算法假設標籤是在第一個欄中。後續的欄包含特徵的零底索引值對。因此每個資料列的格式皆為：<label> <index0>:<value0> <index1>:<value1> ... libsvm 的推論請求可能有、也可能沒有此 libsvm 格式的標籤。

這與其他 SageMaker AI 演算法不同，使用 protobuf 訓練輸入格式來維持更高的標準 XGBoost 資料格式一致性。

對於 CSV 訓練輸入模式，可供演算法使用的總記憶體 (在 `InstanceType` 中可用的執行個體計數 \$1) 需可保留訓練資料集。libsvm 訓練輸入模式並非必要，但建議使用。

SageMaker AI XGBoost 使用 Python 保存模組來序列化/取消序列化模型，可用於儲存/載入模型。

**在開放原始碼 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 SageMaker AI XGBoost 演算法的迴歸](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/xgboost_abalone/xgboost_abalone.html)。若要使用 0.72 版的 XGBoost，您需要將範本程式碼中的版本變更為 0.72。如需如何建立並存取 Jupyter 筆記本執行個體以用來執行 SageMaker AI 中範例的指示，請參閱[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)。


| 參數名稱 | Description | 
| --- | --- | 
| num\$1class | 類別數。 若 `objective` 設為 *multi:softmax* 或 *multi:softprob*，則為**必要**。 有效值：整數  | 
| num\$1round | 執行訓練的捨入數。 **必要** 有效值：整數  | 
| alpha | 權重的 L1 正規化詞彙。增加此值可讓模型更為保守。 **選用** 有效值：浮點數 預設值：0  | 
| base\$1score | 所有執行個體、全域偏差的初始預測分數。 **選用** 有效值：浮點數 預設值：0.5  | 
| booster | 要使用哪些提升工具。`gbtree` 和 `dart` 值使用樹狀模型，而 `gblinear` 使用線性函式。 **選用** 有效值：字串。`gbtree`、`gblinear` 或 `dart` 其中之一。 預設值：`gbtree`  | 
| colsample\$1bylevel | 每個層級中的每個分割之欄次取樣率。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1  | 
| colsample\$1bytree | 建構每棵樹時的欄次取樣率。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1 | 
| csv\$1weights | 啟用此標記時，XGBoost 會採用訓練資料的第二個欄 (標籤後面的欄) 做為執行個體權重，區隔 csv 輸入的執行個體重要性。 **選用** 有效值：0 或 1 預設值：0  | 
| early\$1stopping\$1rounds | 模型會一直訓練到驗證分數停止上升為止。驗證錯誤需至少以每 `early_stopping_rounds` 的速率降低才可繼續訓練。SageMaker AI 託管使用最佳模型進行推論。 **選用** 有效值：整數 預設值：-  | 
| eta | 用於更新以避免過度擬合的步驟大小收縮。在每個提升步驟後，您可以直接取得新功能的權重。`eta` 參數會縮減功能權重，讓提升程序更保守。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：0.3  | 
| eval\$1metric | 驗證資料的評估指標。預設指標是根據目標指派：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/xgboost-72.html) 如需有效輸入清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。 **選用** 有效值：字串 預設值：根據目標預設。  | 
| gamma | 進一步在樹上的葉片節點分區所需的最低遺失縮減量。演算法越大就越保守。 **選用** 有效值：浮點數。範圍：[0,∞)。 預設值：0  | 
| grow\$1policy | 控制新增節點到樹的方式。目前只有 `tree_method` 設為 `hist` 時才受支援。 **選用** 有效值：字串。`depthwise` 或 `lossguide`。 預設值：`depthwise`  | 
| lambda | 權重的 L2 正規化詞彙。增加此值可讓模型更為保守。 **選用** 有效值：浮點數 預設值：1  | 
| lambda\$1bias | 偏差的 L2 正規化詞彙。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0  | 
| max\$1bin | 最大數量的分散式資料匣，以儲存持續功能。僅於 `tree_method` 設為 `hist` 時才使用。 **選用** 有效值：整數 預設值：256  | 
| max\$1delta\$1step | 每個樹的權重估值允許使用最高差量步驟。使用正整數時，有助於讓更新更為保守。偏好選項是在邏輯回歸中使用。設定為 1-10，以協助控制更新。 **選用** 有效值：整數。範圍：[0,∞)。 預設值：0  | 
| max\$1depth | 最大樹深度。增加此值可讓模型更為複雜也更有可能過度擬合。0 表示無限制。當 `grow_policy`=`depth-wise` 時便需要限制。 **選用** 有效值：整數。範圍：[0,∞) 預設值：6  | 
| max\$1leaves | 要新增的最大節點數量。只有 `grow_policy` 設為 `lossguide` 時才相關。 **選用** 有效值：整數 預設值：0  | 
| min\$1child\$1weight | 子系中需要執行個體權重的最低總和 (hessian)。如果葉片節點中的樹狀分區步驟的執行個體權重總和少於 `min_child_weight`，建置程序將提供進一步的分區。在線性回歸模型中，這就是對應各節點中所需的最低執行個體數量。演算法越大就越保守。 **選用** 有效值：浮點數。範圍：[0,∞)。 預設值：1  | 
| normalize\$1type | 標準化演算法類型。 **選用** 有效值：*tree* 或 *forest*。 預設值：*tree*  | 
| nthread | 用於執行 *xgboost* 的平行執行緒數量。 **選用** 有效值：整數 預設值：最大執行緒數量。  | 
| objective | 指定學習任務和對應的學習目標。範例：`reg:logistic`、`reg:softmax`、`multi:squarederror`。如需有效輸入的完整清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst#learning-task-parameters)。 **選用** 有效值：字串 預設值：`reg:squarederror`  | 
| one\$1drop | 當啟用此旗標時，至少有一棵樹一律在退出時刪除。 **選用** 有效值：0 或 1 預設值：0  | 
| process\$1type | 要執行的提升程序類型。 **選用** 有效值：字串。`default` 或 `update`。 預設值：`default`  | 
| rate\$1drop | 退出率，指定在退出時刪除一小部分的舊樹。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0.0  | 
| refresh\$1leaf | 這是 '重新整理' 更新工具外掛程式的參數。當設定為 `true` (1) 時，會更新樹分葉與樹節點的統計資料。當設定為 `false` (0) 時，只更新樹節點的統計資料。 **選用** 有效值：0/1 預設值：1  | 
| sample\$1type | 取樣演算法類型。 **選用** 有效值：`uniform` 或 `weighted`。 預設值：`uniform`  | 
| scale\$1pos\$1weight | 控制正負加權的平衡。對於不平衡的分類非常實用。要考慮的典型值：`sum(negative cases)` / `sum(positive cases)`。 **選用** 有效值：浮點數 預設值：1  | 
| seed | 隨機數量種子。 **選用** 有效值：整數 預設值：0  | 
| silent | 0 表示列印執行中的訊息、1 表示靜音模式。 有效值：0 或 1 **選用** 預設值：0  | 
| sketch\$1eps | 僅適用於預估值貪婪演算法。這會轉譯為 O(1/`sketch_eps`) 個資料匣。相較於直接選擇資料匣數量，這會搭配含有示意圖精準度的理論保證。 **選用** 有效值：浮動、範圍：[0, 1]。 預設值：0.03  | 
| skip\$1drop | 反覆提升時略過退出程序的可能性。 **選用** 有效值：浮點數。範圍：[0.0, 1.0]。 預設值：0.0  | 
| subsample | 訓練執行個體的次取樣率。將其設定為 0.5 表示 XGBoost 會隨機收集一半的資料執行個體來培養樹。這可避免過度擬合。 **選用** 有效值：浮點數。範圍：[0,1]。 預設值：1  | 
| tree\$1method | XGBoost 中使用的樹建構演算法。 **選用** 有效值：`auto`、`exact`、`approx` 或 `hist` 的其中之一。 預設值：`auto`  | 
| tweedie\$1variance\$1power | 控制 Tweedie 分發的方差之參數。 **選用** 有效值：浮點數。範圍：(1, 2)。 預設值：1.5  | 
| updater | 以逗號分隔的字串，用於定義要執行的樹更新工具序列。這提供模組化方式來建構和修改樹。 如需有效輸入的完整清單，請參閱 [XGBoost 參數](https://github.com/dmlc/xgboost/blob/master/doc/parameter.rst)。 **選用** 有效值：逗號分隔字串。 預設值：`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)


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| validation:auc |  曲線下的區域。  |  最大化  | 
| validation:error |  二元分類錯誤率，計算方式為 \$1(錯誤案例)/\$1(所有案例)。  |  最小化  | 
| validation:logloss |  不記錄的機率。  |  最小化  | 
| validation:mae |  絕對平均值錯誤。  |  最小化  | 
| validation:map |  平均值的平均精度。  |  最大化  | 
| validation:merror |  多類別分類錯誤率，計算方式為 \$1(錯誤案例)/\$1(所有案例)。  |  最小化  | 
| 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\$1bylevel |  ContinuousParameterRanges  |  MinValue：0.1、MaxValue：1  | 
| colsample\$1bytree |  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\$1delta\$1step |  IntegerParameterRanges  |  [0, 10]  | 
| max\$1depth |  IntegerParameterRanges  |  [0, 10]  | 
| min\$1child\$1weight |  ContinuousParameterRanges  |  MinValue：0、MaxValue：120  | 
| num\$1round |  IntegerParameterRanges  |  [1, 4000]  | 
| subsample |  ContinuousParameterRanges  |  MinValue：0.5、MaxValue：1  | 