本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Neptune ML 中的特徵編碼
屬性值有不同的格式和資料類型。若要在機器學習中實現良好的效能,必須將這些值轉換為稱為特徵的數值編碼。
Neptune ML 會使用這裡描述的特徵編碼技術,執行特徵擷取和編碼,做為資料匯出和資料處理步驟的一部分。
注意
如果您計劃在自訂模型實作中實作自己的特徵編碼,則可以選取 none
做為特徵編碼類型,來停用資料預先處理階段中的自動特徵編碼。然後,不會對該節點或邊緣屬性進行任何特徵編碼,而是剖析原始屬性值並將其儲存在字典中。資料預先處理仍會從匯出的資料集建立 DGL 圖形,但是建構的 DGL 圖形沒有預先處理的訓練特徵。
僅在您計劃執行自訂特徵編碼,做為自訂模型訓練的一部分時,才應使用此選項。如需詳細資訊,請參閱 Neptune ML 中的自訂模型。
Neptune ML 中的類別特徵
可以從可能值的固定清單中獲得一個或多個不同值的屬性,就是類別特徵。在 Neptune ML 中,類別特徵會使用獨熱編碼
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 中的數值特徵
其值為實數的任何屬性都可以編碼為 Neptune ML 中的數值特徵。數值特徵會使用浮點數進行編碼。
您可以指定要在編碼數值特徵時使用的資料標準化方法,如下所示:"norm": "
。支援以下標準化技術:normalization technique
"
-
「none」 – 不要在編碼期間標準化數值。
-
「min-max」 – 透過從中減去最小值,然後將其除以最大值與最小值之間的差值來標準化每個值。
-
「standard」 – 將每個值除以所有值的總和來標準化這些值。
Neptune ML 中的儲存貯體數值特徵
您可以將數值壓縮為類別,而不是使用原始數字表示數值屬性。例如,您可以將人們的年齡分成兒童 (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 中的文字特徵編碼
對於自由格式的文字,Neptune ML 可以使用數個不同的模型,將屬性值字串中的記號序列轉換為固定大小的實數值向量:
text_fasttext – 使用 fastText
編碼。對於使用 fastText 所支援五種語言的一種且只有一種的特徵,這是建議的編碼方式。 text_sbert – 使用句子 BERT
(SBERT) 編碼模型。對於 text_fasttext
不支援的文字,這是建議的編碼方式。text_word2vec – 使用 Google
最初發佈的 Word2VEC 演算法來編碼文字。Word2Vec 只支援英文。 text_tfidf – 使用詞頻-逆向文件頻率
(TF-IDF) 向量化程式來編碼文字。TF-IDF 編碼支援其他編碼不支援的統計特徵。
Neptune ML 中文字屬性值的 fastText 編碼
Neptune ML 可以使用 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) 編碼
Neptune ML 可以使用句子 BERTtext_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 編碼
Neptune ML 可以將字串屬性值編碼為 Word2Vec 特徵 (Word2Vec 演算法text_word2vec
方法會使用其中一個 spaCy 訓練模型
下列範例會指定影片標題使用 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 編碼
Neptune ML 可以將文字屬性值編碼為 text_tfidf
特徵。這種編碼會使用詞頻-逆向文件頻率
TF-IDF
例如,如果在給定電影標題中出現兩次「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 中的日期時間特徵
Neptune ML 可以將 datetime
屬性值的一部分編碼為類別特徵,方法是將它們轉換為獨熱陣列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 中的自動特徵編碼
您可以將 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 支援其中一種語言,即英文、中文、北印度文、西班牙語和法文,則 Neptune ML 會使用
text_fasttext
來編碼文字。否則,Neptune ML 會使用 text_sbert。如果屬性是未分類為文字特徵的字串,則 Neptune ML 會假定它是類別特徵,並使用類別編碼。
如果每個節點對於推斷為類別特徵的屬性都有自己的唯一值,Neptune ML 會從訓練圖表中捨棄屬性,因為它可能是不會對學習提供資訊的 ID。
-
如果已知屬性包含有效的 Neptune 分隔符號,例如分號 (「;」),則 Neptune ML 只能將該屬性視為
MultiNumerical
或MultiCategorical
。Neptune ML 首先嘗試將值編碼為數值特徵。如果成功,Neptune ML 會使用數值編碼來建立數值向量特徵。
否則,Neptune ML 會將這些值編碼為多重類別。
如果 Neptune ML 無法推斷屬性值的資料類型,Neptune ML 會從訓練圖中捨棄屬性。