

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

# 處理從 Neptune 匯出用於訓練的圖形資料
<a name="machine-learning-on-graphs-processing"></a>

資料處理步驟會取得匯出程序所建立的 Neptune 圖形資料，並建立 [Deep Graph Library (DGL)](https://www.dgl.ai/) 在訓練期間使用的資訊。這包括執行各種資料對應和轉換：
+ 解析節點和邊緣以建構 DGL 所需的圖形和 ID 對應檔案。
+ 將節點和邊緣屬性轉換為 DGL 所需的節點和邊緣特徵。
+ 將資料分割為訓練、驗證和測試集。

## 管理 Neptune ML 的資料處理步驟
<a name="machine-learning-on-graphs-processing-managing"></a>

在從 Neptune 匯出了您要用於模型訓練的資料之後，您可以使用 `curl` (或 `awscurl`) 命令啟動資料處理工作，如下所示：

```
curl \
  -X POST https://(your Neptune endpoint)/ml/dataprocessing \
  -H 'Content-Type: application/json' \
  -d '{
        "inputDataS3Location" : "s3://(Amazon S3 bucket name)/(path to your input folder)",
        "id" : "(a job ID for the new job)",
        "processedDataS3Location" : "s3://(S3 bucket name)/(path to your output folder)",
        "configFileName" : "training-job-configuration.json"
      }'
```

如何使用此命令的詳細資訊會在 [dataprocessing 命令](machine-learning-api-dataprocessing.md) 中加以說明，伴隨如何取得執行中工作狀態、如何停止執行中工作，以及如何列出所有執行中工作的相關資訊。

## 處理 Neptune ML 的更新圖形資料
<a name="machine-learning-on-graphs-processing-updated"></a>

您也可以將 `previousDataProcessingJobId` 提供給 API，以確保新的資料處理工作使用與先前工作相同的處理方法。當您想要透過對新資料重新訓練舊模型，或對新資料上重新計算模型成品，以在 Neptune 中取得更新圖形資料的預測時，這是必要的。

您可以使用 `curl` (或 `awscurl`) 命令來執行此操作，如下所示：

```
curl \
  -X POST https://(your Neptune endpoint)/ml/dataprocessing \
  -H 'Content-Type: application/json' \
  -d '{ "inputDataS3Location" : "s3://(Amazon S3 bucket name)/(path to your input folder)",
        "id" : "(a job ID for the new job)",
        "processedDataS3Location" : "s3://(Amazon S3 bucket name)/(path to your output folder)",
        "previousDataProcessingJobId", "(the job ID of the previous data-processing job)"}'
```

將 `previousDataProcessingJobId` 參數值設定為對應至訓練模型之先前資料處理工作的工作 ID。

**注意**  
目前不支援更新圖形中的節點刪除。如果節點已在更新圖形中移除，您必須啟動全新的資料處理工作，而不是使用 `previousDataProcessingJobId`。

# Neptune ML 中的特徵編碼
<a name="machine-learning-feature-encoding"></a>

屬性值有不同的格式和資料類型。若要在機器學習中實現良好的效能，必須將這些值轉換為稱為*特徵*的數值編碼。

Neptune ML 會使用這裡描述的特徵編碼技術，執行特徵擷取和編碼，做為資料匯出和資料處理步驟的一部分。

**注意**  
如果您計劃在自訂模型實作中實作自己的特徵編碼，則可以選取 `none` 做為特徵編碼類型，來停用資料預先處理階段中的自動特徵編碼。然後，不會對該節點或邊緣屬性進行任何特徵編碼，而是剖析原始屬性值並將其儲存在字典中。資料預先處理仍會從匯出的資料集建立 DGL 圖形，但是建構的 DGL 圖形沒有預先處理的訓練特徵。  
僅在您計劃執行自訂特徵編碼，做為自訂模型訓練的一部分時，才應使用此選項。如需詳細資訊，請參閱 [Neptune ML 中的自訂模型](machine-learning-custom-models.md)。

## Neptune ML 中的類別特徵
<a name="machine-learning-categorical-features"></a>

可以從可能值的固定清單中獲得一個或多個不同值的屬性，就是類別特徵。在 Neptune ML 中，類別特徵會使用[獨熱編碼](https://en.wikipedia.org/wiki/One-hot)進行編碼。以下範例顯示了不同食物的屬性名稱如何根據其類別進行獨熱編碼：

```
    Food        Veg.   Meat   Fruit    Encoding
   ---------    ----   ----   -----    --------
    Apple         0      0      1         001
    Chicken       0      1      0         010
    Broccoli      1      0      0         100
```

**注意**  
任何類別特徵中的類別數目上限為 100。如果一個屬性具有超過 100 種類別的值，則僅會將其中最常見的 99 個放置在不同的類別中，其餘則會放置在名為 `OTHER` 的特殊類別中。

## Neptune ML 中的數值特徵
<a name="machine-learning-numerical-features"></a>

其值為實數的任何屬性都可以編碼為 Neptune ML 中的數值特徵。數值特徵會使用浮點數進行編碼。

您可以指定要在編碼數值特徵時使用的資料標準化方法，如下所示：`"norm": "normalization technique"`。支援以下標準化技術：
+ **「none」** – 不要在編碼期間標準化數值。
+ **「min-max」** – 透過從中減去最小值，然後將其除以最大值與最小值之間的差值來標準化每個值。
+ **「standard」** – 將每個值除以所有值的總和來標準化這些值。

## Neptune ML 中的儲存貯體數值特徵
<a name="machine-learning-bucket_numerical-features"></a>

您可以將數值壓縮為類別，而不是使用原始數字表示數值屬性。例如，您可以將人們的年齡分成兒童 (0-20 歲)、年輕人 (20-40 歲)、中年人 (40-60 歲) 和老年人 (從 60 歲開始)。使用這些數值儲存貯體，您可以將數值屬性轉換為一種類別特徵。

在 Neptune ML 中，您可能會導致數值屬性編碼為儲存貯體數值特徵。您必須提供兩個項目：
+ 格式為 ` "range": [a, b] ` 的數值範圍，其中 `a` 和 `b` 是整數。
+ 格式為 ` "bucket_cnt": c ` 的儲存貯體計數，其中 `c` 是儲存貯體的數目，也是一個整數。

然後，Neptune ML 會將每個儲存貯體的大小計算為 ` ( b - a ) / c `，並將每個數值編碼為其落入的任何儲存貯體的數目。任何小於 `a` 的值都會被視為屬於第一個儲存貯體，而任何大於 `b` 的值都會被視為屬於最後一個儲存貯體。

您也可以選擇性地使數值落入多個儲存貯體，方法是指定滑動視窗大小，如下所示：` "slide_window_size": s `，其中 `s` 是一個數字。Neptune ML 接著會將屬性的每個數值 `v` 轉換為從 ` v - s/2 ` 到 ` v + s/2 ` 的範圍，並將值 `v` 指派給範圍涵蓋的每個儲存貯體。

最後，您還可以選擇性地提供一種為數值特徵和儲存貯體數值特徵填入缺失值的方法。您可以使用 ` "imputer": "imputation technique "` 執行此操作，其中插補技術是 `"mean"`、`"median"` 或 `"most-frequent"` 之一。如果您未指定 imputer，缺失值可能會導致處理停止。

## Neptune ML 中的文字特徵編碼
<a name="machine-learning-text-features"></a>

對於自由格式的文字，Neptune ML 可以使用數個不同的模型，將屬性值字串中的記號序列轉換為固定大小的實數值向量：
+ [`text_fasttext`](#machine-learning-fasttext-features) – 使用 [fastText](https://fasttext.cc/) 編碼。對於使用 fastText 所支援五種語言的一種且只有一種的特徵，這是建議的編碼方式。
+ [`text_sbert`](#machine-learning-sbert-features) – 使用[句子 BERT](https://www.sbert.net/docs/pretrained_models.html#sentence-embedding-models) (SBERT) 編碼模型。對於 `text_fasttext` 不支援的文字，這是建議的編碼方式。
+ [`text_word2vec`](#machine-learning-word2vec-features) – 使用 [Google](https://code.google.com/archive/p/word2vec/) 最初發佈的 [Word2VEC](https://wikipedia.org/wiki/Word2vec) 演算法來編碼文字。Word2Vec 只支援英文。
+ [`text_tfidf`](#machine-learning-tfidf-features) – 使用[詞頻-逆向文件頻率](https://wikipedia.org/wiki/Tf-idf) (TF-IDF) 向量化程式來編碼文字。TF-IDF 編碼支援其他編碼不支援的統計特徵。

### Neptune ML 中文字屬性值的 *fastText* 編碼
<a name="machine-learning-fasttext-features"></a>

Neptune ML 可以使用 [fastText](https://fasttext.cc/) 模型，將文字屬性值轉換為固定大小的實數值向量。對於 FastText 支援的五種語言中任何一種語言中的文字屬性值，這是建議的編碼方法：
+ `en` (英文)
+ `zh` (中文)
+ `hi` (北印度文)
+ `es` (西班牙文)
+ `fr` (法文)

請注意，fastText 無法處理包含多種語言單字的句子。

`text_fasttext` 方法可以選擇性地採取 `max_length` 欄位，指定將編碼之文字屬性值中的記號數上限，之後字串會遭截斷。當文字屬性值包含長字串時，這可以改善效能，因為如果未指定 `max_length`，fastText 會編碼所有記號，而不論字串長度為何。

這個範例指定法文電影標題使用 fastText 進貐編碼：

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      {
        "feature": ["title", "title", "text_fasttext"],
        "language": "fr",
        "max_length": 1024
      }
    ]
  }
```

### Neptune ML 中文字特徵的句子 BERT (SBERT) 編碼
<a name="machine-learning-sbert-features"></a>

Neptune ML 可以使用[句子 BERT](https://www.sbert.net/docs/pretrained_models.html#sentence-embedding-models) (SBERT) 模型，將字串屬性值中的記號序列轉換為固定大小的實數值向量。Neptune 支援兩種 SBERT 方法：`text_sbert128`，這是預設值，如果您僅指定 `text_sbert` 和 `text_sbert512` 的話。兩者之間的差異是編碼的文字屬性值字串的長度上限。`text_sbert128` 編碼會在編碼 128 個記號之後截斷文字字串，而 `text_sbert512` 會在編碼 512 個記號之後截斷文字字串。因此，`text_sbert512` 可能比 `text_sbert128` 需要更多的處理時間。這兩種方法都比 `text_fasttext` 慢。

SBERT 編碼是多語系，因此無需為您正要編碼的屬性值文字指定語言。SBERT 方法支援多種語言，而且可以編碼包含多種語言的句子。如果您要編碼的屬性值包含以 FastText 不支援的語言撰寫的文字，則 SBERT 是建議的編碼方法。

下列範例會指定影片標題編碼為 SBERT，最多可有 128 個記號：

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      { "feature": ["title", "title", "text_sbert128"] }
    ]
  }
```

### Neptune ML 中文字特徵的 Word2Vec 編碼
<a name="machine-learning-word2vec-features"></a>

Neptune ML 可以將字串屬性值編碼為 Word2Vec 特徵 ([Word2Vec 演算法](https://wikipedia.org/wiki/Word2vec)最初是由 [Google](https://code.google.com/archive/p/word2vec/) 發布)。`text_word2vec` 方法會使用其中一個 [spaCy 訓練模型](https://spacy.io/models)，將字串中的記號編碼為密集向量。這只支援使用 [en\$1core\$1web\$1lg](https://spacy.io/models/en#en_core_web_lg) 模型的英文。

下列範例會指定影片標題使用 Word2VEC 進行編碼：

```
{
    "file_name" : "nodes/movie.csv",
    "separator" : ",",
    "node" : ["~id", "movie"],
    "features" : [
      {
        "feature": ["title", "title", "text_word2vec"],
        "language": "en_core_web_lg"
      }
    ]
  }
```

請注意，語言欄位是選用的，因為英文 `en_core_web_lg` 模型是 Neptune 支援的唯一模型。

### Neptune ML 中文字特徵的 TF-IDF 編碼
<a name="machine-learning-tfidf-features"></a>

Neptune ML 可以將文字屬性值編碼為 `text_tfidf` 特徵。這種編碼會使用[詞頻-逆向文件頻率](https://wikipedia.org/wiki/Tf-idf) (TF-IDF) 向量化程式，接著進行維數縮減操作，將文字中的單字序列轉換為數值向量。

[TF-IDF](https://en.wikipedia.org/wiki/Tf%E2%80%93idf) (詞頻 - 逆向文件頻率) 是旨在測量單字在文件集中有多重要的數值。它的計算方法是將單字在給定屬性值中出現的次數，除以其出現所在的此類屬性值的總數。

例如，如果在給定電影標題中出現兩次「kiss」一字 (例如，「kiss kiss bang bang」)，並且「kiss」出現在所有 4 部電影的標題中，則「kiss kiss bang bang」標題中「kiss」的 TF-IDF 值將是 ` 2 / 4 `。

最初建立的向量具有 ***d*** 維度，其中 ***d*** 是該類型之所有屬性值中獨特字詞的數目。維數縮減操作會使用隨機稀疏投影，將該數目減少至上限 (100)。然後，透過合併其中的所有 `text_tfidf` 特徵來產生圖形的詞彙。

您可以透過多種方式控制 TF-IDF 向量化程式：
+ **`max_features`**   –   使用 `max_features` 參數，您可以將 `text_tfidf` 特徵中的字詞數限制為最常用的字詞。例如，如果您將 `max_features` 設為 100，則只會包含前 100 個最常用的字詞。如果您未明確地設定它，則 `max_features` 的預設值為 5,000。
+ **`min_df`** – 使用 `min_df` 參數，您可以將 `text_tfidf` 特徵中的字詞數限制為至少具有所指定文件頻率的字詞。例如，如果將 `min_df` 設為 5，則只會使用出現在至少 5 個不同屬性值的字詞。如果您未明確地設定它，則 `min_df` 的預設值為 2。
+ **`ngram_range`** – `ngram_range` 參數決定要將哪些單字組合會被視為字詞。例如，如果您將 `ngram_range` 設為 `[2, 4]`，則將會在「kiss kiss bang bang」標題中找到以下 6 個字詞：
  + *2 字字詞*：「kiss kiss」、「kiss bang」和「bang bang」。
  + *3 字字詞*：「kiss kiss bang」和「kiss bang bang」。
  + *4 字字詞*：「kiss kiss bang bang」。

  `ngram_range` 的預設設定為 `[1, 1]`。

## Neptune ML 中的日期時間特徵
<a name="machine-learning-datetime-features"></a>

Neptune ML 可以將 `datetime` 屬性值的一部分編碼為類別特徵，方法是將它們轉換為[獨熱陣列](https://en.wikipedia.org/wiki/One-hot)。使用 `datetime_parts` 參數指定下列一或多個要編碼 `["year", "month", "weekday", "hour"]` 的部分：如果未設定 `datetime_parts`，預設為編碼所有四個部分。

例如，如果日期時間值的範圍橫越 2010 到 2012 年，則日期時間項目 `2011-04-22 01:16:34` 的四個部分如下：
+ **year** – `[0, 1, 0]`。

  由於跨度 (2010、2011 和 2012) 只有 3 年，因此獨熱陣列有三個項目，每年一個。
+ **month** – `[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]`。

  在這裡，獨熱陣列對於一年中的每個月都有一個項目。
+ **weekday** – `[0, 0, 0, 0, 1, 0, 0]`。

  ISO 8601 標準規定，星期一是一周的第一天，並且由於 2011 年 4 月 22 日是星期五，所以對應的獨熱工作日陣列在第五位置是熱的。
+ **hour** – `[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]`。

  凌晨 1 點設定在 24 個成員組成的獨熱陣列中。

幾月幾日、分鐘和秒不會進行類別編碼。

如果有問題的總計 `datetime` 範圍僅包含一年內的日期，則不會編碼任何 `year` 陣列。

您可以使用 `imputer` 參數和可用於數值特徵的其中一個策略，來指定插補策略以填入缺失的 `datetime` 值。

## Neptune ML 中的自動特徵編碼
<a name="machine-learning-auto-encoding"></a>

您可以將 `auto` 設定為特徵編碼方法，而不是手動指定要用於圖形中屬性的特徵編碼方法。Neptune ML 接著會嘗試根據其基礎資料類型推斷每個屬性的最佳特徵編碼。

以下是 Neptune ML 在選取適當特徵編碼時使用的一些啟發式法：
+ 如果屬性只有數值，並且可以轉換為數值資料類型，則 Neptune ML 通常會將其編碼為數值。不過，如果內容的唯一值數目小於值總數的 10%，且這些唯一值的基數小於 100，則 Neptune ML 會使用類別編碼。
+ 如果屬性值可以轉換為 `datetime` 類型，則 Neptune ML 將它們編碼為 `datetime` 特徵。
+ 如果屬性值可以強制轉換為布林值 (1/0 或 True /False)，則 Neptune ML 會使用類別編碼。
+ 如果屬性是其中 10% 以上是唯一值的字串，且每個值的平均記號數大於或等於 3，則 Neptune ML 會推斷屬性類型為文字，並自動偵測正在使用的語言。如果偵測到的語言是 [fastText](#machine-learning-fasttext-features) 支援其中一種語言，即英文、中文、北印度文、西班牙語和法文，則 Neptune ML 會使用 `text_fasttext` 來編碼文字。否則，Neptune ML 會使用 [`text_sbert`](#machine-learning-sbert-features)。
+ 如果屬性是未分類為文字特徵的字串，則 Neptune ML 會假定它是類別特徵，並使用類別編碼。
+ 如果每個節點對於推斷為類別特徵的屬性都有自己的唯一值，Neptune ML 會從訓練圖表中捨棄屬性，因為它可能是不會對學習提供資訊的 ID。
+ 如果已知屬性包含有效的 Neptune 分隔符號，例如分號 (「;」)，則 Neptune ML 只能將該屬性視為 `MultiNumerical` 或 `MultiCategorical`。
  + Neptune ML 首先嘗試將值編碼為數值特徵。如果成功，Neptune ML 會使用數值編碼來建立數值向量特徵。
  + 否則，Neptune ML 會將這些值編碼為多重類別。
+ 如果 Neptune ML 無法推斷屬性值的資料類型，Neptune ML 會從訓練圖中捨棄屬性。

# 編輯訓練資料組態檔案
<a name="machine-learning-processing-training-config-file"></a>

Neptune 匯出程序會將 Neptune ML 資料從 Neptune 資料庫叢集匯出至 S3 儲存貯體。它將節點和邊緣分別匯出至 `nodes/` 和 `edges/` 資料夾。根據預設，它也會建立 JSON 訓練資料組態檔案，名為 `training-data-configuration.json`。此檔案包含有關圖形結構描述、其特徵類型、特徵轉換和標準化操作，以及分類或迴歸任務之目標特徵的資訊。

可能有些情況，您想要直接修改組態檔案。這類情況是，您想要變更特徵的處理方式或建構圖形的方式，而不需要在每次您想要針對您要解決的機器學習任務修改其規格時重新執行匯出。

**編輯訓練資料組態檔案**

1. **將檔案下載到您的本機電腦。**

   除非您在傳遞至匯出程序的 `additionalParams/neptune_ml` 參數中指定了一或多個具名工作，否則檔案將具有預設名稱，即 `training-data-configuration.json`。您可以使用類似這樣的 AWS CLI 命令來下載 檔案：

   ```
   aws s3 cp \
     s3://(your Amazon S3 bucket)/(path to your export folder)/training-data-configuration.json \
     ./
   ```

1. **使用文字編輯器編輯檔案。**

1. **上傳修改後的檔案。**使用如下所示的 CLI 命令，將修改過的檔案上傳回您下載的 Amazon S3 AWS 中的相同位置：

   ```
   aws s3 cp \
     training-data-configuration.json \
     s3://(your Amazon S3 bucket)/(path to your export folder)/training-data-configuration.json
   ```

# JSON 訓練資料組態檔案的範例
<a name="machine-learning-processing-training-config-file-example"></a>

以下是描述節點分類任務圖形的範例訓練資料組態檔案：

```
{
  "version" : "v2.0",
  "query_engine" : "gremlin",
  "graph" : [
    {
      "edges" : [
        {
          "file_name" : "edges/(movie)-included_in-(genre).csv",
          "separator" : ",",
          "source" : ["~from", "movie"],
          "relation" : ["", "included_in"],
          "dest" : [ "~to", "genre" ]
        },
        {
          "file_name" : "edges/(user)-rated-(movie).csv",
          "separator" : ",",
          "source" : ["~from", "movie"],
          "relation" : ["rating", "prefixname"], # [prefixname#value]
          "dest" : ["~to", "genre"],
          "features" : [
            {
              "feature" : ["rating", "rating", "numerical"],
              "norm" : "min-max"
            }
          ]
        }
      ],
      "nodes" : [
        {
          "file_name" : "nodes/genre.csv",
          "separator" : ",",
          "node" : ["~id", "genre"],
          "features" : [
            {
              "feature": ["name", "genre", "category"],
              "separator": ";"
            }
          ]
        },
        {
          "file_name" : "nodes/movie.csv",
          "separator" : ",",
          "node" : ["~id", "movie"],
          "features" : [
            {
              "feature": ["title", "title", "word2vec"],
              "language": ["en_core_web_lg"]
            }
          ]
        },
        {
          "file_name" : "nodes/user.csv",
          "separator" : ",",
          "node" : ["~id", "user"],
          "features" : [
            {
              "feature": ["age", "age", "numerical"],
              "norm" : "min-max",
              "imputation": "median",
            },
            {
              "feature": ["occupation", "occupation", "category"],
            }
          ],
          "labels" : [
            {
              "label": ["gender", "classification"],
              "split_rate" : [0.8, 0.2, 0.0]
            }
          ]
        }
      ]
    },
    "warnings" : [ ]
  ]
}
```

# JSON 訓練資料組態檔案的結構
<a name="machine-learning-processing-training-config-file-structure"></a>

訓練組態檔案是指匯出程序儲存在 `nodes/` 和 `edges/` 資料夾中的 CSV 檔案。

`nodes/` 下的每個檔案都會儲存具有相同屬性圖節點標籤之節點的相關資訊。節點檔案中的每一資料行都會儲存節點 ID 或節點屬性。檔案的第一行包含一個標頭，為每一資料行指定 `~id` 或屬性名稱。

`edges/` 下的每個檔案都會儲存具有相同屬性圖邊緣標籤之節點的相關資訊。節點檔案中的每一資料行都會儲存節點 ID、目的地節點 ID 或邊緣屬性。檔案的第一行包含一個標頭，為每一資料行指定 `~from`、`~to` 或屬性名稱。

訓練資料組態檔案具有三個最上層元素：

```
{
  "version" : "v2.0",
  "query_engine" : "gremlin",
  "graph" : [ ... ]
}
```
+ `version` – (字串) 正在使用的組態檔案版本。
+ `query_engine` – (字串) 用於匯出圖形資料的查詢語言。目前，僅「gremlin」是有效的。
+ `graph` – (JSON 陣列) 列出一或多個組態物件，其中包含每個將使用之節點和邊緣的模型參數。

  圖形陣列中的組態物件具有下一節所述的結構。

## `graph` 陣列中列出之組態物件的內容
<a name="machine-learning-graph-training-config-object"></a>

`graph` 陣列中的組態物件可以包含三個最上層節點：

```
    {
      "edges"    : [ ... ],
      "nodes"    : [ ... ],
      "warnings" : [ ... ],
    }
```
+ `edges` – (JSON 物件陣列) 每個 JSON 物件都會指定一組參數，以定義在模型處理和訓練期間將如何處理圖形中的邊緣。這僅會與 Gremlin 引擎搭配使用。
+ `nodes` – (JSON 物件陣列) 每個 JSON 物件都會指定一組參數，以定義在模型處理和訓練期間將如何處理圖形中的節點。這僅會與 Gremlin 引擎搭配使用。
+ `warnings` – (JSON 物件陣列) 每個物件都包含在資料匯出過程中產生的警告。

## `edges` 陣列中列出之邊緣組態物件的內容
<a name="machine-learning-graph-edges-config"></a>

`edges` 陣列中列出的邊緣組態物件可以包含下列最上層欄位：

```
      {
        "file_name" : "(path to a CSV file)",
        "separator" : "(separator character)",
        "source"    : ["(column label for starting node ID)", "(starting node type)"],
        "relation"  : ["(column label for the relationship name)", "(the prefix name for the relationship name)"],
        "dest"      : ["(column label for ending node ID)", "(ending node type)"],
        "features"  : [(array of feature objects)],
        "labels"    : [(array of label objects)]
      }
```
+ **`file_name`** – 字串，其會指定 CSV 檔案的路徑，而此檔案會儲存具有相同屬性圖標籤之邊緣的相關資訊。

  該檔案的第一行包含資料行標籤的標頭行。

  前兩個資料行標籤為 `~from` 和 `~to`。第一個資料行 (`~from` 資料行) 儲存邊緣起始節點的 ID，而第二個資料行 (`~to` 資料行) 儲存邊緣結束節點的 ID。

  標頭行中的其餘資料行標籤會為每個剩餘的資料行指定其值已匯出至該資料行的邊緣屬性名稱。
+ **`separator`** – 字串，其中包含分隔該 CSV 檔案中資料行的分隔符號。
+ **`source`** – JSON 陣列，其中包含兩個指定邊緣起始節點的字串。第一個字串包含起始節點 ID 儲存所在資料行的標頭名稱。第二個字串指定節點類型。
+ **`relation`** – JSON 陣列，其中包含兩個指定邊緣關聯類型的字串。第一個字串包含關聯名稱 (`relname`) 儲存所在資料行的標頭名稱。第二個字串包含關聯名稱 (`prefixname`) 的字首。

  完整的關聯類型由兩個字串組合而成，它們之間有一個連字號，如下所示：`prefixname-relname`。

  如果第一個字串是空的，則所有邊緣都具有相同的關聯類型，即 `prefixname` 字串。
+ **`dest`** – JSON 陣列，其中包含兩個指定邊緣結束節點的字串。第一個字串包含節點 ID 儲存所在資料行的標頭名稱。第二個字串指定節點類型。
+ **`features`** – 屬性值特徵物件的 JSON 陣列。每個屬性值特徵物件包含下列欄位：
  + **feature** – 由三個字串組成的 JSON 陣列。第一個字串包含資料行的標頭名稱，而該資料行包含屬性值。第二個字串包含特徵名稱。第三個字串包含特徵類型。
  + **norm** – (*選用*) 指定要套用至屬性值的標準化方法。

    
+ **`labels`** – 物件的 JSON 陣列。每個物件都會定義邊緣的目標特徵，並指定訓練和驗證階段應採取的邊緣比例。每個物件包含下列欄位：
  + **label** – 由兩個字串組成的 JSON 陣列。第一個字串包含資料行的標頭名稱，而該資料行包含目標特徵屬性值。第二個字串會指定下列其中一個目標任務類型：
    + `"classification"` – 邊緣分類任務。`label` 陣列中第一個字串所識別之資料行中提供的屬性值會被視為類別值。對於邊緣分類任務，`label` 陣列中的第一個字串不能是空的。
    + `"regression"` – 邊緣迴歸任務。`label` 陣列中第一個字串所識別之資料行中提供的屬性值會被視為數值。對於邊緣迴歸任務，`label` 陣列中的第一個字串不能是空的。
    + `"link_prediction"` – 連結預測任務。不需要任何屬性值。對於連結預測任務，會忽略 `label` 陣列中的第一個字串。
  + **`split_rate`** – JSON 陣列，其中包含三個介於零和一之間的數字，這些數字加起來最多為一，並代表訓練、驗證和測試階段將分別使用的節點比例估計值。可以定義此欄位或 `custom_split_filenames`，但不能同時定義這兩者。請參閱 [split\$1rate](machine-learning-neptune_ml-targets.md#machine-learning-property-graph-neptune_ml-targets-split_rate)。
  + **`custom_split_filenames`** – JSON 物件，其會指定用來定義訓練、驗證和測試母體之檔案的名稱。可以定義此欄位或 `split_rate`，但不能同時定義這兩者。如需詳細資訊，請參閱[自訂訓練-驗證-測試比例](#machine-learning-custom-stages-splits)。

## `nodes` 陣列中列出之節點組態物件的內容
<a name="machine-learning-graph-nodes-config"></a>

`nodes` 陣列中列出的節點組態物件可以包含下列欄位：

```
      {
        "file_name" : "(path to a CSV file)",
        "separator" : "(separator character)",
        "node"      : ["(column label for the node ID)", "(node type)"],
        "features"  : [(feature array)],
        "labels"    : [(label array)],
      }
```
+ **`file_name`** – 字串，其會指定 CSV 檔案的路徑，而此檔案會儲存具有相同屬性圖標籤之節點的相關資訊。

  該檔案的第一行包含資料行標籤的標頭行。

  第一個資料行標籤是 `~id`，且第一個資料行 (`~id` 資料行) 會儲存節點 ID。

  標頭行中的其餘資料行標籤會為每個剩餘的資料行指定其值已匯出至該資料行的節點屬性名稱。
+ **`separator`** – 字串，其中包含分隔該 CSV 檔案中資料行的分隔符號。
+ **`node`** – 包含兩個字串的 JSON 陣列。第一個字串包含儲存節點 ID 之資料行的標頭名稱。第二個字串指定圖形中的節點類型，該類型對應至節點的屬性圖標籤。
+ **`features`** – 節點特徵物件的 JSON 陣列。請參閱 [列示在節點或邊緣之 `features` 陣列中的特徵物件內容](#machine-learning-graph-node-features-config)。
+ **`labels`** – 節點標籤物件的 JSON 陣列。請參閱 [節點 `labels` 陣列中列出之節點標籤物件的內容](#machine-learning-graph-node-labels-config)。

## 列示在節點或邊緣之 `features` 陣列中的特徵物件內容
<a name="machine-learning-graph-node-features-config"></a>

節點 `features` 陣列中列出的節點特徵物件可以包含下列最上層欄位：
+ **`feature`** – 由三個字串組成的 JSON 陣列。第一個字串包含資料行的標頭名稱，而該資料行包含特徵的屬性值。第二個字串包含特徵名稱。

  第三個字串包含特徵類型。有效的特徵類型列示在 [功能的類型欄位可能值](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-feature-types) 中。
+ **`norm`** – 數值特徵需要此欄位。它會指定要在數值上使用的標準化方法。有效值為 `"none"`、`"min-max"` 和「standard」。如需詳細資訊，請參閱 [標準欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-norm)。
+ **`language`** – 語言欄位會指定文字屬性值中使用的語言。它的用法取決於文字編碼方法：
  + 對於 [`text_fasttext`](machine-learning-feature-encoding.md#machine-learning-fasttext-features) 編碼，此欄位是必要的，且必須指定下列其中一種語言：
    + `en` (英文)
    + `zh` (中文)
    + `hi` (北印度文)
    + `es` (西班牙文)
    + `fr` (法文)

    不過，`text_fasttext` 一次無法處理多種語言。
  + 對於 [`text_sbert`](machine-learning-feature-encoding.md#machine-learning-fasttext-features) 編碼，不會使用此欄位，因為 SBERT 編碼是多語系的。
  + 對於 [`text_word2vec`](machine-learning-feature-encoding.md#machine-learning-word2vec-features) 編碼，此欄位是選用的，因為 `text_word2vec` 僅支援英文。如果存在，它必須指定英文模型的名稱：

    ```
    "language" : "en_core_web_lg"
    ```
  + 對於 [`tfidf`](machine-learning-feature-encoding.md#machine-learning-tfidf-features) 編碼，不會使用此欄位。
+ **`max_length`** – 此欄位是 [`text_fasttext`](machine-learning-feature-encoding.md#machine-learning-fasttext-features) 特徵的選用欄位，其中指定將編碼之輸入文字特徵中的記號數目上限。在到達 `max_length` 之後，會忽略輸入文字。例如，將 max\$1length 設定為 128，表示將忽略文字序列中第 128 個之後的任何記號：
+ **`separator`** – 此欄位可選擇性地與 `category`、`numerical` 和 `auto` 特徵搭配使用。它會指定一個字元，其可以用來將屬性值分成多個類別值或數值。

  請參閱 [分隔符號欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-separator)。
+ **`range`** – `bucket_numerical` 特徵需要此欄位。它會指定要分成儲存貯體的數值範圍。

  請參閱 [範圍欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-range)。
+ **`bucket_cnt`** – `bucket_numerical` 特徵需要此欄位。它會指定由 `range` 參數定義的數值範圍應分成的儲存貯體數目。

  請參閱 [Neptune ML 中的儲存貯體數值特徵](machine-learning-feature-encoding.md#machine-learning-bucket_numerical-features)。
+ **`slide_window_size`** – 此欄位可選擇性地與 `bucket_numerical` 特徵搭配使用，以將值指派給多個儲存貯體。

  請參閱 [slide\$1window\$1size 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-slide_window_size)。
+ **`imputer`** – 此欄位可選擇性地與 `numerical`、`bucket_numerical` 和 `datetime` 特徵搭配使用，以提供填入缺失值的插補技術。支援的插補技術為 `"mean"`、`"median"` 和 `"most_frequent"`。

  請參閱 [imputer 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-imputer)。
+ **`max_features`** – `text_tfidf` 特徵可選擇性地使用此欄位，來指定要編碼的字詞數上限。

  請參閱 [max\$1features 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-max_features)。
+ **`min_df`** – `text_tfidf` 特徵可選擇性地使用此欄位，來指定要編碼之字詞的文件頻率下限

  請參閱 [min\$1df 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-min_df)。
+ **`ngram_range`** – `text_tfidf` 特徵可選擇性地使用此欄位，來指定哪個範圍或多少單字或記號要被視為要編碼的潛在個別字詞

  請參閱 [ngram\$1range 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-ngram_range)。
+ **`datetime_parts`** – `datetime` 特徵可選擇性地使用此欄位，來指定日期時間值的哪些部分要進行類別編碼。

  請參閱 [datetime\$1parts 欄位](machine-learning-neptune_ml-features.md#machine-learning-neptune_ml-features-datetime_parts)。

## 節點 `labels` 陣列中列出之節點標籤物件的內容
<a name="machine-learning-graph-node-labels-config"></a>

節點 `labels` 陣列中列出的標籤物件會定義節點目標特徵，並會指定訓練、驗證和測試階段將使用的節點比例。每個物件可以包含下列欄位：

```
      {
        "label"      : ["(column label for the target feature property value)", "(task type)"],
        "split_rate" : [(training proportion), (validation proportion), (test proportion)],
        "custom_split_filenames" : {"train": "(training file name)", "valid": "(validation file name)", "test": "(test file name)"},
        "separator"  : "(separator character for node-classification category values)",
      }
```
+ **`label`** – 包含兩個字串的 JSON 陣列。第一個字串包含資料行的標頭名稱，而該資料行會儲存特徵的屬性值。第二個字串指定目標任務類型，其可以是：
  + `"classification"` – 節點分類任務。所指定資料行中的屬性值用來建立類別特徵。
  + `"regression"` – 節點迴歸任務。所指定資料行中的屬性值用來建立數值特徵。
+ **`split_rate`** – JSON 陣列，其中包含三個介於零和一之間的數字，這些數字加起來最多為一，並代表訓練、驗證和測試階段將分別使用的節點比例估計值。請參閱 [split\$1rate](machine-learning-neptune_ml-targets.md#machine-learning-property-graph-neptune_ml-targets-split_rate)。
+ **`custom_split_filenames`** – JSON 物件，其會指定用來定義訓練、驗證和測試母體之檔案的名稱。可以定義此欄位或 `split_rate`，但不能同時定義這兩者。如需詳細資訊，請參閱[自訂訓練-驗證-測試比例](#machine-learning-custom-stages-splits)。
+ **`separator`** – 包含分隔符號的字串，此分隔符號會分隔分類任務的類別特徵值。

**注意**  
如果未對邊緣和節點兩者提供標籤物件，則會自動假設任務為連結預測，且邊緣會隨機分割成 90% 用於訓練，10% 用於驗證。

## 自訂訓練-驗證-測試比例
<a name="machine-learning-custom-stages-splits"></a>

根據預設，Neptune ML 會使用 `split_rate` 參數，以使用此參數中定義的比例，將圖形隨機分割成訓練、驗證和測試母體。若要更精確地控制在這些不同母體中使用哪些實體，可以建立明確定義它們的檔案，然後[可以編輯訓練資料組態檔案](machine-learning-processing-training-config-file.md)，將這些索引檔案對應至母體。此對應是由 JSON 物件針對訓練組態檔案中的 [`custom_split_filesnames`](#custom_split_filenames) 索引鍵所指定。如果使用此選項，則必須為 `train` 和 `validation` 索引鍵提供檔案名稱，而對於 `test` 索引鍵則是選用的。

這些檔案的格式應符合 [Gremlin 資料格式](bulk-load-tutorial-format-gremlin.md#bulk-load-tutorial-format-gremlin-systemheaders)。特別是，對於節點層級任務，每個檔案應包含其 `~id` 標頭列出節點 ID 的資料行，而對於邊緣層級任務，檔案應分別指定 `~from` 和 `~to`，以指示邊緣的來源和目的地節點。這些檔案必須放置在與用於資料處理之匯出資料相同的 Amazon S3 位置 (請參閱：[`outputS3Path`](export-parameters.md#export-parameters-outputS3Path))。

對於屬性分類或迴歸任務，這些檔案可以選擇性地定義機器學習任務的標籤。在此情況下，檔案必須具有一個屬性資料行，其標頭名稱與[訓練資料組態檔案中定義的](#machine-learning-graph-node-labels-config)相同。如果在匯出的節點和邊緣檔案以及自訂分割檔案中都定義了屬性標籤，則會優先考慮自訂分割檔案。