特徵工程是機器學習系統成功的根本,它直接影響模型的預測能力和泛化效能。在設計機器學習系統時,需要仔細考慮特徵的選擇、提取和轉換,以確保模型能夠有效地從資料中學習到有用的模式。對於不同型別的業務場景,例如電商銷售預測和影像搜尋排序,特徵工程的策略和方法也會有所不同。良好的特徵工程需要平衡預測精確度、可解釋性、計算成本以及特徵穩定性等多個因素。除了特徵工程本身,模型的評估和驗證也是至關重要的。A/B 測試可以幫助我們在真實環境中比較不同模型的效能,而無偏估計器則可以在離線環境下模擬線上效果,從而降低實驗成本和風險。此外,人工評估在某些特定場景下,例如評估大語言模型的生成品質,仍然具有不可替代的作用。
11.5 設計檔案:特徵工程
在介紹本章的開頭時,我們曾提到特徵是機器學習系統預測能力的骨幹。因此,特徵工程在設計檔案中佔有重要地位。我們將在兩個設計檔案中都涵蓋特徵工程的內容。
11.5.1 Supermegaretail 的特徵
在建立基準解決方案後,我們需要確定下一步的改進措施。使用能夠幫助模型從原始資料中提取有用模式和關係的特徵,是其中一種主要方法。
Supermegaretail 的設計檔案:特徵
選擇正確特徵的主要標準(除了預測品質外)包括:
- 預測品質:預測越準確越好。
- 可解釋性和可說明性:我們更傾向於使用容易描述和解釋的特徵。黑箱解決方案不夠透明,也不可信賴,尤其是在專案的初始階段。
- 計算時間和計算複雜度:計算時間長或來自多個資料來源且具有複雜依賴關係的特徵,不太受歡迎,除非它們能顯著提高預測品質。因為它們會減慢訓練週期,並減少我們可以測試的假設數量。
- 風險和特徵穩定性:需要外部或多個資料來源、輔助模型(或設計不良的特徵)以及根據低資料品質的資料來源的特徵,會使流程更加脆弱,應避免使用。
如果某個特徵在統計上顯著提高了模型的效能,但違反了其他標準之一(例如,需要2天計算時間),我們傾向於不將其加入流程中。
新特徵的主要來源包括:
- 新增更多的內部和外部資料來源(例如,監控競爭對手)。
- 轉換和組合現有特徵。
以下是我們將實驗的一些特徵,這些將指導我們在初始佈署後進一步改進模型的步驟:
- 競爭對手的價格以及與我們價格的差異(外部來源)。
- 特別促銷和折扣日曆。
- 價格(舊價格、折扣價格)。
- 滲透率(某SKU銷售量與該類別銷售量的比率)。
- SKU的屬性(品牌、不同級別的類別)。
- 線性彈性係數。
- 過去N天某SKU銷售量的總和/最小值/最大值/平均值/標準差。
- 過去N天某SKU銷售量的中位數/分位數。
- 預測天氣(外部來源)。
- 商店流量(外部來源)。
- 商店銷售量。
- 一年前該SKU的銷售量。
- 經濟指標(外部來源)。
我們將這些特徵表述為假設。例如,使用促銷日曆將幫助模型捕捉到行銷活動期間需求的瞬間增加,從而減少該期間的過量庫存。
我們將使用模型無關的方法(SHAP、LIME、shuffle importance)和內建方法(線性模型的係數、梯度提升中的分裂次數)來衡量特徵的重要性。主要目標是瞭解每個特徵對模型輸出的貢獻。如果某個特徵貢獻不大,我們將其刪除。
在第一階段(當我們尚未確定基本特徵集時),我們使用RFE進行自動特徵選擇。
此外,我們在訓練流程中加入了特徵測試,包括訓練前和訓練後:
- 測試特徵範圍和異常值檢測器(例如,0.0 <= 折扣 < X)。
- 測試任意一對特徵之間的相關性是否小於X。
- 測試特徵的係數/分裂次數 > 0。
- 測試計算時間是否小於6小時(對於任何特徵)。
為了更方便地計算和存取特徵,我們可以重用集中的特徵儲存函式庫,它從資料倉儲中的不同來源收集資料,經過不同的轉換和聚合後,將其合併到一個資料集市(SKU、商店、天)。它每天重新計算特徵,使得實驗新的特徵和追蹤它們的版本、依賴關係和其他元資訊變得容易。
11.5.2 PhotoStock Inc. 的特徵
PhotoStock Inc. 的潛在特徵集將與Supermegaretail的完全不同。
PhotoStock Inc. 的設計檔案:特徵
正如我們在基準部分所述,我們旨在透過測量查詢和檔案(影像+其描述)之間的距離來開始純粹的內容相關性系統: 相關性評分 = 距離(查詢,影像)+ 距離(查詢,描述)
雖然這可能導致結論認為不需要特徵工程,但至少有兩個原因表明事實並非如此:
- 影像描述和後設資料需要以某種方式轉換,以便用作模型的輸入。因此,我們需要提出一種強健且可擴充套件的方法來做到這一點。
- 我們可能希望在稍後階段引入代表使用者和檔案的額外訊號源。例如,這些檔案的點選率、平均購買率和使用者在檔案頁面上的停留時間等。
資料倉儲
此圖示展示了資料倉儲如何透過特徵計算支援需求預測模型,並透過轉換與聚合形成資料集市,每天重新計算以支援實驗和追蹤。
內容解密:
此Plantuml圖表展示了從資料倉儲到需求預測模型的流程。首先,資料倉儲進行特徵計算,將結果輸入需求預測模型。同時,資料倉儲中的資料經過轉換與聚合,形成以SKU、商店和天為基礎的資料集市,並每天重新計算,以方便實驗新特徵和追蹤其版本等元資訊。這個流程有效地支援了模型的訓練和預測。
11 特徵與特徵工程
在建構搜尋與排序系統時,特徵的選擇與工程至關重要。使用者特徵的範例包含點選歷史的匯總、個人設定檔的明確設定,或是透過協同過濾方式計算出的特徵。這在搜尋引擎中是一個典型的應用場景。最後,我們可能還會使用與照片作者相關的特徵,例如他們的平均評價或銷售數量,以默默地促進核心貢獻者。然而,這需要大量的工作,因此我們不希望立即進行,但仍希望設計一個易於擴充套件的系統。
考慮到我們預期會有新型別的特徵出現,因此應該設計一個能夠有效利用多種來源訊號並輸出統一相關性分數的系統。例如:
relevancy_score = distance_function(query_to_image_distance, query_to_description_distance, user_features, document_features, any_other_features_we_want_to_add_later)
在這個基礎範例中,我們建議距離函式是距離的簡單總和。然而,這並不是唯一選擇。一個直接的選擇是使用加權總和,這實際上是在距離之上訓練一個小型線性模型。
I. 編碼照片後設資料
考慮到我們使用的是多模態的 CLIP 風格編碼器,我們可以利用它可以接受任何文字作為輸入的事實。因此,我們可以將後設資料編碼為文字並將其饋送到編碼器中。我們建議收集照片的所有重要屬性並將它們串聯成一個單一的字串,例如遵循以下範本:
“描述:{描述}, 標籤:{標籤}, 地點:{地點}”
內容解密:
- 這段程式碼展示瞭如何將照片的後設資料編碼為一個字串,並將其作為 CLIP 編碼器的輸入。
{描述}、{標籤}和{地點}是從照片的後設資料中提取出的欄位。- 這種方法允許我們將多種不同的後設資料整合到一個統一的表示中。
生成這樣的提示是一種通用方法。我們確信描述和標籤是後設資料的重要組成部分,但我們還可以構建更多特徵。例如,在這裡我們建議如果照片 EXIF 資料中包含座標,則使用地點資訊。可能還有其他類別似的低垂果實,例如從日期中構建特徵(以反映季節)、相機型號等。此外,我們可能需要過濾標籤,例如修剪標籤列表以保留最具資訊量的部分。
正如前面所討論的,從後設資料中建立的特徵具有一定的靈活性。然而,特徵越多,複雜度就越高。即使新增一個虛擬特徵不會影響模型的效能指標,它仍可能增加訓練和推斷時間,因為根據 Transformer 的模型在輸入長度上是四次方的。因此,我們需要謹慎控制使用的特徵數量,並應用特徵選擇技術來保持複雜度在控制之下。鑑於特徵的性質,我們不能直接使用過濾方法,而且由於特徵數量較少,我們建議使用精確但較慢的方法(例如,順序貪婪特徵選擇)。
II. 特徵重要性
我們至少在兩種情況下需要取得特徵重要性:
- 我們需要對模型有整體理解,以設定未來工作的優先順序。例如,如果我們發現模型嚴重依賴後設資料特徵,我們可能會希望在後設資料特徵工程管道上投入更多資源。同時,我們希望所有元件都能對最終分數有所貢獻,以減少過擬合的風險,並降低創作者利用模型弱點(例如,過度最佳化他們上傳的照片的標籤)的可能性。
- 將會有關於排名品質的投訴,我們需要了解其原因。因此,我們需要能夠解釋特定查詢和特設定檔案的排名。這可能會揭示新的改進機會,並檢測一些系統性問題。
幸運的是,我們不需要像特徵儲存這樣的新元件來實作這裡描述的解決方案。然而,如果/當我們開始使用使用者行為資料作為特徵來源時,就需要預先計算並儲存特徵。在這種情況下,特徵儲存是一個自然的選擇。
衡量與報告結果
在前面的章節中,我們討論了構成機器學習(ML)系統骨幹的基本元件,從資料收集和模型選擇開始,接著是度量指標、損失函式和驗證分割,最後是全面的錯誤分析。在所有這些元素都牢固地建立在管道中的情況下,是時候回過頭來思考系統的初始目的,並考慮如何正確報告所取得的結果。
報告包括根據 ML 系統的最終目標評估其效能,並與團隊成員和利益相關者分享結果。在第 5 章中,我們介紹了兩種型別的度量指標:線上和離線度量指標,它們產生兩種型別的評估:離線測試和線上測試。雖然離線測試相對簡單,但線上測試意味著在現實世界的場景中執行實驗。通常,最有效的途徑涉及一系列 A/B 測試,這是開發高效、正常運作的模型的關鍵程式,我們將在接下來的章節中介紹。
本章涵蓋:
- 衡量結果
- 從 A/B 測試中受益
- 報告收到的結果
量測結果與報告產出
在實施機器學習(ML)系統之前,我們需要完全理解所要達到的目標。因此,我們的設計檔案應該從目標描述開始。同樣地,在進行實驗以檢查變更如何影響系統之前(在本章中,我們主要關注A/B測試),我們會設計它並概述一個假設,涵蓋我們對給定變更如何影響指標的預期。這就是離線測試的用武之地,因為使用離線評估作為線上評估的代理是一種有效且有益的方法。其目標是快速確定新的(修改後的)解決方案是否優於現有的解決方案,如果是,嘗試量化其優越程度。
模型效能評估
評估的第一層通常涉及基本的ML指標估計。我們假設,除了離線指標(常見的指標如均方根誤差、平均絕對百分比誤差或歸一化折扣累積增益)之外,我們還改善了業務指標(每個使用者的平均收入或點選率[CTR])。預測評估是檢查模型品質和迭代不同版本的最快方法,但它通常也是與業務指標最遠的指標(預測品質與線上指標之間的關係通常並非理想)。
轉換至業務指標
在某些場景中,我們可以從模型預測轉換到現實世界的業務指標。讓我們考慮預測航空機票銷售的例子。通常,用於預測的基本模型效能指標是加權平均百分比誤差(WAPE)和偏差。假設我們有兩個模型,每個模型對於預測特定航班在特定時間的機票銷售都有±10%的偏差。在這個例子中,我們預測在給定的時間段內售出110張票,而實際售出的票數是100張。同時,假設我們有每天的實際票價。
程式碼範例:計算模型偏差與WAPE
# 實際售票數
actual_sales = [120, 90, 110, 80]
# 模型A與模型B的預測銷售量
model_a_sales = [90, 90, 90, 90]
model_b_sales = [110, 110, 110, 110]
# 票價
ticket_prices = [200, 220, 230, 210]
# 計算總收入
def calculate_revenue(actual_sales, predicted_sales, ticket_prices):
revenue = sum(min(actual, predicted) * price for actual, predicted, price in zip(actual_sales, predicted_sales, ticket_prices))
return revenue
model_a_revenue = calculate_revenue(actual_sales, model_a_sales, ticket_prices)
model_b_revenue = calculate_revenue(actual_sales, model_b_sales, ticket_prices)
print(f"Model A Revenue: ${model_a_revenue}")
print(f"Model B Revenue: ${model_b_revenue}")
內容解密:
此程式碼範例展示瞭如何根據實際售票數、模型預測銷售量和票價計算總收入。calculate_revenue函式遍歷實際銷售量、預測銷售量和票價,清算每個時間段的收入,並傳回總收入。這種計算方式反映了業務指標(如收入)與模型預測之間的直接關係。
模擬環境
當風險較高時,投資於更為複雜、計算成本更高但更穩健的離線測試程式是合理的。為當前問題構建線上環境的模擬器,並針對此模擬器執行演算法,可以成為這樣的投資。一個好的例子是時間序列預測,這相對簡單,因為有標籤、輔助資訊(例如歷史成本或庫存商品周轉率)和結果的解析度。通常,線上推薦系統(如新聞、廣告或產品推薦)則不是這種情況,因為我們處理的是部分標記的資料;我們只知道向特定使用者展示的內容專案的印象(瀏覽量、點選量和轉換率),而那些我們沒有展示的內容則沒有使用者反饋。
多臂老虎機問題與回放演算法
線上推薦系統有時透過多臂老虎機和情境老虎機方法來解決(通常,這類別推薦系統被稱為實時競價,但其目標仍然相同——從多個選項中提供最佳選擇以最大化特定獎勵)。有一個代理,即我們的演算法,它與環境“互動”。例如,它消耗有關使用者上下文的資訊(他們最近的歷史記錄),並選擇顯示哪個廣告橫幅以最大化CTR、轉換率(CVR)或有效每千次展示成本(eCPM)。這是一個典型的強化學習問題,具有很大的反饋環影響:先前顯示的廣告會改變未來的使用者行為,並提供有關他們偏好的資訊。
程式碼範例:簡單的多臂老虎機模擬
import numpy as np
class Bandit:
def __init__(self, arms=10):
self.arms = arms
self.means = np.random.rand(arms)
def pull(self, arm):
return np.random.randn() + self.means[arm]
# 初始化多臂老虎機
bandit = Bandit()
# 簡單隨機選擇臂
chosen_arm = np.random.choice(bandit.arms)
reward = bandit.pull(chosen_arm)
print(f"Chosen Arm: {chosen_arm}, Reward: {reward}")
內容解密:
此程式碼範例演示了一個簡單的多臂老虎機模擬。多臂老虎機是一種用於解決探索與利用困境的演算法框架。在這個例子中,我們定義了一個Bandit類別,它初始化了一定數量的臂,每個臂都有一個隨機產生的平均獎勵。pull方法模擬拉動一個臂並獲得獎勵,這裡獎勵是根據正態分佈產生的隨機數加上該臂的平均獎勵。這種模擬可以用來測試不同的策略,例如ε-貪婪演算法,以最大化累積獎勵。
衡量與報告結果的關鍵方法
在機器學習(ML)系統的開發與最佳化過程中,如何有效地衡量與報告結果是至關重要的。這不僅關乎模型的效能評估,也直接影響到後續的決策制定與系統改進。
無偏估計器(Unbiased Estimator)的工作原理
無偏估計是一種根據歷史資料的離線驗證方法,用於評估新模型或演算法在模擬環境下的表現。其核心步驟如下:
- 歷史資料集:包含使用者上下文、推薦專案(廣告)和使用者反饋(點選、轉換等)。
- 虛擬資料集:初始為空,在模擬過程中逐漸填充符合條件的資料。
- 分批處理:將歷史資料分成批次(如每小時),逐步迭代處理。
- 模型預測與訓練:在每個批次中,根據使用者上下文預測推薦專案。若預測結果與歷史資料中的實際推薦專案一致,則將該資料加入虛擬資料集。模型在虛擬資料集上進行訓練。
- 重複迭代:持續步驟 4,直到處理完所有歷史資料。
最佳化方案
為提升學習效率,可在每次預測時推薦多個專案(如 3 或 5 個),只要其中一個與歷史資料中的推薦專案比對,即將該資料加入虛擬資料集。
無偏估計器的視覺化範例
透過圖 12.1 至 12.5 的逐步展示,我們可以看到無偏估計器如何在模擬環境中運作。這些圖表說明瞭不同模擬情境下的使用者行為、轉換率和預測利潤。
A/B 測試的重要性
A/B 測試是一種被廣泛應用的因果推斷方法,幫助我們透過資料驅動的決策來最佳化系統效能。其主要優勢包括:
- 風險控制:避免新系統一次性全面上線帶來的潛在風險,先在小範圍內測試。
- 精確評估:透過對比不同版本的系統(如舊版與新版)在相同條件下的表現,準確評估改進效果。
A/B 測試的實際應用
在 ML 系統中,A/B 測試可用於比較不同模型或演算法的實際效果,例如評估新版搜尋引擎的相關性提升,或是廣告推薦系統的點選率(CTR)和轉換率(CVR)變化。
人工評估的作用
在某些情況下,特別是涉及生成式大語言模型時,人工評估成為衡量結果的重要手段。透過人工評審員對模型輸出的品質進行評分或比較,可以獲得更為精確和可靠的評估結果。
人工評估的挑戰與優勢
雖然人工評估成本較高、效率較低,但其提供的主觀品質評估往往是自動化評估方法無法取代的。在需要高精確度的場景下,人工評估是值得投入的。
程式碼範例:無偏估計器的簡化實作
import pandas as pd
from sklearn.model_selection import train_test_split
# 載入歷史資料
historical_data = pd.read_csv('historical_data.csv')
# 初始化虛擬資料集
virtual_data = pd.DataFrame(columns=historical_data.columns)
# 簡化的無偏估計器實作
def unbiased_estimator(historical_data, model):
for index, row in historical_data.iterrows():
# 預測推薦專案
predicted_item = model.predict(row['user_context'])
# 若預測結果與歷史資料一致,則加入虛擬資料集
if predicted_item == row['recommended_item']:
virtual_data = pd.concat([virtual_data, row.to_frame().T], ignore_index=True)
return virtual_data
# #### 內容解密:
# - `historical_data`:包含使用者上下文、推薦專案和使用者反饋的歷史資料集。
# - `virtual_data`:初始為空的虛擬資料集,用於在模擬過程中儲存符合條件的資料。
# - `unbiased_estimator` 函式透過迭代歷史資料,根據模型的預測結果更新虛擬資料集,從而實作離線驗證。
#### 圖表示例:無偏估計器的運作流程
```plantuml
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 特徵工程設計與實踐架構
package "特徵選擇標準" {
component [預測品質] as quality
component [可解釋性] as interpret
component [計算效率] as efficiency
component [穩定性評估] as stability
}
package "特徵來源" {
component [內部資料轉換] as internal
component [外部資料整合] as external
component [特徵儲存函式庫] as store
}
package "模型評估方法" {
component [A/B 測試] as ab
component [無偏估計器] as unbiased
component [多臂老虎機] as bandit
}
package "特徵測試" {
component [範圍異常檢測] as range
component [相關性檢查] as corr
component [重要性驗證] as importance
}
collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型
note right of feature
特徵工程包含:
- 特徵選擇
- 特徵轉換
- 降維處理
end note
note right of eval
評估指標:
- 準確率/召回率
- F1 Score
- AUC-ROC
end note
@enduml
此圖示說明瞭無偏估計器的工作流程,從歷史資料的分批處理到模型的迭代訓練。
內容解密:
- 圖中展示了無偏估計器的核心流程,包括歷史資料的分批處理、模型的預測與訓練,以及虛擬資料集的更新機制。
- 該流程確保了模型在模擬環境中的表現能夠被準確評估,為後續的系統最佳化提供依據。