本頁面由 Cloud Translation API 翻譯而成。
Switch to English

TensorFlow Data Validation: Checking and analyzing your data

一旦數據進入TFX管道,就可以使用TFX組件進行分析和轉換。您甚至可以在訓練模型之前使用這些工具。

分析和轉換數據的原因很多:

  • 在數據中查找問題。常見問題包括:
    • 缺少數據,例如具有空值的要素。
    • 標籤被視為特徵,因此您的模型可以在訓練期間窺視正確的答案。
    • 值超出您期望範圍的功能。
    • 數據異常。
  • 設計更有效的功能集。例如,您可以識別:
    • 特別有用的功能。
    • 冗餘功能。
    • 功能的規模差異很大,可能會影響學習速度。
    • 具有很少或沒有唯一預測信息的功能。

TFX工具既可以幫助發現數據錯誤,又可以幫助進行功能設計。

TensorFlow數據驗證

總覽

TensorFlow數據驗證可識別訓練和提供數據中的異常,並可以通過檢查數據自動創建模式。可以將組件配置為檢測數據中不同類別的異常。它可以

  1. 通過將數據統計信息與編寫用戶期望的架構進行比較,以執行有效性檢查。
  2. 通過比較訓練和提供數據中的示例來檢測訓練提供的偏斜。
  3. 通過查看一系列數據來檢測數據漂移。

我們獨立記錄以下每個功能:

基於架構的示例驗證

TensorFlow數據驗證通過將數據統計信息與模式進行比較來識別輸入數據中的任何異常。該架構將輸入數據期望滿足的屬性(例如數據類型或分類值)進行編碼,並且可以由用戶修改或替換。

高級架構功能

本節介紹可以幫助進行特殊設置的更高級的架構配置。

稀疏特徵

在示例中對稀疏特徵進行編碼通常會引入多個特徵,這些特徵預期對於所有示例都具有相同的價。例如,稀疏特徵:


WeightedCategories = [('CategoryA', 0.3), ('CategoryX', 0.7)]
將使用單獨的索引和值特徵:

WeightedCategoriesIndex = ['CategoryA', 'CategoryX']
WeightedCategoriesValue = [0.3, 0.7]
進行編碼,但限制是所有示例的索引和值特徵的效價均應匹配。通過定義sparse_feature,可以在模式中使此限制明確:

sparse_feature {
  name: 'WeightedCategories'
  index_feature { name: 'WeightedCategoriesIndex' }
  value_feature { name: 'WeightedCategoriesValue' }
}

稀疏特徵定義需要一個或多個索引和一個值特徵,它們引用模式中存在的特徵。明確定義稀疏特徵使TFDV能夠檢查所有引用特徵的化合價是否匹配。

某些用例在功能之間引入了相似的價位限制,但不一定對稀疏功能進行編碼。使用稀疏功能應該可以使您不受阻礙,但並不理想。

模式環境

默認情況下,驗證假定管道中的所有示例均遵循單個模式。在某些情況下,有必要引入輕微的模式變化,例如,在訓練過程中需要使用用作標籤的功能(並應進行驗證),但在投放過程中會丟失這些功能。環境可以用來表達這種要求,特別是default_environment()in_environment()not_in_environment()

例如,假設需要一個名為“ LABEL”的功能進行培訓,但預計該功能將丟失。這可以表示為:

  • 在模式中定義兩個不同的環境:[“ SERVING”,“ TRAINING”]並將“ LABEL”僅與環境“ TRAINING”相關聯。
  • 將訓練數據與環境“ TRAINING”關聯,將服務數據與環境“ SERVING”關聯。
模式生成

輸入數據模式被指定為TensorFlow Schema的實例。

開發人員可以依靠TensorFlow Data Validation的自動模式構建,而不必從頭開始手動構建模式。具體來說,TensorFlow數據驗證基於在管道中可用的訓練數據上計算出的統計信息自動構建初始模式。用戶可以簡單地查看此自動生成的模式,根據需要對其進行修改,將其檢入版本控制系統,然後將其顯式推送到管道中以進行進一步的驗證。

TFDV包含infer_schema()以自動生成模式。例如:

schema = tfdv.infer_schema(statistics=train_stats)
tfdv.display_schema(schema=schema)

這將根據以下規則觸發自動模式生成:

  • 如果已經自動生成模式,則按原樣使用它。

  • 否則,TensorFlow數據驗證將檢查可用的數據統計信息並為該數據計算合適的模式。

注意:自動生成的架構是盡力而為的,僅嘗試推斷數據的基本屬性。預期用戶會根據需要對其進行檢查和修改。

培訓服務傾斜檢測

總覽

訓練服務偏斜檢測器作為TensorFlow數據驗證的子組件運行,並檢測訓練數據和服務數據之間的偏斜。

偏斜類型

根據各種生產後的情況,我們將各種類型的偏斜減少到四個關鍵類別。接下來,我們將討論這些類別中的每一個類別,並提供它們發生的示例場景。

  1. 當訓練數據和服務數據不符合同一模式時,就會發生模式偏斜 。由於架構描述了數據的邏輯屬性,因此訓練數據和服務數據都應遵循相同的架構。兩者之間的任何預期偏差(例如僅在訓練數據中存在但在服務中不存在的標籤功能)應通過架構中的環境字段指定。

    由於訓練數據的生成是批量數據處理的步驟,而(在線)服務數據的生成通常是對延遲敏感的步驟,因此通常會有不同的代碼路徑來生成訓練和服務的數據。這是個錯誤。這兩個代碼路徑之間的任何差異(由於開發人員錯誤或二進製版本不一致)都可能導致架構偏斜。

    示例場景

    鮑勃(Bob)想向模型添加一個新功能,並將其添加到訓練數據中。離線培訓指標看起來不錯,但在線指標則差得多。經過數小時的調試,Bob意識到他忘記在服務代碼路徑中添加相同的功能。該模型對該新功能給予了高度重視,並且由於該功能在投放時間不可用,因此產生了較差的預測,從而導致較差的在線指標。

  2. 當模型訓練的特徵值與服務時看到的特徵值不同時,就會發生特徵偏斜 。發生這種情況有多種原因,其中包括:

    • 如果在訓練和服務時間之間修改了提供某些功能值的外部數據源。

    • 用於在訓練和服務之間生成功能的邏輯不一致。例如,如果僅在兩個代碼路徑之一中應用某些轉換。

    示例場景

    愛麗絲有一個連續的機器學習管道,其中記錄了今天的服務數據並用於生成第二天的訓練數據。為了節省空間,她決定只記錄服務時間的視頻ID,並在訓練數據生成過程中從數據存儲中獲取視頻屬性。

    這樣一來,她無意中引入了一個偏斜,這對於新上傳的和病毒式視頻特別危險,因為它們的觀看時間可能會在服務時間和訓練時間之間發生很大變化(如下所示)。

    
     Serving Example           Training Example
     -------------------------  -------------------------
     features {                 features {
       feature {                  feature {
         key "vid"                  key "vid"
         value { int64_list {       value { int64_list {
           value 92392               value 92392
         } }                         } }
       }                          }
       feature {                  feature {
         key "views"               key "views"
         value { int_list {       value { bytes_list {
           value "10"                value "10000"  # skew
         } }                         } }
       }                          }
     }                          }
    

    這是特徵偏斜的一個實例,因為訓練數據看到的視圖數量膨脹。

  3. 當訓練數據的特徵值分佈與服務數據明顯不同時,就會發生分佈偏斜 。分佈偏斜的主要原因之一是使用完全不同的語料庫來訓練數據生成,以克服所需語料庫中缺少初始數據的情況。另一個原因是採樣機制錯誤,該機制僅選擇了要訓練的服務數據的子樣本。

    示例場景

    例如,為了補償代表性不足的數據切片,如果在沒有適當地對下採樣示例進行適當加權的情況下使用偏向採樣,則訓練和服務數據之間的特徵值分佈會明顯偏斜。

  4. 評分/服務偏斜更難檢測到,僅在實際打分的樣本中有一部分會發生。由於標籤僅適用於所提供的示例,而不適用於評分示例,因此僅將這些示例用於培訓。這隱含地導致模型對打分的示例進行錯誤的預測,因為它們在訓練數據中的代表性逐漸下降。

    示例場景

    考慮一個投放前10個廣告的廣告系統。在這10個廣告中,用戶只能點擊其中一個。這些送達的示例中的所有10個都用於第二天的訓練-1個陽性和9個陰性。但是,在投放時,訓練有素的模型用於為100則廣告打分。其餘90個從未投放過的廣告將從訓練數據中隱式刪除。這會導致隱式的反饋循環,這會進一步錯誤預測排名較低的事物,因為在訓練數據中看不到它們。

你為什麼要在乎呢?

偏斜很難檢測,並且在許多ML管道中都很普遍。有幾起事件導致性能下降和收入損失。

目前支持什麼?

當前,TensorFlow數據驗證支持模式傾斜,功能傾斜和分佈傾斜檢測。

漂移檢測

漂移檢測支持分類特徵以及連續的數據跨度之間(即,跨度N和跨度N + 1之間),例如訓練數據的不同天之間。我們用L-infinity距離表示漂移,您可以設置閾值距離,以便在漂移高於可接受範圍時收到警告。設置正確的距離通常是一個反复的過程,需要領域知識和實驗。

使用可視化檢查數據

TensorFlow數據驗證提供了用於可視化特徵值分佈的工具。通過使用Facets在Jupyter筆記本中檢查這些分佈,您可以發現數據的常見問題。

功能統計

識別可疑的分佈

通過使用“構面概述”顯示來查找特徵值的可疑分佈,可以識別數據中的常見錯誤。

數據不平衡

不平衡特徵是一個值占主導的特徵。不平衡的功能可以自然發生,但如果功能始終具有相同的值,則可能會出現數據錯誤。要檢測“構面概述”中的不平衡特徵,請從“排序依據”下拉列表中選擇“非均勻性”。

最不平衡的功能將列在每個功能類型列表的頂部。例如,以下屏幕截圖在“數字功能”列表的頂部顯示了一個全為零的功能,以及另一個高度不平衡的功能:

可視化不平衡數據

均勻分佈的數據

均勻分佈的特徵是所有可能的值都以接近相同的頻率出現的特徵。與不平衡數據一樣,這種分佈可以自然發生,但也可能由數據錯誤引起。

要在“構面概述”中檢測均勻分佈的特徵,請從“排序依據”下拉列表中選擇“非均勻性”,然後選中“逆序”複選框:

統一數據的直方圖

如果唯一值少於20個,則使用條形圖表示字符串數據;如果唯一值大於20個,則使用累積分佈圖表示。因此,對於字符串數據,均勻分佈可以顯示為扁平條形圖(如上圖)或直線(如下圖):

折線圖:統一數據的累積分佈

可能產生均勻分佈數據的錯誤

以下是一些可以產生均勻分佈的數據的常見錯誤:

  • 使用字符串表示非字符串數據類型,例如日期。例如,對於日期時間功能,您將具有許多唯一的值,其表示形式為“ 2017-03-01-11-45-03”。唯一值將均勻分佈。

  • 包括諸如“行號”之類的索引作為特徵。同樣,您在這裡有許多獨特的價值。

缺失數據

要檢查某個功能是否完全缺失值:

  1. 從“排序依據”下拉列表中選擇“缺少的金額/零”。
  2. 選中“反向訂單”複選框。
  3. 查看“缺失”列,以查看功能缺失值的實例所佔的百分比。

數據錯誤也可能導致要素值不完整。例如,您可能希望某個要素的值列表始終包含三個元素,並且發現有時它只有一個。要檢查不完整的值或要素值列表沒有預期數量的元素的其他情況:

  1. 從右側的“顯示圖表”下拉菜單中選擇“值列表長度”。

  2. 查看每個功能行右側的圖表。圖表顯示了功能值列表長度的範圍。例如,下面的屏幕快照中突出顯示的行顯示了具有一些零長度值列表的功能:

具有零長度要素值列表的要素的構面概覽顯示

要素之間的比例差異很大

如果您的功能在規模上差異很大,則該模型可能難以學習。例如,如果某些功能的範圍從0到1不等,而另一些功能的範圍從0到1,000,000,000不等,那麼您在規模上會有很大的差異。比較各個要素的“最大”和“最小”列,以找到變化範圍很大的比例尺。

考慮將特徵值標準化以減少這些較大的差異。

帶有無效標籤的標籤

TensorFlow的估算器對他們接受為標籤的數據類型有限制。例如,二進制分類器通常僅與{0,1}標籤一起使用。

在“構面概述”中檢查標籤值,並確保它們符合估算器要求