

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

# 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)
  ```