隨著機器學習應用日益普及,設計高效能的訓練流程和優質的特徵工程成為模型成功的關鍵。本文以 Supermegaretail 的需求預測模型和 PhotoStock Inc. 的智慧搜尋引擎為例,說明如何開發高效能的機器學習管線。首先,針對不同案例選擇合適的工具和平台,例如 Python、Spark、PyTorch、MLflow 和雲端平台等。接著,建立資料預處理流程,包含資料清理、特徵工程、資料正規化和資料集分割。模型訓練階段則涵蓋基線模型、機器學習模型和深度學習模型,並搭配超引數調優機制。模型評估階段使用分位數指標、MAE、MSE、RMSE 等指標,並加入業務相關的自定義指標。此外,利用 MLflow 追蹤實驗,並整合 CI/CD 系統實作自動化訓練和佈署。最後,建立監控機制以確保模型在生產環境的穩定性。特徵工程方面,本文強調其迭代性質,並說明如何分析特徵重要性、選擇合適的特徵、以及特徵儲存的利弊。同時,也探討了特徵生成的基礎,包含特徵轉換、特徵組合、以及如何利用模型預測作為新的特徵,並提供程式碼示例示範如何使用 SHAP 進行特徵重要性分析。

訓練流程設計檔案:開發高效能的機器學習管線

在建立需求預測模型或智慧搜尋引擎時,訓練流程扮演著至關重要的角色。本章節將探討兩個實際案例:Supermegaretail 的需求預測模型與 PhotoStock Inc. 的智慧搜尋引擎,闡述如何設計高效能的訓練流程。

Supermegaretail 需求預測模型的訓練流程

Supermegaretail 的需求預測模型旨在預測特定商店中特定商品在特定時間的需求量。為了實作這一目標,需要建立一個可擴充套件、易於維護且支援多種模型架構、特徵工程技術和超引數調優的訓練流程。

工具選擇

  • Python:主要程式語言,利用其豐富的資料處理和機器學習生態系統。
  • Spark:平行分散式運算框架。
  • PyTorch:深度學習模型框架。
  • MLflow:實驗追蹤和機器學習生命週期管理工具。
  • Docker:容器化技術,確保可重現性和可移植性。
  • AWS Sagemaker 或 Google Cloud AI Platform:雲端訓練和佈署平台。

資料前處理

資料前處理階段包括:

  1. 資料清理:處理缺失值、移除重複資料和修正錯誤資料點。
  2. 特徵工程:從現有特徵中建立新特徵,如銷售資料聚合、時間特徵萃取(星期幾、月份等)和外部資料整合(節假日、天氣、促銷等)。
  3. 資料正規化:將數值特徵縮放到標準範圍。
  4. 訓練-測試集分割:將資料集分割為訓練集和驗證集,確保兩者之間無時間重疊以防止資料洩漏。

模型訓練

模型訓練階段支援多種模型架構和組態,包括:

  1. 基線模型:簡單的預測方法,如移動平均、指數平滑和自迴歸整合移動平均。
  2. 機器學習模型:決策樹、隨機森林、梯度提升機和支援向量機。
  3. 深度學習模型:遞迴神經網路、長短期記憶網路和轉換器。

同時,實施超引數調優機制,如網格搜尋或貝葉斯最佳化,以找出最佳模型組態。

模型評估

使用先前推導的評估指標,如分位數指標(1.5、25、50、75、95 和 99 分位數),並結合 SKU 價格權重。計算點估計值並提供 95% 信賴區間(使用 bootstrap 或交叉驗證),同時納入標準指標如平均絕對誤差(MAE)、均方誤差(MSE)和均方根誤差(RMSE)。此外,還應包含針對 Supermegaretail 業務需求的自定義指標,如過量庫存和缺貨的成本。

實驗追蹤和模型管理

使用 MLflow 追蹤和管理實驗,包括模型引數和超引數、輸入資料和特徵工程技術、評估指標和效能、模型構件(如訓練好的模型權重和序列化模型)。

連續整合和佈署

將訓練流程整合到 Supermegaretail 現有的 CI/CD 基礎設施中,設定自動化訓練和評估流程,確保使用最新資料更新模型,並以最少的手動干預將更新後的模型佈署到生產環境。

監控和維護

監控模型在生產環境中的效能,設定警示以檢測顯著的效能偏差,以便及時發現問題並觸發重新訓練或模型更新。

PhotoStock Inc. 智慧搜尋引擎的訓練流程

PhotoStock Inc. 需要建立一個智慧搜尋引擎,其核心元件是多模態排名模型。該模型的訓練流程需要對預訓練的 CLIP 模型進行微調,以適應公司特定的資料集。

工具選擇

  • PyTorch:預設的深度學習框架,因其全球流行度和豐富的社群支援。
  • PyTorch Lightning:簡化訓練迴圈並提高可重現性的高階框架。
  • Flyte:工作流程管理工具,因為公司已在資料工程工作中使用,可以重複利用現有程式碼。
  • AWS Sagemaker:訓練平台,因為公司已在使用 AWS,且易於與 Flyte 整合。
  • Tensorboard:簡單的訓練指標視覺化工具。
  • Docker:容器化技術,提高管線的可移植性和可重現性。

訓練流程輸出

  1. 文字編碼器和影像編碼器兩個模型,均轉換為靜態圖表示(ONNX)並儲存到 S3。
  2. 用於推斷的訓練引數列表(如提示生成、影像預處理、距離函式)。
  3. 每個執行週期生成一份包含訓練指標的報告,所有構件儲存到 S3。

實驗方向

  1. 微調哪些元件:部分元件、全模型或兩者結合並搭配自定義排程器。
  2. 影像和文字的增強技術。
  3. 不同權重的損失函式。
  4. CLIP 模型的骨幹網路選擇,如根據卷積或根據轉換器的影像編碼器。
  5. 文字提示生成方法,需要組合影像描述、標籤等資訊。
  6. 影像輸入預處理方法,如調整大小、裁剪、填充引數等。

特徵工程:開發卓越機器學習模型的關鍵

特徵工程是機器學習(ML)領域中不可或缺的一環。優秀的特徵能夠顯著提升模型的表現,即使是中等水平的模型,只要具備良好的特徵,也能夠超越那些特徵不佳的優秀模型。特徵是系統的關鍵輸入,它們驅動演算法,為模型提供必要的模式,並為其學習和預測提供所需的資料。缺乏良好的特徵,模型將無法有效運作。

特徵工程的迭代過程

特徵工程是一個迭代的過程,涉及建立和測試新的特徵,或轉換現有的特徵,以提升模型的表現。這個過程需要領域專業知識、創造力和資料工程技能,以建立新的資料管道。由於其耗時和迭代性質,特徵工程往往佔據了建模過程中相當大的一部分資源。

特徵工程的重要性

為了確保建模過程的順利進行,必須制定有效的特徵工程策略。這一策略將成為團隊的,幫助識別和工程化最具影響力的特徵,同時最小化浪費資源的風險。透過優先考慮迭代的順序並規劃路線,可以避免潛在的陷阱,確保行動為最終目標增添價值。

分析特徵重要性

分析特徵重要性是特徵工程中的一個關鍵步驟。透過評估不同特徵對模型表現的影響,可以識別出最有價值的特徵,並最佳化模型的效能。

特徵選擇

選擇合適的特徵對於模型的成功至關重要。需要考慮多個因素和權衡,以確定最佳的特徵子集。同時,確保所選特徵的可靠性和穩健性也是至關重要的。

特徵儲存的利弊

特徵儲存是一種管理和分享特徵的機制。它可以帶來多個好處,如提高特徵的重用性和降低開發成本。然而,特徵儲存也存在一些挑戰,如資料的一致性和更新問題。

特徵儲存的最佳實踐

為了充分利用特徵儲存,需要遵循一些最佳實踐。例如,確保特徵儲存的一致性和更新機制,以及提供清晰的檔案和介面。

特徵工程:開發優質特徵的藝術

優質與不良特徵的評判標準

在進行特徵工程時,我們需要考慮多個因素來評估特徵的品質。以下幾個關鍵準則將有助於我們設計出更有效的特徵:

模型的效能

特徵應該與商業問題相符,並捕捉資料中與目標變數相關的重要導向。與領域專家合作能夠幫助我們開發出合適的特徵組合,並產生新的特徵。在進行特徵重要性分析時,我們可以準確評估每個特徵的貢獻度,並深入瞭解哪些特徵能夠使我們更接近專案目標。

歷史資料的數量

有限的歷史資料可能導致缺失值的出現,降低資料集的整體品質。雖然透過一次性資料工程努力來重建缺失資料看似是一個好方法,但並不總是可行。另一方面,缺乏足夠的歷史資料可能會阻礙預測模型捕捉特徵值的趨勢和季節性變化。

特徵數量與品質之間的權衡

雖然增加特徵數量可以提高機器學習模型的預測能力,但過多的無關或冗餘特徵將導致過擬合,最終降低模型的效能。我們通常偏好模型專注於一小組強大且多樣化的特徵,而不是分散在許多生成且相關的特徵上。

可解釋性和可說明性

在設計特徵時,可解釋性和可說明性是至關重要的因素。雖然複雜的特徵可能提高模型的效能,但也可能降低可解釋性,使我們難以說明預測背後的理由。另一方面,簡單的特徵可能更容易被理解,但它們只能捕捉資料中部分細微差別。在可解釋性和效能之間取得平衡是必要的,並且可能會根據特定的系統和領域而有所不同。

特徵開發的複雜度

複雜的特徵可能需要更多時間來開發。它們可能依賴於其他特徵和複雜的資料管道,或者依賴於新的資料來源,這使得它們更具挑戰性地實施和維護。它們需要更多的資料工程工作來建立和維護資料管道。因此,仔細考慮每個特徵的成本和效益,並決定是否值得投資額外的複雜度是非常重要的。

特徵成本和服務水平協定(SLA)

除了考慮單個特徵的計算複雜度外,我們還必須考慮計算所有特徵所需的總時間,以及支援不斷增長的負載所需的記憶體。這包括計算每個特徵所需時間以及它們之間的依賴關係。特徵之間的互動作用決定了特徵計算的順序以及它們平行化的可能性。例如,對於實時應用程式,需要大量時間來計算的特徵可能由於SLA的要求而不具備可行性。此外,考慮訓練和推斷管道的資料可用性非常重要。如果在服務過程中無法獲得所有必要的資料,模型最終將產生不準確或不完整的預測。

不良設計特徵的風險

脆弱的特徵會導致整個系統的脆弱性。它們可能對資料或模型的變化敏感,導致不穩定或不可預測的行為。依賴外部資料來源或API的特徵可能會受到變化或中斷的影響,從而影響模型的可靠性。為了防止這種情況,我們應該在將特徵整合到模型之前仔細測試和驗證它們,並隨著時間的推移監控其效能,以確保它們繼續提供商業價值。

特徵生成的基礎

有了上述標準和限制作為我們的,我們就可以開始探索生成新特徵的常見方法。

最直接的方法是將新的資料來源新增到我們的資料管道中,或者使用之前未納入資料集的欄位。這些新的特徵是低垂的果實,能夠對模型的效能做出有價值的貢獻。然而,它們需要大部分的資料工程工作,花費大量時間來管理,並可能導致基礎設施問題,因為更大的複雜度總是需要更多的維護工作。

如果不使用新的資料來源,還有兩種替代方案:轉換現有的特徵,或根據兩個或多個現有特徵生成新的特徵。

對數值特徵進行轉換包括縮放、標準化和數學函式(例如,使用對數來改善分佈偏度)。所使用的轉換型別取決於具體的問題和資料。例如,對數變換可用於處理偏態分佈,而標準化則可用於確保所有特徵具有相似的尺度。

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 建立一個示例DataFrame
data = {'feature1': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 初始化StandardScaler
scaler = StandardScaler()

# 對feature1進行標準化
df['feature1_scaled'] = scaler.fit_transform(df[['feature1']])

print(df)

內容解密:

上述程式碼演示瞭如何使用StandardScaler對數值特徵進行標準化。首先,我們建立了一個包含單個特徵feature1的示例DataFrame。然後,我們初始化了一個StandardScaler物件,並使用它對feature1進行標準化,最終將標準化後的結果儲存在新的欄位feature1_scaled中。這種轉換確保了特徵具有零均值和單位方差,有助於提高模型的穩定性和效能。

特徵工程:從資料轉換到模型效能提升

特徵工程是機器學習(ML)流程中的關鍵步驟,涉及將原始資料轉換為更適合模型使用的特徵。適當的特徵工程可以顯著提升模型的表現和準確度。本章節將探討不同的特徵轉換方法、特徵組合技巧,以及如何利用模型預測作為新的特徵。

特徵轉換:根據模型需求進行調整

特徵轉換的方法取決於所使用的模型。例如,對於梯度提升(Gradient Boosting)模型,單調轉換(如對數轉換)通常不會改善模型的表現,因為決策樹對單調轉換具有不變性。

時間序列資料的轉換

處理時間序列資料時,常見的轉換方法包括:

  • 滯後(Lags):將特徵的值向後移動以建立新的特徵。
  • 聚合(Aggregates):計算特定時間視窗內的平均值、最大值或最小值等統計量。
  • 統計特徵:從過去的資料中生成標準差或變異數等統計特徵。

分位數分桶(Quantile Bucketing)

分位數分桶是一種將連續特徵轉換為分類別特徵的方法,透過將特徵值分組到不同的桶中。例如,Uber在其DeepETA網路中應用了這種方法,將連續和分類別特徵轉換為離散的token,並進一步轉換為可學習的嵌入向量。

分類別特徵的轉換

分類別特徵通常需要透過以下方法進行轉換:

  • 獨熱編碼(One-Hot Encoding):將分類別變數轉換為二元向量。
  • 平均目標編碼(Mean Target Encoding):根據目標變數的平均值對分類別變數進行編碼。
  • 順序編碼(Ordinal Encoding):根據類別的內在順序進行編碼。
  • 雜湊技巧(Hashing Trick):適用於處理大規模分類別資料。

文字資料的轉換

對於文字等序列資料,可以使用以下技術進行轉換:

  • 詞袋模型(Bag-of-Words):將文字表示為單詞的集合。
  • 詞頻-逆檔案頻率(TF-IDF):根據單詞在檔案中的重要性進行加權。
  • BM25:一種用於評估單詞在檔案中的重要性的排名函式。
  • 預訓練語言模型(如BERT):將輸入資料表示為低維嵌入向量。

利用產品嵌入向量建立新特徵

線上上零售和媒體串流服務等行業,可以將使用者會話解釋為一系列存取的產品頁面或觀看的影片,並為每個存取的頁面建立可學習的表示(嵌入向量)。這些嵌入向量可以用於推薦系統中的「下一個頁面預測任務」。

結合多個特徵建立新特徵

結合多個特徵可以建立出更具資訊量或更有意義的新特徵。例如,將點選次數和購買次數結合起來,建立出「購買-點選比率」這一新特徵,可能更好地指示使用者的購買意圖。

特徵互動(Feature Interactions)

結合多個特徵的技術通常被稱為特徵互動或特徵交叉。這種技術對於線性模型尤為重要,因為它可以提高資料點的線性可分性。

模型預測作為新特徵

如果一個特徵依賴於另一個特徵,則對後者的任何更改或更新都可能需要對前者進行相應的更改或更新。這增加了系統的複雜性和維護/除錯的挑戰。

內容解密:

本章節介紹了多種提升機器學習模型效能的方法,包括適當的特徵工程技術和如何利用現有特徵創造新的、更有價值的特徵。同時,也提到了使用模型預測結果作為新特徵時需要注意的問題。正確地應用這些技術,可以顯著提高模型的表現和準確度。

11.2 特徵重要性分析

在機器學習(ML)模型的開發過程中,特徵工程扮演著至關重要的角色。當我們將模型的預測結果作為特徵輸入到另一個模型或系統時,這種方法被稱為模型堆積疊(model stacking)。雖然使用模型預測作為特徵可以非常強大且有效,但它也帶來了一些工程挑戰和風險。

使用模型預測作為特徵的風險

最簡單的使用模型預測作為特徵的例子是目標編碼(target encoding)。在這種方法中,分類別特徵被編碼為平均目標值(帶有一定的正則化程度),並用作模型中的特徵。然而,這種方法存在資料洩漏(data leakage)的風險,即編碼是根據訓練資料中的資訊,而這些資訊在推斷過程中是不可用的。這可能導致過擬合和在新資料上的表現不佳,如果不使用像巢狀交叉驗證(nested cross-validation)這樣的先進驗證技術的話。

另一個例子是使用第三方模型(如天氣預報)作為需求預測模型中的特徵。雖然天氣資料可以提供非常有價值的資訊,但存在預報可能需要具備必要的歷史性的風險。在這種情況下,具有必要歷史性的預報比具有更高精確度的預報更為可取。

此外,依賴外部資料來源可能會引入超出ML團隊控制範圍的額外依賴和風險。

使用第三方或開源模型作為特徵提取器的風險

在深度學習系統中使用第三方或開源模型作為特徵提取器也可能帶來風險。雖然生成的嵌入(embeddings)可以吸收資料中有用的模式,但如果外部模型在沒有適當版本控制的情況下被更新,或者反之亦然——如果沒有更新,模型可能會因為你的資料漂移而失去價值,那麼就存在模型漂移或不穩定性的危險。這可能導致意外的行為並大大降低你的ML系統的效能。

緩解風險和挑戰

為了緩解這些風險和挑戰,仔細設計特徵工程管道並擁有強大的測試和監控程式是非常重要的。這可以包括使用交叉驗證和其他技術來防止洩漏,驗證外部資料來源和模型,以及建立監控和更新特徵的流程。

11.2.1 特徵重要性分析方法分類別

讓我們來探索特徵重要性分析的方法,以及如何應用它們來提高ML系統的透明度和效能。

古典機器學習 vs. 深度學習

應用於特徵重要性分析的方法在古典機器學習和深度學習模型之間可能有很大的不同。對於古典機器學習模型,特徵重要性的確定通常是直接的——我們可以直接檢查模型的權重和決策規則,或者排除/修改單獨的特徵來研究其對模型預測的貢獻。

另一方面,深度學習模型自動從資料中學習特徵表示,這為重要性分析帶來了獨特的挑戰。由於複雜的非線性轉換和高度的抽象化,簡單地檢視模型的引數已經不足以理解特徵的重要性。相反,我們依賴於像顯著圖(saliency maps)、啟用最大化(activation maximization)或層級相關性傳播(layer-wise relevance propagation)等先進技術來理解神經網路內部正在發生的事情。

模型特定 vs. 模型無關

模型特定的方法使用模型的結構和引數來估計特徵的重要性。例如,在根據樹的模型中,我們可以計算在訓練過程中特定特徵被分裂的次數,或者它在所有分裂中提供的總增益。同樣地,我們可以檢視線性模型中分配給每個特徵的係數的大小和符號。

程式碼範例:使用SHAP進行特徵重要性分析

import shap
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

# 載入資料集
data = load_breast_cancer()
X = data.data
y = data.target

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 訓練一個隨機森林分類別器
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# 使用SHAP進行特徵重要性分析
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

# 繪製特徵重要性圖
shap.summary_plot(shap_values, X_test, plot_type="bar")

內容解密:

  1. 載入必要的函式庫:首先,我們載入了進行特徵重要性分析所需的函式庫,包括shapsklearn.model_selectionsklearn.ensemblesklearn.datasets
  2. 準備資料集:我們使用load_breast_cancer函式載入了一個標準的乳腺癌資料集,並將其分割為訓練集和測試集。
  3. 訓練模型:我們訓練了一個隨機森林分類別器,並將其擬合到訓練資料上。
  4. SHAP直譯器:我們建立了一個TreeExplainer物件,用於對我們的模型進行解釋。
  5. 計算SHAP值:我們計算了測試集上的SHAP值,這些值代表了每個特徵對模型預測的貢獻。
  6. 繪製特徵重要性圖:最後,我們使用summary_plot函式繪製了特徵重要性的條形圖,以視覺化的方式呈現了每個特徵的重要性。