公平性指标 (Fairness Indicators)

“公平性指标”(Fairness Indicators)旨在与更广泛的 TensorFlow 工具包协作,支持团队评估并改进模型,以解决公平性问题。该工具目前已被我们内部的许多产品广泛使用,现在作为 BETA 版本发布,供您在自己的用例中试用。

Fairness Indicator Dashboard

什么是公平性指标?

公平性指标是一个库,能够针对二元和多分类器轻松计算已识别的常用公平性指标。许多现有的评估公平性问题的工具在处理大规模数据集和模型时表现不佳。在 Google,我们必须拥有能够处理十亿用户系统的工具,这一点至关重要。公平性指标将允许您对任何规模的用例进行评估。

具体而言,公平性指标具有以下功能:

  • 评估数据集分布
  • 评估模型性能,并按定义的用户群进行切片(sliced)
    • 通过置信区间和多阈值评估,让您对结果充满信心
  • 深入研究各个切片,探索根本原因并寻找改进机会

pip 软件包下载包含:

将公平性指标与 Tensorflow 模型结合使用

数据

要在 TFMA 中运行公平性指标,请确保评估数据集已针对您想要切片的特征进行了标注。如果您没有用于公平性问题的确切切片特征,可以尝试寻找一个具备此类特征的评估集,或者考虑在特征集中使用可能突出结果差异的代理特征。如需更多指导,请参阅此处

模型

您可以使用 Tensorflow Estimator 类来构建模型。TFMA 对 Keras 模型的支持即将推出。如果您想在 Keras 模型上运行 TFMA,请参阅下方的“模型无关的 TFMA”(Model-Agnostic TFMA)部分。

在 Estimator 训练完成后,您需要导出已保存的模型以进行评估。要了解更多信息,请参阅 TFMA 指南

配置切片

接下来,定义您想要评估的切片。

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

如果您想要评估交叉切片(例如,同时包含毛色和身高),您可以进行以下设置:

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

计算公平性指标

将公平性指标回调(callback)添加到 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 bootstrapping)计算的,需要对 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)

渲染公平性指标

from tensorflow_model_analysis.addons.fairness.view import widget_view

widget_view.render_fairness_indicator(eval_result=eval_result)

Fairness Indicators

使用公平性指标的技巧

  • 选择要显示的指标:勾选左侧的复选框。每个指标的独立图表将依次显示在小部件中。
  • 更改基准切片:使用下拉选择器更改图表中的第一个柱状图。差值将根据此基准值计算得出。
  • 选择阈值:使用下拉选择器。您可以在同一图表上查看多个阈值。所选阈值将以粗体显示,您可以点击粗体阈值来取消选择。
  • 将鼠标悬停在柱状图上:查看该切片的指标。
  • 识别与基准的差异:使用“Diff w. baseline”(与基准的差值)列,该列显示了当前切片与基准之间的百分比差异。
  • 深入探索切片的数据点:使用 What-If 工具。请参阅此处获取示例。

为多个模型渲染公平性指标

公平性指标也可用于比较模型。与其传入单个 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 模型结合使用

为了更好地支持拥有不同模型和工作流的客户,我们开发了一个评估库,它与被评估的模型无关。

任何想要评估其机器学习系统的人都可以使用此工具,尤其是当您拥有非 TensorFlow 模型时。使用 Apache Beam Python SDK,您可以创建一个独立的 TFMA 评估二进制文件,然后运行它来分析您的模型。

数据

此步骤是提供您希望在其上运行评估的数据集。它应该采用 tf.Example 原型格式,包含标签、预测值以及您可能想要进行切片分析的其他特征。

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 } }
        }
    }
}

模型

无需指定模型,您可以创建一个与模型无关的评估配置和提取器(extractor)来解析并提供 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)

设置模型无关的提取器

提取器 (Extractor) 用于根据模型无关配置从输入中提取特征、标签和预测值。如果您想对数据进行切片,还需要定义 切片键规范 (slice key spec),其中包含有关您想要切片的列的信息。

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]),
    ])
]

计算公平性指标

作为 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)

最后,按照上述“渲染公平性指标”部分中的说明渲染公平性指标。

更多示例

公平性指标示例目录包含多个示例: