自動化機器學習中的資料特徵化

適用於:Python SDK azureml 第 1 版

了解 Azure Machine Learning 中的資料特徵化設定,以及如何為自動化機器學習實驗自訂這些特徵。

特徵工程和特徵化

定型資料由資料列和資料行組成。 每個資料列都是觀察或記錄,而每個資料列的資料行都是描述每筆記錄的特徵。 通常,系統會選取最能特徵化資料中模式的特徵,以建立預測模型。

雖然許多原始資料欄位都可以直接用來定型模型,但通常需要建立額外 (工程設計) 特徵,其會提供更能區分資料中模式的資訊。 此流程稱為特徵工程,其中運用資料的網域知識來建立特徵,進而協助機器學習演算法更好地學習。

在 Azure Machine Learning 中,會套用資料調整和正規化技術,讓特徵工程更容易。 在自動化 ML 實驗中,這些技術和此特徵工程統稱為特徵化

必要條件

本文假設您已經知道如何設定自動化 ML 實驗。

重要

本文中的 Python 命令需要最新的 azureml-train-automl 套件版本。

如需設定的相關資訊,請參閱下列文章:

設定特徵化

在每個自動化機器學習實驗中,預設會將自動調整和正規化技術套用至您的資料。 這些技術是特徵化的類型,可協助「特定」演算法,而這些演算法對不同規模的特徵很敏感。 您可以啟用其他特徵化,例如「遺漏值插補」、「編碼」和「轉換」。

注意

自動化機器學習特徵化的步驟 (例如特徵正規化、處理遺漏的資料、將文字轉換為數值) 會成為基礎模型的一部分。 當您使用模型進行預測時,定型期間所套用的相同特徵化步驟會自動套用至您的輸入資料。

針對您使用 Python SDK 設定的實驗,您可以啟用或停用特徵化設定,並進一步指定要用於實驗的特徵化步驟。 如果您是使用 Azure Machine Learning 工作室,請參閱啟用特徵化的步驟

下表顯示 AutoMLConfig 類別featurization 接受的設定:

特徵化設定 Description
"featurization": 'auto' 指定在前置處理過程中,將自動執行資料護欄特徵化步驟。 這是預設設定。
"featurization": 'off' 指定不會自動執行特徵化步驟。
"featurization": 'FeaturizationConfig' 指定將使用自訂的特徵化步驟。 了解如何自訂特徵化

自動特製化

下表彙總自動套用至您資料的技術。 這些技術適用於使用 SDK 或工作室 UI 設定的實驗。 若要停用此行為,請在您的 AutoMLConfig 物件中設定 "featurization": 'off'

注意

如果計劃將 AutoML 建立的模型匯出到 ONNX 模型,則 ONNX 格式僅支援以星號 ("*") 指出的特徵化選項。 深入了解將模型轉換為 ONNX

特徵化步驟 Description
卸除高基數或無變異數特徵* 從定型和驗證集中卸除這些特徵。 適用於遺漏所有值的特徵、在所有資料列中都具有相同值的特徵,或具有高基數 (例如,雜湊、識別碼或 GUID) 的特徵。
插補遺漏值* 針對數值特徵,使用資料行中的平均值進行插補。

針對類別特徵,使用最頻繁的值進行插補。
產生更多特徵* 針對 DateTime 特徵:年、月、日、星期幾、幾月幾日、季、第幾週、小時、分鐘、秒。

針對預測工作,,系統會建立這些額外的日期時間特徵: ISO 年、半年半年、以字串表示的行事曆月份、週、以字串表示的星期幾、一季第幾天、一年第幾天、AM/PM (如果時間是在中午 (12 PM) 之前,則為 0,否則為 1)、以字串表示的 AM/PM、一天第幾小時 (12 小時制)

針對文字特徵:根據一元語法、二元語法和三元語法的字詞頻率。 深入了解如何使用 BERT 完成這項工作
轉換和編碼* 將有幾個唯一值的數值特徵轉換成類別特徵。

One-hot 編碼用於低基數類別特徵。 One-hot 雜湊編碼用於高基數類別特徵。
字組內嵌 文字特徵化工具會使用預先定型的模型,將文字語彙基元的向量轉換成句子向量。 文件中每個字組的內嵌向量都會與其餘部分彙總在一起,以產生文件特徵向量。
叢集距離 在所有數值資料行上定型 K-Means 叢集模型。 產生 k 個新特徵 (每個叢集一個新的數值特徵),其中包含每個樣本與每個叢集距心的距離。

在每個自動化機器學習實驗中,您的資料都會自動調整或正規化,以協助演算法執行良好。 在模型定型期間,下列其中一個調整或正規化技術會套用至每個模型。

調整與處理 描述
StandardScaleWrapper 藉由移除平均值並調整為單位變異數,將功能標準化
MinMaxScalar 藉由依該資料行的最小值與最大值,調整每個功能來轉換功能
MaxAbsScaler 依最大絕對值來調整每個功能
RobustScalar 依功能分位數範圍調整功能
PCA 使用資料的奇異值分解將線性維度縮減,以將其投影至較低的維度空間
TruncatedSVDWrapper 此轉換器會藉由截斷奇異值分解 (SVD) 來執行線性維度縮減。 相對於 PCA,此估算器不會在計算奇異值分解之前,先將資料置中,這表示其可以有效率地使用 scipy.sparse 矩陣
SparseNormalizer 具有至少一個非零分量的每個樣本 (即資料矩陣的每個資料列) 會獨立於其他樣本之外進行重新調整,使其範數 (l1 或 l2) 等於 1

資料護欄

「資料護欄」可協助您識別資料的潛在問題 (例如,遺漏值或類別不平衡)。 其也可協助您採取矯正措施來改善結果。

資料護欄適用時機:

  • 若為 SDK 實驗:在您的 AutoMLConfig 物件中指定參數 "featurization": 'auto'validation=auto 時。
  • 若為工作室實驗:啟用自動特徵化時。

您可以檢閱實驗的資料護欄:

  • 藉由在使用 SDK 提交實驗時設定 show_output=True

  • 在工作室中,於自動化 ML 執行的 [資料護欄] 索引標籤上。

資料護欄狀態

資料護欄會顯示三種狀態的其中一種:

描述
通過 未偵測到任何資料問題,因此您不需要採取任何動作。
完成 已成功將變更套用到資料。 我們鼓勵您檢閱自動化 ML 所採取的矯正措施,以確保變更與預期的結果一致。
警示 偵測到資料問題,但無法補救。 我們鼓勵您修訂並修正問題。

支援的資料護欄

下表描述目前支援的資料護欄,以及您在提交實驗時可能會看到的相關聯狀態:

護欄 狀態 觸發程序的條件
遺漏特徵值插補 已通過


完成
在訓練資料中沒有偵測到任何遺漏特徵值。 深入了解遺漏值插補。

在定型資料中偵測到遺漏的特徵值,並已進行插補。
高基數特徵處理 已通過


完成
已分析您的輸入,且沒有偵測到任何高基數特徵。

在輸入中偵測到高基數特徵,並已進行處理。
驗證分割處理 完成 驗證設定已設為 'auto',且定型資料包含 20,000 個以下的資料列。
已使用交叉驗證來驗證定型模型的每個反覆項目。 深入了解驗證資料

驗證設定已設為 'auto',且定型資料包含 20,000 個以上的資料列。
輸入資料已分割成訓練資料集和驗證資料集,以用於模型驗證。
類別平衡偵測 已通過



警示


完成
已分析輸入,且訓練資料中所有類別都是平衡的。 如果每個類別在資料集中的代表程度良好 (以樣本數和比例測量),即會將資料集視為平衡。

在輸入中偵測到不平衡的類別。 若要修正模型偏差,請修正平衡問題。 深入了解不平衡的資料

在您的輸入中偵測到不平衡的類別,而且掃掠邏輯已確定要套用平衡。
記憶體問題偵測 已通過



完成

已分析選取的值 (範圍、延隔時間、移動視窗),且沒有偵測到任何潛在的記憶體不足問題。 深入了解時間序列預測設定


已分析選取的值 (範圍、延隔時間、移動視窗),且可能會導致實驗記憶體不足。 延隔時間或移動視窗設定已關閉。
頻率偵測 已通過



完成

已分析時間序列,且所有資料點都與偵測到的頻率相符。

已分析時間序列,並偵測到有些資料點與偵測到的頻率不相符。 這些資料點已從資料集移除。

自訂特徵化

您可以自訂特徵化設定,以確保用來定型 ML 模型的資料和特徵會產生相關的預測。

若要自訂特徵化,請在您的 AutoMLConfig 物件中指定 "featurization": FeaturizationConfig。 如果要將 Azure Machine Learning 工作室用於您的實驗,請參閱操作說明文章。 若要自訂預測工作類型的特徵化,請參閱預測操作說明

支援的自訂項目包含:

自訂 定義
資料行用途更新 覆寫所指定資料行的自動偵測特徵類型。
轉換器參數更新 更新所指定轉換器的參數。 目前支援 Imputer (平均值、最頻繁的值與中位數) 和 HashOneHotEncoder
卸除資料行 指定不進行特徵化的資料行。
區塊轉換器 指定要在特徵化流程中使用的區塊轉換器。

注意

從 SDK 1.19 版起,卸除資料行功能已被取代。 在您的自動化 ML 實驗中取用資料行之前,請先在資料清除過程中將這些資料行卸除。

使用 API 呼叫來建立 FeaturizationConfig 物件:

featurization_config = FeaturizationConfig()
featurization_config.blocked_transformers = ['LabelEncoder']
featurization_config.drop_columns = ['aspiration', 'stroke']
featurization_config.add_column_purpose('engine-size', 'Numeric')
featurization_config.add_column_purpose('body-style', 'CategoricalHash')
#default strategy mean, add transformer param for for 3 columns
featurization_config.add_transformer_params('Imputer', ['engine-size'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['city-mpg'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['bore'], {"strategy": "most_frequent"})
featurization_config.add_transformer_params('HashOneHotEncoder', [], {"number_of_bits": 3})

特徵化透明度

每個 AutoML 模型都會自動套用特徵化。 特徵化包括自動化特徵工程 (當 "featurization": 'auto' 時) 以及調整和正規化,隨後會影響所選取的演算法及其超參數值。 AutoML 支援不同的方法,以確保您可以看見已套用至模型的內容。

請考慮此預測範例:

  • 輸入特徵共有四種:A (數值)、B (數值)、C (數值)、D (日期時間)。
  • 數值特徵 C 是具有所有唯一值的識別碼資料行,因此遭到卸除。
  • 數值特徵 A 和 B 具有遺漏值,因此會以平均值插補。
  • 日期時間特徵 D 特徵化為 11 個不同的工程特徵。

若要取得此資訊,請使用自動化 ML 實驗執行的 fitted_model 輸出。

automl_config = AutoMLConfig(…)
automl_run = experiment.submit(automl_config …)
best_run, fitted_model = automl_run.get_output()

自動化特徵工程

get_engineered_feature_names() 會傳回工程特徵名稱的清單。

注意

對於「預測」工作,請使用 'timeseriestransformer',對於「迴歸」或「分類」工作則使用 'datatransformer'。

fitted_model.named_steps['timeseriestransformer']. get_engineered_feature_names ()

此清單包含所有工程特徵名稱。

['A', 'B', 'A_WASNULL', 'B_WASNULL', 'year', 'half', 'quarter', 'month', 'day', 'hour', 'am_pm', 'hour12', 'wday', 'qday', 'week']

get_featurization_summary() 會取得所有輸入特徵的特徵化摘要。

fitted_model.named_steps['timeseriestransformer'].get_featurization_summary()

輸出

[{'RawFeatureName': 'A',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'B',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'C',
  'TypeDetected': 'Numeric',
  'Dropped': 'Yes',
  'EngineeredFeatureCount': 0,
  'Tranformations': []},
 {'RawFeatureName': 'D',
  'TypeDetected': 'DateTime',
  'Dropped': 'No',
  'EngineeredFeatureCount': 11,
  'Tranformations': ['DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime']}]
輸出 定義
RawFeatureName 提供的資料集中的輸入特徵/資料行名稱。
TypeDetected 偵測到輸入特徵的資料類型。
Dropped 指出是已卸除還是使用了輸入特徵。
EngineeringFeatureCount 透過自動化特徵工程轉換而產生的特徵數目。
轉換 套用至輸入特徵以產生工程特徵的轉換清單。

規模調整和正規化

若要了解調整/正規化和選取的演算法及其超參數值,請使用 fitted_model.steps

下列範例輸出來自所選擇執行的執行中 fitted_model.steps

[('RobustScaler', 
  RobustScaler(copy=True, 
  quantile_range=[10, 90], 
  with_centering=True, 
  with_scaling=True)), 

  ('LogisticRegression', 
  LogisticRegression(C=0.18420699693267145, class_weight='balanced', 
  dual=False, 
  fit_intercept=True, 
  intercept_scaling=1, 
  max_iter=100, 
  multi_class='multinomial', 
  n_jobs=1, penalty='l2', 
  random_state=None, 
  solver='newton-cg', 
  tol=0.0001, 
  verbose=0, 
  warm_start=False))

若要取得更多詳細資料,請使用此協助程式函式:

from pprint import pprint

def print_model(model, prefix=""):
    for step in model.steps:
        print(prefix + step[0])
        if hasattr(step[1], 'estimators') and hasattr(step[1], 'weights'):
            pprint({'estimators': list(e[0] for e in step[1].estimators), 'weights': step[1].weights})
            print()
            for estimator in step[1].estimators:
                print_model(estimator[1], estimator[0]+ ' - ')
        elif hasattr(step[1], '_base_learners') and hasattr(step[1], '_meta_learner'):
            print("\nMeta Learner")
            pprint(step[1]._meta_learner)
            print()
            for estimator in step[1]._base_learners:
                print_model(estimator[1], estimator[0]+ ' - ')
        else:
            pprint(step[1].get_params())
            print()   

此協助程式函數會使用 LogisticRegression with RobustScalar 作為特定的演算法,傳回特定執行的下列輸出。

RobustScaler
{'copy': True,
'quantile_range': [10, 90],
'with_centering': True,
'with_scaling': True}

LogisticRegression
{'C': 0.18420699693267145,
'class_weight': 'balanced',
'dual': False,
'fit_intercept': True,
'intercept_scaling': 1,
'max_iter': 100,
'multi_class': 'multinomial',
'n_jobs': 1,
'penalty': 'l2',
'random_state': None,
'solver': 'newton-cg',
'tol': 0.0001,
'verbose': 0,
'warm_start': False}

預測類別機率

使用自動化 ML 產生的模型都有包裝函式物件,會從其開放原始碼原始類別中鏡像處理功能。 自動化 ML 傳回的分類模型包裝函式物件大多會執行 predict_proba() 函式,而接受特徵 (X 值) 的類陣列或疏鬆矩陣資料範例,並傳回每個範例及其個別類別機率的 N 維陣列。

假設您已使用前述的相同呼叫來擷取最佳執行和適合的模型,您可以直接從適當的模型呼叫 predict_proba(),並根據模型類型,以適當的格式提供 X_test 範例。

best_run, fitted_model = automl_run.get_output()
class_prob = fitted_model.predict_proba(X_test)

如果基礎模型不支援 predict_proba() 函式,或格式不正確,則會擲回模型類別特定的例外狀況。 如需如何對不同的模型類型實作此函式的範例,請參閱 RandomForestClassifierXGBoost 參考文件。

自動化 ML 中的 BERT 整合

BERT 用於自動化 ML 的特徵化層。 在這一層中,如果資料行包含任意文字或其他類型的資料 (例如時間戳記或簡單數字),則會據此套用特徵化。

針對 BERT,模型會利用使用者提供的標籤進行微調並定型。 從這裡開始,文件內嵌會以特徵和其他形式作為輸出,例如時間戳記型特徵、星期幾。

了解如何設定也會搭配自動化 ML 使用 BERT 的自然語言處理 (NLP) 實驗

叫用 BERT 的步驟

若要叫用 BERT,請在 automl_settings 中設定 enable_dnn: True,並使用 GPU 計算 (vm_size = "STANDARD_NC6" 或更高的 GPU)。 如果使用的是 CPU 計算,而不是 BERT,AutoML 會啟用 BiLSTM DNN 特徵化工具。

自動化 ML 會針對 BERT 採取下列步驟。

  1. 所有文字資料行的前置處理和 Token 化。 例如,可以在最終模型的特徵化摘要中找到 "StringCast" 轉換器。 可以在此筆記本中找到如何產生模型特徵化摘要的範例。

  2. 將所有文字資料行串連成單一文字資料行,因此成為最終模型中的 StringConcatTransformer

    我們的 BERT 實作會將定型範例的文字總長度限制為 128 個語彙基元。 這表示,所有的文字資料行在串連時,最理想的長度應該是最多 128 個語彙基元。 如果有多個資料行存在,則應該剪除每個資料行,以便滿足這個條件。 否則,針對長度大於 128 個語彙基元的串連資料行,BERT 的語彙基元工具層會將此輸入截斷為 128 個語彙基元。

  3. 在特徵掃掠的過程中,AutoML 會在資料範例上針對基準 (字組特徵包) 比較 BERT。 此比較會判斷 BERT 是否提供正確性的改進。 如果 BERT 執行效能優於基準,AutoML 接著會針對整個資料使用 BERT 進行文字特徵化。 在此情況下,您將在最終模型中看到 PretrainedTextDNNTransformer

BERT 的執行時間通常比其他特徵化工具還長。 為了取得更好的效能,建議使用 "STANDARD_NC24r" 或 "STANDARD_NC24rs_V3" 作為其 RDMA 功能。

AutoML 會在多個節點 (如果可用的話) 之間散發 BERT 定型,最多八個節點。 將 max_concurrent_iterations 參數設為高於 1,即可在您的 AutoMLConfig 物件中完成這項操作。

AutoML 中 BERT 支援的語言

AutoML 目前支援大約 100 種語言,而且 AutoML 會根據資料集的語言選擇適當的 BERT 模型。 針對德文資料,我們會使用德文 BERT 模型。 針對英文,我們會使用英文 BERT 模型。 針對其他所有語言,我們會使用多語系 BERT 模型。

在下列程式碼中,會觸發德文 BERT 模型,因為資料集語言已指定為 deu,這是根據 ISO 分類,代表德文的三字母語言代碼:

from azureml.automl.core.featurization import FeaturizationConfig

featurization_config = FeaturizationConfig(dataset_language='deu')

automl_settings = {
    "experiment_timeout_minutes": 120,
    "primary_metric": 'accuracy',
# All other settings you want to use
    "featurization": featurization_config,
    
    "enable_dnn": True, # This enables BERT DNN featurizer
    "enable_voting_ensemble": False,
    "enable_stack_ensemble": False
}

後續步驟