

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

# CatBoost
<a name="catboost"></a>

[CatBoost](https://catboost.ai/) 是漸變增強決策樹 (GBDT) 算法的一種流行且高性能的開放原始碼實作。GBDT 是受監管的學習演算法，藉由結合一組較簡單且較脆弱的模型之預估值集合來嘗試精確預測目標變數。

CatBoost 為 GBDT 引入了兩個關鍵演算法進展：

1. 有序增強的實作，這是經典演算法的排列驅動替代方案

1. 一種用於處理分類特徵的創新算法

這兩種技術都是為了對抗由於目前所有現有的梯度增強演算法實現中存在的一種特殊目標洩漏引起的預測偏移。此頁面包含 Amazon EC2 執行個體推薦服務和 CatBoost 範例筆記本的相關資訊。

# 如何使用 SageMaker AI CatBoost
<a name="catboost-modes"></a>

您可以使用 CatBoost 做為 Amazon SageMaker AI 內建演算法。下一節描述了如何搭配使用 CatBoost 與 SageMaker Python SDK。如需如何從 Amazon SageMaker Studio Classic 使用者介面使用 CatBoost 的資訊，請參閱[SageMaker JumpStart 預先訓練模型](studio-jumpstart.md)。
+ **使用 CatBoost 做為內建演算法**

  使用 CatBoost 內建演算法來建置 CatBoost 訓練容器，如下面的程式碼範例所示。您可以使用 SageMaker AI `image_uris.retrieve` API (如果使用 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 第 2 版，則是 `get_image_uri` API) 自動發現 CatBoost 內建演算法映像 URI。

  指定 CatBoost 映像 URI 後，您可以透過使用 CatBoost 容器來建置使用 SageMaker AI 估算器 API 的估算器，並啟動訓練任務。CatBoost 內建演算法會以指令碼模式執行，但是訓練指令碼是為您提供的，不需要取代它。如果您有使用指令碼模式建立 SageMaker 訓練工作的豐富經驗，則可以合併自己的 CatBoost 訓練指令碼。

  ```
  from sagemaker import image_uris, model_uris, script_uris
  
  train_model_id, train_model_version, train_scope = "catboost-classification-model", "*", "training"
  training_instance_type = "ml.m5.xlarge"
  
  # Retrieve the docker image
  train_image_uri = image_uris.retrieve(
      region=None,
      framework=None,
      model_id=train_model_id,
      model_version=train_model_version,
      image_scope=train_scope,
      instance_type=training_instance_type
  )
  
  # Retrieve the training script
  train_source_uri = script_uris.retrieve(
      model_id=train_model_id, model_version=train_model_version, script_scope=train_scope
  )
  
  train_model_uri = model_uris.retrieve(
      model_id=train_model_id, model_version=train_model_version, model_scope=train_scope
  )
  
  # Sample training data is available in this bucket
  training_data_bucket = f"jumpstart-cache-prod-{aws_region}"
  training_data_prefix = "training-datasets/tabular_multiclass/"
  
  training_dataset_s3_path = f"s3://{training_data_bucket}/{training_data_prefix}/train"
  validation_dataset_s3_path = f"s3://{training_data_bucket}/{training_data_prefix}/validation"
  
  output_bucket = sess.default_bucket()
  output_prefix = "jumpstart-example-tabular-training"
  
  s3_output_location = f"s3://{output_bucket}/{output_prefix}/output"
  
  from sagemaker import hyperparameters
  
  # Retrieve the default hyperparameters for training the model
  hyperparameters = hyperparameters.retrieve_default(
      model_id=train_model_id, model_version=train_model_version
  )
  
  # [Optional] Override default hyperparameters with custom values
  hyperparameters[
      "iterations"
  ] = "500"
  print(hyperparameters)
  
  from sagemaker.estimator import Estimator
  from sagemaker.utils import name_from_base
  
  training_job_name = name_from_base(f"built-in-algo-{train_model_id}-training")
  
  # Create SageMaker Estimator instance
  tabular_estimator = Estimator(
      role=aws_role,
      image_uri=train_image_uri,
      source_dir=train_source_uri,
      model_uri=train_model_uri,
      entry_point="transfer_learning.py",
      instance_count=1,
      instance_type=training_instance_type,
      max_run=360000,
      hyperparameters=hyperparameters,
      output_path=s3_output_location
  )
  
  # Launch a SageMaker Training job by passing the S3 path of the training data
  tabular_estimator.fit(
      {
          "training": training_dataset_s3_path,
          "validation": validation_dataset_s3_path,
      }, logs=True, job_name=training_job_name
  )
  ```

  如需如何將 CatBoost 設定為內建演算法的詳細資訊，請參閱下列筆記本範例。
  + [使用 Amazon SageMaker AI LightGBM 和 CatBoost 演算法進行表格分類](https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/lightgbm_catboost_tabular/Amazon_Tabular_Classification_LightGBM_CatBoost.ipynb)
  + [使用 Amazon SageMaker AI LightGBM 和 CatBoost 演算法進行表格迴歸](https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/lightgbm_catboost_tabular/Amazon_Tabular_Regression_LightGBM_CatBoost.ipynb)

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

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

CatBoost 的 SageMaker AI 實作支援用於訓練和推論的 CSV：
+ 對於**訓練 ContentType**，有效輸入必須為*文字/csv*。
+ 對於**推論 ContentType**，有效輸入必須是*文字 /csv*。

**注意**  
對於 CSV 訓練，演算法假設目標變數在第一個欄，且 CSV 沒有標題記錄。  
對於 CSV 推論，演算法假設 CSV 輸入沒有標籤欄。

**訓練資料、驗證資料和分類功能的輸入格式**

請注意如何設定訓練資料的格式，以便輸入 CatBoost 表格模型。您必須提供包含訓練和驗證資料之 Amazon S3 儲存貯體的路徑。您也可以內涵分類功能清單。同時使用`training`和`validation`通道來提供您的輸入資料。或者，您可以只使用`training`頻道。

**同時使用`training`和`validation`通道**

您可以透過兩個 S3 路徑提供輸入資料，一個用於`training`通道，另一個用於`validation`通道。每個 S3 路徑可以是指向一或多個 CSV 檔案的 S3 前置詞，也可以是指向一個特定 CSV 檔案的完整 S3 路徑。目標變數應位於 CSV 檔案的第一欄中。預測變量 (功能) 應該位於其餘列中。如果為`training`或`validation`通道提供了多個 CSV 檔案，則 AutoGluon - 自列表格演算法會將檔案串聯起來。驗證資料用於計算每次增加迭代結束時的驗證分數。當驗證分數停止改善時，會套用提前停止。

如果您的預測值包含分類功能，您可以提供名`categorical_index.json`為與訓練資料檔案相同的位置的 JSON 檔案。如果您提供用於分類功能的 JSON 檔案，您的`training`頻道必須指向 S3 前置詞，而不是特定的 CSV 檔案。這個文件應該包含一個 Python 字典，其中索引鍵是字串 `"cat_index_list"`，該值是唯一整數的清單。值清單中的每個整數應指出訓練資料 CSV 檔案中對應分類特徵的欄索引。每個值都應該是一個正整數 (大於零，因為零表示目標值)、小於 `Int32.MaxValue` (2147483647)，且小於資料欄的總數。應該只有一個分類索引 JSON 檔案。

**僅使用`training`通道**：

或者，您也可以透過`training`通道的單一 S3 路徑提供輸入資料。此 S3 路徑應指向具有名為的子目錄，`training/`該目錄包含一或多個 CSV 檔案。您可以選擇性地將另一個子目錄包含在位於同一個位置，且同樣具有一或多個 CSV 檔案，名為 `validation/` 的子目錄。如果未提供驗證資料，則會隨機抽樣 20% 的訓練資料，做為驗證資料。如果您的預測值包含分類功能，您可以提供名`categorical_index.json`為與訓練資料檔案相同的位置的 JSON 檔案。

**注意**  
對於 CSV 訓練輸入模式，可供演算法使用的總記憶體 (執行個體計數乘以在 `InstanceType` 中可用的記憶體) 需可保留訓練資料集。

SageMaker AI CatBoost 使用 `catboost.CatBoostClassifier` 和 `catboost.CatBoostRegressor` 模組來序列化/取消序列化模型，可用於儲存/載入模型。

**若要使用以 SageMaker AI CatBoost 搭配 `catboost` 訓練的模型**
+ 使用以下 Python 程式碼：

  ```
  import tarfile
  from catboost import CatBoostClassifier
  
  t = tarfile.open('model.tar.gz', 'r:gz')
  t.extractall()
  
  file_path = os.path.join(model_file_path, "model")
  model = CatBoostClassifier()
  model.load_model(file_path)
  
  # prediction with test data
  # dtest should be a pandas DataFrame with column names feature_0, feature_1, ..., feature_d
  pred = model.predict(dtest)
  ```

## CatBoost 演算法的 Amazon EC2 執行個體推薦服務
<a name="Instance-CatBoost"></a>

SageMaker AI CatBoost 目前僅使用 CPU 進行訓練。CatBoost 是一個記憶體限制型 (相對於運算限制型) 的演算法。因此，一般用途的運算執行個體 (如 M5) 相較於運算最佳化執行個體 (如 C5)，是較好的選擇。此外，我們建議您在所選執行個體中需有足夠的總記憶體才可保留訓練資料。

## CatBoost 範例筆記本
<a name="catboost-sample-notebooks"></a>

 下表概述了解決 Amazon SageMaker AI CatBoost - 自列表格演算法不同使用案例的各種範例筆記本。


****  

| **筆記本標題** | **Description** | 
| --- | --- | 
|  [使用 Amazon SageMaker AI LightGBM 和 CatBoost 演算法進行表格分類](https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/lightgbm_catboost_tabular/Amazon_Tabular_Classification_LightGBM_CatBoost.ipynb)  |  本筆記本示範如何使用 Amazon SageMaker AI CatBoost 演算法來訓練和託管表格分類模型。  | 
|  [使用 Amazon SageMaker AI LightGBM 和 CatBoost 演算法進行表格迴歸](https://github.com/aws/amazon-sagemaker-examples/blob/main/introduction_to_amazon_algorithms/lightgbm_catboost_tabular/Amazon_Tabular_Regression_LightGBM_CatBoost.ipynb)  |  本筆記本示範如何使用 Amazon SageMaker AI CatBoost 演算法來訓練和託管表格迴歸模型。  | 

有關如何建立和存取可用於在 SageMaker AI 中執行範例的 Jupyter 筆記本執行個體的說明，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。建立並開啟筆記本執行個體後，請選擇 **SageMaker AI 範例**索引標籤，查看所有 SageMaker AI 範例清單。若要開啟筆記本，請選擇其**使用**標籤，然後選擇**建立複本**。

# CatBoost 的運作方式
<a name="catboost-HowItWorks"></a>

CatBoost 實作了傳統的梯度增強決策樹 (GBDT) 演算法，並新增了兩個關鍵演算法進展：

1. 有序增強的實作，這是經典演算法的排列驅動替代方案

1. 一種用於處理分類特徵的創新算法

這兩種技術都是為了對抗由於目前所有現有的梯度增強演算法實現中存在的一種特殊目標洩漏引起的預測偏移。

CatBoost 演算法在機器學習競爭者間表現良好，因為它具備的強大功能可處理各種資料類型、關聯性、分佈以及各種您可以微調的超參數。您可以使用 CatBoost 為問題進行迴歸、分類 (二進位和多類) 和排名。

如需漸層增強的詳細資訊，請參閱[SageMaker AI XGBoost 演算法的運作方式](xgboost-HowItWorks.md)。有關 CatBoost 方法中使用的其他 GOSS 和 EFB 技術的深入詳細資訊，請參閱 CatBoost *[：具有分類功能的公正增](https://arxiv.org/pdf/1706.09516.pdf)*強功能。

# CatBoost 超參數
<a name="catboost-hyperparameters"></a>

下表包含 Amazon SageMaker AI CatBoost 演算法所需或最常用的超參數子集。使用者設定參數，並用來協助從資料預估模型參數。SageMaker AI CatBoost 演算法是開放原始碼 [CatBoost](https://github.com/catboost/catboost) 套件的實作。

**注意**  
預設超參數是根據[CatBoost 範例筆記本](catboost.md#catboost-sample-notebooks)中的範例資料集。

依預設，SageMaker AI CatBoost 演算法會根據分類問題的類型自動選擇評估量度和損耗函式。CatBoost 演算法會根據資料中的標籤數量來偵測分類問題的類型。對於迴歸問題，評估量度和損耗函式都是均方根誤差。對於二進制分類問題，評估量度是曲線下面積 (AUC)，而遺失函式是記錄遺失。對於多類分類問題，評估度量和損耗函式是多類交叉熵。您可以使用`eval_metric`超參數來變更預設評估測量結果。如需有關 LightGBM 超參數的詳細資訊，包括說明、有效值和預設值，請參閱下表。


| 參數名稱 | Description | 
| --- | --- | 
| iterations |  可建立的樹數量上限。 有效值：整數，範圍：正整數。 預設值：`500`。  | 
| early\$1stopping\$1rounds |  如果一個驗證資料點的一個指標在上`early_stopping_rounds`輪中沒有改善，則訓練將停止。如果`early_stopping_rounds`小於或等於零，則會忽略此超參數。 有效值：整數。 預設值：`5`。  | 
| eval\$1metric |  驗證資料的評估指標。如果設`eval_metric`為預設`"auto"`值，則演算法會根據分類問題類型自動選擇評估量度： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/catboost-hyperparameters.html) 有效值：字串，請參閱 [CatBoost 文件](https://catboost.ai/en/docs/references/eval-metric__supported-metrics)以取得有效值。 預設值：`"auto"`。  | 
| learning\$1rate |  檢視每批訓練範例後，模型權重的更新率。 有效值：浮點數、範圍：(`0.0`, `1.0`)。 預設值：`0.009`。  | 
| depth |  樹的深度。 有效值：整數,範圍：(`1`，`16`)。 預設值：`6`。  | 
| l2\$1leaf\$1reg |  係數用於成本函式的 L2 正規化項。 有效值：整數，範圍：正整數。 預設值：`3`。  | 
| random\$1strength |  選取樹狀結構時，用於評分分割的隨機性量。使用此參數可避免過度擬合模型。 有效值：浮點數，範圍：正浮點數。 預設值：`1.0`。  | 
| max\$1leaves |  結果樹中葉子的最大數量。只能與`"Lossguide"`增長政策搭配使用。 有效值：整數,範圍：[`2`, `64`]。 預設值：`31`。  | 
| rsm |  隨機子空間方法。隨機再次選取圖徵時，每次分割選取時要使用的圖徵百分比。 有效值：浮點數、範圍：(`0.0`, `1.0`]。 預設值：`1.0`。  | 
| sampling\$1frequency |  建立樹木時採樣權重和物件的頻率。 有效值：字串，可以是：(`"PerTreeLevel"` 或 `"PerTree"`)。 預設值：`"PerTreeLevel"`。  | 
| min\$1data\$1in\$1leaf |  葉中訓練樣本的最小數量。CatBoost 不會搜尋葉子中樣本計數小於指定值的新分割。只能與 `"Lossguide"` 和 `"Depthwise"` 增長政策搭配使用。 有效值：整數,範圍：(`1` 或 `∞`)。 預設值：`1`。  | 
| bagging\$1temperature |  定義貝葉斯引導程序的設置。使用貝葉斯引導程序為對象分配隨機權重。如果設定`bagging_temperature`為`1.0`，則會從指數分佈中取樣權數。如果設定`bagging_temperature`為`0.0`，則所有寬度都為 1.0。 有效值：浮點數，範圍：非負浮點數。 預設值：`1.0`。  | 
| boosting\$1type |  提升計劃。“自動” 表示 `boosting_type` 根據處理單元類型、訓練資料集中的物件數目以及選取的學習模式來選取。 有效值：字串，下列任一項：(`"Auto"`, `"Ordered"`, `"Plain"`)。 預設值：`"Auto"`。  | 
| scale\$1pos\$1weight |  在二進制分類正類的權重。該值被用作從正類對象的權重的乘數。 有效值：浮點數，範圍：正浮點數。 預設值：`1.0`。  | 
| max\$1bin |  數值特徵的分割數。`"Auto"`表示`max_bin`為根據處理單元類型和其他參數進行選擇。如需詳細資訊，請參閱 CatBoost 文件。 有效值：字串，可以是：(`"Auto"` 或整數字串包含 `"1"` 到 `"65535"`)。 預設值：`"Auto"`。  | 
| grow\$1policy |  樹生長政策。定義如何執行貪婪樹建構模組。 有效值：字串，下列任一項：(`"SymmetricTree"`, `"Depthwise"`,或 `"Lossguide"`)。 預設值：`"SymmetricTree"`。  | 
| random\$1seed |  用於訓練的隨機種子。 有效值：整數，範圍：非負整數。 預設值：`1.0`。 | 
| thread\$1count |  訓練期間要使用的執行緒數目。如果`thread_count`是`-1`，則執行緒數目等於處理器核心的數目。`thread_count`不可以為`0`。 有效值：正整數，可以是：(`-1`或正整數)。 預設值：`-1`。  | 
| verbose |  列印訊息的詳細程度，較高的層次與更詳細的列印對帳單相對應。 有效值：整數，範圍：正整數。 預設值：`1`。  | 

# 調整 CatBoost 模型
<a name="catboost-tuning"></a>

*自動模型調校*，又稱為超參數調校，會透過在您的訓練和驗證資料集上，執行許多測試超參數範圍的任務，來尋找最佳版本的模型。模型調整著重於以下超參數：

**注意**  
學習損耗函式會根據分類任務的類型自動指派，該類型由標籤欄中的唯一整數數目決定。如需詳細資訊，請參閱[CatBoost 超參數](catboost-hyperparameters.md)。
+ 在模型訓練期間最佳化的學習損耗函式
+ 用於在驗證期間評估模型效能的評估量度
+ 自動調整模型時要使用的一組超參數和一系列值

自動模型調整會搜尋您選擇的超參數，以找到產生可最佳化所選評估指標之模型的值組合。

**注意**  
CatBoost 的自動模型調整功能僅可從 Amazon SageMaker SDK 使用，而不能從 SageMaker AI 主控台使用。

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

## 由 CatBoost 演算法計算的評估指標
<a name="catboost-metrics"></a>

SageMaker AI CatBoost 演算法會計算下列量度，以用於模型驗證。評估指標會根據分類任務的類型自動指派，該類型由標籤欄中的唯一整數數目決定。


| 指標名稱 | Description | 最佳化方向 | 正則表達式 | 
| --- | --- | --- | --- | 
| RMSE | 均方根誤差 | 最小化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| MAE | 平均值絕對誤差。 | 最小化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| MedianAbsoluteError | 中值絕對誤差。 | 最小化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| R2 | r2 分數 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| Logloss | 二進位交叉熵 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| Precision | precision | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| Recall | 取回 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| F1 | F1 分數 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| AUC | AUC 分數 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| MultiClass | 多類交叉熵 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| Accuracy | 正確性 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 
| BalancedAccuracy | 平衡準確度 | 最大化 | "bestTest = ([0-9\$1\$1.]\$1)" | 

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

使用下列超參數調校 CatBoost 模型。對於最佳化 CatBoost 評估量度的影響最大的超參數為： `learning_rate`, `depth`, `l2_leaf_reg`, 和 `random_strength`。如需所有 CatBoost 超參數的清單，請參閱[CatBoost 超參數](catboost-hyperparameters.md)。


| 參數名稱 | 參數類型 | 建議範圍 | 
| --- | --- | --- | 
| learning\$1rate | ContinuousParameterRanges | MinValue：0.001、MaxValue：0.01 | 
| depth | IntegerParameterRanges | MinValue：4、MaxValue：10 | 
| l2\$1leaf\$1reg | IntegerParameterRanges | MinValue：2、MaxValue：10 | 
| random\$1strength | ContinuousParameterRanges | MinValue：0、MaxValue：10 | 