

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

# 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 會從訓練圖中捨棄屬性。