涵蓋的主題如下:
所有表格資料模型的最佳做法
無論是建立 AutoML 模型,還是使用表格資料的自訂訓練模型,都適用下列最佳做法。
避免資料外洩
當您要求推論,而訓練資料包含無法使用的預測性資訊時,就會發生資料外洩。資料外洩可能會導致模型顯示優異的評估指標,但在真實資料上的表現不佳。
舉例來說,假設您想知道商店明天會賣出多少冰淇淋,但您無法在訓練資料中加入目標日的溫度,因為您不知道當日溫度 (事情尚未發生)。不過,您可以使用前一天的「預測」溫度,並將其納入推論要求。
如果您在多個資料分割中使用相同資料,也可能發生資料外洩。如果您使用時間序列資料,請確保同一日期範圍的資料只會用於其中一個資料分割。
避免訓練提供偏移
當您產生訓練資料的方式與您請求推論時所用的資料產生方式不同時,就會發生訓練提供偏移。
例如,如果您使用的是平均值,且取 10 天的平均值供訓練使用,但當您請求推論時,卻取了上個月的平均值。
一般來說,請檢查訓練資料與服務資料 (您用來產生推論的資料) 的產生方式是否有任何差異,以避免訓練服務偏移。
訓練/應用偏差和資料分布
訓練、驗證和測試資料分割中的資料分布情形,也可能導致訓練/服務偏移。模型部署到正式環境時所看到的資料分布,通常與模型訓練所用的資料集分布不同。舉例來說,在正式環境中,模型可能套用至與訓練期間完全不同的使用者群,也可能在記錄最終訓練資料的 30 天後,用於進行推論。
為獲得最佳結果,請確保用於建立模型的資料分割分布情況,能準確反映訓練資料與您在正式環境中進行推論的資料之間的差異。Vertex AI 可能會產生非單調推論,如果正式環境資料的取樣分布與訓練資料差異極大,非單調推論的可靠性就不高。
此外,正式環境資料和訓練資料之間的差異,必須反映在驗證資料分割與訓練資料分割之間,以及測試資料分割與驗證資料分割之間。
舉例來說,如果您打算在接下來 30 天內推斷使用者生命週期價值 (LTV),請確保驗證資料分割中的資料來自訓練資料分割後 30 天,且測試資料分割中的資料來自驗證資料分割後 30 天。
同樣地,如要調整模型,以便對新使用者做出一般推論,請確保特定使用者的資料只會包含在訓練資料的單一分割中。舉例來說,所有與 user1 相關的資料列都會納入訓練資料分割,所有與 user2 相關的資料列都會納入驗證資料分割,所有與 user3 相關的資料列都會納入測試資料分割。
提供時間信號
如果是分類和迴歸模型,如果資料中的基礎模式會隨著時間變化 (不是即時隨機分布),請將該資訊提供給 Vertex AI。您可以使用下列幾種方式提供時間信號:
如果每一列的資料都有時間戳記,請確保在訓練模型時,該欄已包含在內、轉換類型為
Timestamp,且設為「時間」欄。這個順序會用來分割資料,最新資料會做為測試資料,最舊資料則做為訓練資料。瞭解詳情。如果時間資料欄沒有許多不重複的值,請改用手動分割,不要使用時間資料欄分割資料。否則,每個資料集可能不會有足夠的資料列,導致訓練失敗。
如果單一欄中沒有包含時間資訊,您可以使用手動資料分割,將最新資料做為測試資料,最舊資料做為訓練資料。
在需要時讓資料變得明確
對於某些資料原始型別,您可以透過工程特徵來提升模型品質。
例如,如果您的資料包含經度和緯度,系統會將這些資料欄視為數值 (不含特別的計算)。如果位置或距離提供問題的信號,請設計可明確提供該資訊的特徵。
可能需要特徵工程的某些資料類型:
- 經度/緯度
- 網址
- IP 位址
- 電子郵件地址
- 電話號碼
- 其他地理代碼 (例如郵遞區號)
在資料列中加入計算或匯總資料
Vertex AI 只會使用單一資料列中的輸入資料,預測該資料列的目標值。如果您已計算或彙整其他資料列或來源的資料,且這些資料有助於判斷資料列的預測值,請將這些資料與來源資料列一併納入。請注意,新資料欄不得導致資料外洩或訓練/服務偏移。
舉例來說,如要預測下週的產品需求,請加入含有下列值的資料欄,提升推論品質:
- 與產品同類別的有現貨商品總數。
- 與產品相同類別的有現貨商品平均價格。
- 要求推論時,距離已知節慶的天數。
在另一個例子中,如果您想預測特定使用者是否會購買產品,請加入含有下列值的資料欄,提升推論品質:
- 特定使用者的平均歷史轉換率或點閱率。
- 使用者購物車中目前的產品數量。
避免偏誤
請確保訓練資料足以代表您要進行推論之可能資料的整個範圍。舉例來說,如果您的顧客遍布全球,請勿使用只來自一個國家/地區的訓練資料。
表格型 AutoML 模型的最佳做法
以下是為 AutoML 表格模型建立表格型訓練資料的最佳做法。
適當表示空值
如果您透過 CSV 匯入,請使用空字串來代表空值。從 BigQuery,請使用 NULL 值。
如果資料使用特殊字元或數字 (包括零) 來表示空值,這些值會遭到誤解,導致模型品質降低。
盡量避免遺漏值
檢查資料是否有遺漏值,並盡可能修正。否則,您可以將值留空,系統會將其視為空值。
使用空格來分隔文字
Vertex AI 會將文字字串符記化,且可以從個別文字中衍生訓練信號,而且也會使用空格來分隔文字;其他字元分隔的字詞則會視為單一實體。
舉例來說,如果您提供文字「紅/綠/藍」,系統就不會將此文字符記化為「紅」、「綠」和「藍」。如果這些個別字詞對模型的訓練來說可能很重要,請先將文字轉換為「紅綠藍」,再將此文字包含在訓練資料中。
請確保類別特徵精準且乾淨
資料不一致可能會導致類別分割錯誤。舉例來說,如果您的資料包含「棕」和「褐」,Vertex AI 會以個別的類別來使用這些值,但您可能預期它們是相同的類別。拼字錯誤可能會有類似的影響。請確保您將這類不一致從類別資料中移除,再建立您的訓練資料。
使用不平衡的類別時,請格外小心分類模型
如果您擁有不平衡的類別 (一或多個結果很少出現的分類問題),請參閱下列提示。
為少數類別提供充分的訓練資料
某個類別的資料列太少時,會使模型品質降低。如有可能,請為每個類別提供至少 100 列資料。
考慮使用手動分割
Vertex AI 會隨機 (但決定性的) 選取列做為測試資料集。對於不平衡的類別,測試資料集中的少數類別數量可能會很少 (或沒有),導致訓練失敗。
如果類別不平衡,建議您指派手動分割,確保每個分割都包含足夠的少數結果列。
提供足夠的訓練資料
如果提供的訓練資料不足,產生模型的表現可能會不盡理想。訓練模型所用的欄越多,您需要提供的資料越多。
資料集必須隨時包含至少 1,000 列。
下表提供一些啟發式方法,說明應提供多少訓練資料 (視目標而定)。
| 目標 | 建議的最低訓練資料量 |
|---|---|
| 分類 | 列數至少為欄數的 10 倍。 |
| 預測 | 用於訓練模型的每個資料欄,至少要有 10 個時間序列。 |
| 迴歸 | 列數至少為欄數的 50 倍。 |
讓 Vertex AI 負責所有其他預先處理與轉換
除非另有說明,否則訓練 AutoML 模型時,請讓 Vertex AI 為您執行特徵工程。AutoML 存取基礎資料時,效果最佳。如要查看 AutoML 依轉換類型執行的所有轉換作業清單,請參閱 Vertex AI 轉換作業。
表格型預測模型的最佳做法
預測模型的訓練資料有一些特殊考量。
選擇資料精細程度的注意事項
訓練預測模型時,請指定資料精細程度,也就是訓練資料列之間的時間間隔。間隔可以是每小時、每天、每週、每月或每年,也可以是每 1、5、10、15 或 30 分鐘。
訓練資料和所有批次推論資料的資料精細程度必須一致。如果您指定每日精細度,且兩列訓練資料之間有 2 天的間隔,Vertex AI 會將中間的日期視為遺漏資料,這可能會導致模型效能下降。如果同一時間序列中的多個資料列具有相同時間戳記 (由細微程度決定),在訓練時會視為驗證錯誤。
一般來說,資料精細度取決於資料收集做法。
如何找出合適的背景期間值
如果您預期會有大量不會延伸到過去的推論資料 (冷啟動),請先將內容視窗設為 0。否則,內容視窗的大小應介於預測範圍的大小和預測範圍大小的 10 倍之間。
您可以嘗試下列步驟,找出資料的合適值:
在第一次訓練疊代時,請將背景期間和預測期間設為相同的值,並將訓練預算設為至少 6 小時。
再次訓練模型,訓練預算維持不變,但將背景期間大小加倍,設為預測期間大小的 2 倍。
如果第二個模型的評估指標顯示大幅改善,請再次訓練模型,將內容視窗增加至預測範圍大小的 5 倍。考慮按比例增加訓練預算 (如果您在第一步訓練了 10 小時,請將訓練預算增加至 50 小時)。
持續增加脈絡視窗,直到評估指標不再改善,或您對結果感到滿意為止。然後將脈絡視窗還原為產生可接受結果的最低值。
擴大脈絡窗口會產生下列影響:
增加訓練時間
如果內容視窗較大,模型在訓練時會使用更多資料點,導致訓練時間增加。
增加推論資料所需的歷來資料量
推論資料應提供與內容視窗值一樣多的歷來資料點。
資料格式的最佳做法
您可以寬或窄格式建立訓練資料。迴歸和分類模型廣泛使用寬格式,且較容易組裝和審查。使用窄格式的預測模型可協助您避免在資料和目標之間建立非預期的關聯 (資料外洩)。
建立訓練資料來訓練預測模型時,每列應代表單一時間序列的單一觀察結果。您必須有代表時間序列 ID 的資料欄 (時間序列彼此的區別方式),以及代表要預測值的資料欄 (目標)。接著,要求目標推論時,必須提供用於訓練模型的所有其他資料列值。
請看以下 (簡化和縮寫) 範例訓練資料:
| 日期 | Widget_1_Demand | Widget_2_Demand | Widget_3_Demand | 宣傳 | 區域 |
|---|---|---|---|---|---|
| 01/01/2019 | 112 | 241 | 0 | 0 | CA |
| 01/02/2019 | 141 | 219 | 0 | 1 | CA |
| 01/03/2019 | 149 | 244 | 0 | 0 | CA |
| 01/01/2019 | 52 | 0 | 43 | 0 | IL |
| 01/02/2019 | 81 | 0 | 26 | 1 | IL |
| 01/03/2019 | 89 | 0 | 86 | 0 | IL |
這個寬格式的表格會依日期顯示業務資料,但目前無法用於預測模型。表格中沒有單一目標資料欄和時間序列 ID 資料欄,而且您無法得知在推論時,其他小工具的需求量。
您可以將這個表格轉換為以下格式:
| 日期 | 產品 | Region_CA_Demand | Region_IL_Demand | 宣傳 |
|---|---|---|---|---|
| 01/01/2019 | Widget_1 | 112 | 52 | 0 |
| 01/02/2019 | Widget_1 | 141 | 81 | 1 |
| 01/03/2019 | Widget_1 | 149 | 89 | 0 |
| 01/01/2019 | Widget_2 | 241 | 0 | 0 |
| 01/02/2019 | Widget_2 | 219 | 0 | 1 |
| 01/03/2019 | Widget_2 | 244 | 0 | 0 |
| 01/01/2019 | Widget_3 | 0 | 43 | 0 |
| 01/02/2019 | Widget_3 | 0 | 26 | 1 |
| 01/03/2019 | Widget_3 | 0 | 86 | 0 |
我們現在有潛在的時間序列 ID 欄「產品」。不過,這種格式只能用於預測其中一個區域,而另一個區域的資料則需要在推論時得知。
解決方法是轉換為窄格式,讓每個資料列代表單一觀察結果。與時間序列無關的資料會針對每個資料列重複:
| 日期 | 需求 | ID | 宣傳 |
|---|---|---|---|
| 01/01/2019 | 112 | Widget_1_CA | 0 |
| 01/02/2019 | 141 | Widget_1_CA | 1 |
| 01/03/2019 | 149 | Widget_1_CA | 0 |
| 01/01/2019 | 52 | Widget_1_IL | 0 |
| 01/02/2019 | 81 | Widget_1_IL | 1 |
| 01/03/2019 | 89 | Widget_1_IL | 0 |
| 01/01/2019 | 241 | Widget_2_CA | 0 |
| 01/02/2019 | 219 | Widget_2_CA | 1 |
| 01/03/2019 | 244 | Widget_2_CA | 0 |
| 01/01/2019 | 0 | Widget_2_IL | 0 |
| 01/02/2019 | 0 | Widget_2_IL | 1 |
| 01/03/2019 | 0 | Widget_2_IL | 0 |
| 01/01/2019 | 0 | Widget_3_CA | 0 |
| 01/02/2019 | 0 | Widget_3_CA | 1 |
| 01/03/2019 | 0 | Widget_3_CA | 0 |
| 01/01/2019 | 43 | Widget_3_IL | 0 |
| 01/02/2019 | 26 | Widget_3_IL | 1 |
| 01/03/2019 | 86 | Widget_3_IL | 0 |
現在我們有時間序列 ID、目標資料欄 (需求) 和時間資料欄 (日期)。此外,每個資料列都以單一觀察結果為依據,可用於預測目標值。Promo 資料欄則做為特徵,用於訓練模型。
實際上,您會擁有比這些範例多出許多列和欄。但您必須遵循此處的指南來建構資料,避免資料外洩。