Fairness Indicators

Fairness Indicators 旨在支援團隊與更廣泛的 Tensorflow 工具組合作,評估及改善模型的公平性問題。此工具目前已廣泛用於我們的眾多產品中,現在推出 BETA 版供您在自身的使用情境中試用。

Fairness Indicator Dashboard

何謂 Fairness Indicators?

Fairness Indicators 是一個程式庫,可針對二元和多類別分類器輕鬆計算普遍認定的公平性指標。許多現有的公平性問題評估工具無法妥善處理大規模資料集和模型。在 Google,我們認為擁有可處理數十億使用者系統的工具非常重要。Fairness Indicators 可讓您評估任何規模的使用情境。

具體而言,Fairness Indicators 包含下列功能:

  • 評估資料集的分配
  • 評估模型效能,依使用者定義的群組劃分
    • 透過信賴區間和多個門檻的評估,對結果感到放心
  • 深入探討個別分層,找出根本原因和改善機會

這個個案研究隨附影片和程式設計練習,示範如何在您自己的產品上使用 Fairness Indicators,以便長期評估公平性問題。

pip 套件下載包含

搭配 Tensorflow 模型使用 Fairness Indicators

資料

如要搭配 TFMA 執行 Fairness Indicators,請確保評估資料集已針對您要依據劃分的特徵加上標籤。如果您沒有與公平性問題完全相符的分層特徵,可以考慮尋找符合需求的評估集,或是在特徵集中尋找可能突顯結果差異的替代特徵。如需其他指引,請參閱這裡

模型

您可以使用 Tensorflow Estimator 類別來建構模型。TFMA 即將支援 Keras 模型。如果您想在 Keras 模型上執行 TFMA,請參閱下方的「Model-Agnostic TFMA」章節。

訓練 Estimator 後,您需要匯出已儲存的模型以進行評估。如要進一步瞭解詳情,請參閱TFMA 指南

設定分層

接下來,定義您要評估的分層

slice_spec = [
  tfma.slicer.SingleSliceSpec(columns=[‘fur color’])
]

如果您想評估交叉分層 (例如,毛色和身高),您可以設定如下:

slice_spec = [
  tfma.slicer.SingleSliceSpec(columns=[‘fur_color’, ‘height’])
]`

計算 Fairness Metrics

將 Fairness Indicators 回呼新增至 metrics_callback 清單。在回呼中,您可以定義模型將在其中評估的門檻清單。

from tensorflow_model_analysis.addons.fairness.post_export_metrics import fairness_indicators

# Build the fairness metrics. Besides the thresholds, you also can config the example_weight_key, labels_key here. For more details, please check the api.
metrics_callbacks = \
    [tfma.post_export_metrics.fairness_indicators(thresholds=[0.1, 0.3,
     0.5, 0.7, 0.9])]

eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=tfma_export_dir,
    add_metrics_callbacks=metrics_callbacks)

執行設定前,請判斷您是否要啟用信賴區間計算。信賴區間是使用 Poisson 自助抽樣法計算,且需要針對超過 20 個樣本重新計算。

compute_confidence_intervals = True

執行 TFMA 評估管線

validate_dataset = tf.data.TFRecordDataset(filenames=[validate_tf_file])

# Run the fairness evaluation.
with beam.Pipeline() as pipeline:
  _ = (
      pipeline
      | beam.Create([v.numpy() for v in validate_dataset])
      | 'ExtractEvaluateAndWriteResults' >>
       tfma.ExtractEvaluateAndWriteResults(
                 eval_shared_model=eval_shared_model,
                 slice_spec=slice_spec,
                 compute_confidence_intervals=compute_confidence_intervals,
                 output_path=tfma_eval_result_path)
  )
eval_result = tfma.load_eval_result(output_path=tfma_eval_result_path)

轉譯 Fairness Indicators

from tensorflow_model_analysis.addons.fairness.view import widget_view

widget_view.render_fairness_indicator(eval_result=eval_result)

Fairness Indicators

使用 Fairness Indicators 的訣竅

  • 選取要顯示的指標:勾選左側的方塊。每個指標的個別圖表會依序顯示在小工具中。
  • 變更基準分層:使用下拉式選取器變更圖表上的第一個橫條。差異將根據這個基準值計算。
  • 選取門檻:使用下拉式選取器選取門檻。您可以在同一個圖表上檢視多個門檻。選取的門檻會以粗體顯示,您可以按一下粗體門檻來取消選取。
  • 將滑鼠游標停留在橫條上方:即可查看該分層的指標。
  • 找出與基準的差異:使用「與基準的差異」欄位,此欄位會找出目前分層與基準之間的百分比差異。
  • 深入探索分層的資料點:使用 What-If Tool。如需範例,請參閱這裡

轉譯多個模型的 Fairness Indicators

Fairness Indicators 也可用於比較模型。請勿傳入單一 eval_result,而是傳入 multi_eval_results 物件,此物件是將兩個模型名稱對應至 eval_result 物件的字典。

from tensorflow_model_analysis.addons.fairness.view import widget_view

eval_result1 = tfma.load_eval_result(...)
eval_result2 = tfma.load_eval_result(...)
multi_eval_results = {"MyFirstModel": eval_result1, "MySecondModel": eval_result2}

widget_view.render_fairness_indicator(multi_eval_results=multi_eval_results)

Fairness Indicators - Model Comparison

模型比較可以與門檻比較一併使用。舉例來說,您可以比較兩個模型在兩組門檻下的表現,找出適用於您公平性指標的最佳組合。

搭配非 TensorFlow 模型使用 Fairness Indicators

為了更妥善地支援擁有不同模型和工作流程的客戶,我們開發了一個與要評估的模型無關的評估程式庫。

任何想評估機器學習系統的人員都可以使用此程式庫,特別是當您擁有非以 TensorFlow 為基礎的模型時。您可以使用 Apache Beam Python SDK 建立獨立的 TFMA 評估二元檔,然後執行以分析您的模型。

資料

這個步驟是為了提供您想在其中執行評估的資料集。資料集應採用 tf.Example proto 格式,其中包含標籤、預測和您可能想依據劃分的其他特徵。

tf.Example {
    features {
        feature {
          key: "fur_color" value { bytes_list { value: "gray" } }
        }
        feature {
          key: "height" value { bytes_list { value: "tall" } }
        }
        feature {
          key: "prediction" value { float_list { value: 0.9 } }
        }
        feature {
          key: "label" value { float_list { value: 1.0 } }
        }
    }
}

模型

您可以建立模型無關的評估設定和擷取器,藉此剖析及提供 TFMA 計算指標所需的資料,而不必指定模型。ModelAgnosticConfig 規格定義要從輸入範例使用的特徵、預測和標籤。

為此,請建立特徵對應,其中索引鍵代表所有特徵 (包括標籤和預測索引鍵),值代表特徵的資料類型。

feature_map[label_key] = tf.FixedLenFeature([], tf.float32, default_value=[0])

使用標籤索引鍵、預測索引鍵和特徵對應建立模型無關設定。

model_agnostic_config = model_agnostic_predict.ModelAgnosticConfig(
    label_keys=list(ground_truth_labels),
    prediction_keys=list(predition_labels),
    feature_spec=feature_map)

設定模型無關擷取器

擷取器用於使用模型無關設定,從輸入中擷取特徵、標籤和預測。如果您想分層資料,也需要定義分層索引鍵規格,其中包含您想依據劃分的欄相關資訊。

model_agnostic_extractors = [
    model_agnostic_extractor.ModelAgnosticExtractor(
        model_agnostic_config=model_agnostic_config, desired_batch_size=3),
    slice_key_extractor.SliceKeyExtractor([
        slicer.SingleSliceSpec(),
        slicer.SingleSliceSpec(columns=[‘height’]),
    ])
]

計算 Fairness Metrics

您可以提供您想在其中評估模型的所有指標,作為 EvalSharedModel 的一部分。指標是以指標回呼的形式提供,例如 post_export_metricsfairness_indicators 中定義的指標回呼。

metrics_callbacks.append(
    post_export_metrics.fairness_indicators(
        thresholds=[0.5, 0.9],
        target_prediction_keys=[prediction_key],
        labels_key=label_key))

它也會接收 construct_fn,此函式用於建立 tensorflow 圖表以執行評估。

eval_shared_model = types.EvalSharedModel(
    add_metrics_callbacks=metrics_callbacks,
    construct_fn=model_agnostic_evaluate_graph.make_construct_fn(
        add_metrics_callbacks=metrics_callbacks,
        fpl_feed_config=model_agnostic_extractor
        .ModelAgnosticGetFPLFeedConfig(model_agnostic_config)))

完成所有設定後,使用 model_eval_lib 提供的 ExtractEvaluateExtractEvaluateAndWriteResults 函式之一來評估模型。

_ = (
    examples |
    'ExtractEvaluateAndWriteResults' >>
        model_eval_lib.ExtractEvaluateAndWriteResults(
        eval_shared_model=eval_shared_model,
        output_path=output_path,
        extractors=model_agnostic_extractors))

eval_result = tensorflow_model_analysis.load_eval_result(output_path=tfma_eval_result_path)

最後,按照上方「轉譯 Fairness Indicators」章節的指示轉譯 Fairness Indicators。

更多範例

Fairness Indicators 範例目錄包含數個範例