此页面由 Cloud Translation API 翻译。
Switch to English

熊猫数据框中公平指标案例

在此活动中,您将学习如何使用公平指标与熊猫数据帧。

案例概述

在这种情况下研究中,我们将采用TensorFlow模型分析公平性指标来评估存储为大熊猫据帧,其中每行都包含地面实况标签,各种功能和模型预测数据。我们将展示这个工作流程如何可以用来发现潜在的公平性的担忧,独立的用于构建和训练模型的框架之一。在本案例中,我们可以分析来自任何机器学习框架(例如TensorFlow,JAX等),一旦被转换成数据框大熊猫的结果。

在这个练习中,我们将充分利用这是在发达的深层神经网络(DNN)模型形状约束的伦理与Tensorflow格使用从法学院入学委员会(LSAC)法学院招生数据集为例。这种分类试图预测一个学生是否会通过律师,根据自己的法学院入学考试(LSAT)成绩和本科GPA。这种分类试图预测一个学生是否会通过律师,根据自己的LSAT成绩和本科GPA。

LSAC数据集

本案例研究中使用的数据集最初收集了所谓的“研究LSAC国家纵向禁止通行研究。 LSAC研究报告系列 “由琳达·怀特曼于1998年,集目前托管在这里

  • dnn_bar_pass_prediction:从DNN模型LSAT预测。
  • 性别 :学生的性别。
  • LSAT:LSAT由学生收到分数。
  • pass_bar:地面真相标签,说明该学生是否最终通过了律师资格。
  • 种族 :学生的种族。
  • ugpa:学生的本科GPA。
 !pip install -q -U \
  tensorflow-model-analysis==0.22.2 \
  tensorflow-data-validation==0.22.1 \
  tfx-bsl==0.22.1 \
  pyarrow==0.16.0

 
ERROR: tensorflow-serving-api 2.2.0 has requirement tensorflow~=2.2.0, but you'll have tensorflow 2.3.0 which is incompatible.
ERROR: tensorflow-transform 0.22.0 has requirement tensorflow!=2.0.*,<2.3,>=1.15, but you'll have tensorflow 2.3.0 which is incompatible.
WARNING: You are using pip version 20.1.1; however, version 20.2 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

导入所需的包:

 import os
import tempfile
import pandas as pd
import six.moves.urllib as urllib

import tensorflow_model_analysis as tfma
from google.protobuf import text_format

 

下载数据,并探讨初始数据集。

 # Download the LSAT dataset and setup the required filepaths.
_DATA_ROOT = tempfile.mkdtemp(prefix='lsat-data')
_DATA_PATH = 'https://storage.googleapis.com/lawschool_dataset/bar_pass_prediction.csv'
_DATA_FILEPATH = os.path.join(_DATA_ROOT, 'bar_pass_prediction.csv')

data = urllib.request.urlopen(_DATA_PATH)

_LSAT_DF = pd.read_csv(data)

# To simpliy the case study, we will only use the columns that will be used for
# our model.
_COLUMN_NAMES = [
  'dnn_bar_pass_prediction',
  'gender',
  'lsat',
  'pass_bar',
  'race1',
  'ugpa',
]

_LSAT_DF.dropna()
_LSAT_DF['gender'] = _LSAT_DF['gender'].astype(str)
_LSAT_DF['race1'] = _LSAT_DF['race1'].astype(str)
_LSAT_DF = _LSAT_DF[_COLUMN_NAMES]

_LSAT_DF.head()
 

配置公平性指标。

有几个参数,你需要使用公平指标与数据帧时,考虑到

  • 您的输入数据框中必须包含模型预测列和标签栏。默认情况下,公平性指标将寻找一个预测列名为prediction和标签栏叫做label的数据帧中。

    • 如果这些值都没有找到一个KeyError异常将提高。
  • 除了数据框,您还需要包括eval_config应包括的指标来计算,片来计算的指标,例如标签和预测的列名。

    • metrics_specs将设置指标来计算。该FairnessIndicators指标将需要渲染的公平性指标,你可以看到更多的可选指标列表在这里

    • slicing_specs是一个可选的切片参数来指定哪些功能你感兴趣的调查。在使用了该案例研究race1,但是你也可以将此值设置为另一功能(在此数据帧的情况下例如性别)。如果slicing_specs没有提供所有的功能将包括在内。

    • 如果您的数据帧包含一个标签或预测列,它是不同于默认predictionlabel ,您可以配置label_keyprediction_key到一个新的价值。

  • 如果output_path没有指定一个临时目录将被创建。

 # Specify Fairness Indicators in eval_config.
eval_config = text_format.Parse("""
  model_specs {
    prediction_key: 'dnn_bar_pass_prediction',
    label_key: 'pass_bar'
  }
  metrics_specs {
    metrics {class_name: "AUC"}
    metrics {
      class_name: "FairnessIndicators"
      config: '{"thresholds": [0.50, 0.90]}'
    }
  }
  slicing_specs {
    feature_keys: 'race1'
  }
  slicing_specs {}
  """, tfma.EvalConfig())

# Run TensorFlow Model Analysis.
eval_result = tfma.analyze_raw_data(
  data=_LSAT_DF,
  eval_config=eval_config,
  output_path=_DATA_ROOT)
 
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.

Warning:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

探索与公平性指标模型的性能。

运行公平指标后,我们可以直观地显示不同的指标,我们选择来分析我们的模型表现。在这种情况下研究中,我们已经包括公平性指标和随机选取的AUC。

当我们第一次看到每个种族切片整体AUC我们可以看到模型性能略有出入,但没有什么可以说是惊人的。

  • 亚洲 :0.58
  • 黑色 :0.58
  • 西班牙 :0.58
  • 其它 :0.64
  • :0.6

然而,当我们看通过比赛中的假阴性率分裂,我们的模型再次错误地预测路过酒吧以不同的速率的用户,而且这一次的可能性,受到了很多这样做。

  • 亚洲 :0.01
  • 黑色 :0.05
  • 西班牙 :0.02
  • 其它 :0.01
  • :0.01

最值得注意的是黑人和白人学生之间的差异约380%,这意味着我们的模型是近4倍更有可能错误地预测,一个黑人学生将无法通过吧,比whilte学生。如果我们继续这方面的努力,从业者可以使用这些结果作为一个信号,他们应该花更多的时间来确保他们的模型可以很好地用于各种背景的人。

 # Render Fairness Indicators.
tfma.addons.fairness.view.widget_view.render_fairness_indicator(eval_result)
 
FairnessIndicatorViewer(slicingMetrics=[{'sliceValue': 'white', 'slice': 'race1:white', 'metrics': {'fairness_…

结论

在这种情况下,我们研究进口数据集中到一个数据帧的熊猫,我们再与公平性指标进行分析。了解你的模型结果和基础数据是确保你的模型的一个重要步骤并不反映有害的偏见。在这种情况下,研究的背景下,我们检查了LSAC数据集,以及如何从这些数据预测可能是由学生的比赛受到影响。的概念“什么是不公平的,是公平已经在多个领域为超过50年来,包括在教育,雇佣,和机器学习引入。什么” 1公平性指标是在你的机器帮助减轻忧虑的公平性学习模型的工具。

有关使用公平指标和资源,以了解更多关于公平的担忧详细信息请参阅这里


  1. 哈钦森,B.,米切尔,M.(2018)。 50年测试(UN)公平:教训机器学习。 https://arxiv.org/abs/1811.10104

附录

下面是帮助几个函数转换ML车型熊猫数据帧。

 # TensorFlow Estimator to Pandas DataFrame:

# _X_VALUE =  # X value of binary estimator.
# _Y_VALUE =  # Y value of binary estimator.
# _GROUND_TRUTH_LABEL =  # Ground truth value of binary estimator.

def _get_predicted_probabilities(estimator, input_df, get_input_fn):
  predictions = estimator.predict(
      input_fn=get_input_fn(input_df=input_df, num_epochs=1))
  return [prediction['probabilities'][1] for prediction in predictions]

def _get_input_fn_law(input_df, num_epochs, batch_size=None):
  return tf.compat.v1.estimator.inputs.pandas_input_fn(
      x=input_df[[_X_VALUE, _Y_VALUE]],
      y=input_df[_GROUND_TRUTH_LABEL],
      num_epochs=num_epochs,
      batch_size=batch_size or len(input_df),
      shuffle=False)

def estimator_to_dataframe(estimator, input_df, num_keypoints=20):
  x = np.linspace(min(input_df[_X_VALUE]), max(input_df[_X_VALUE]), num_keypoints)
  y = np.linspace(min(input_df[_Y_VALUE]), max(input_df[_Y_VALUE]), num_keypoints)

  x_grid, y_grid = np.meshgrid(x, y)

  positions = np.vstack([x_grid.ravel(), y_grid.ravel()])
  plot_df = pd.DataFrame(positions.T, columns=[_X_VALUE, _Y_VALUE])
  plot_df[_GROUND_TRUTH_LABEL] = np.ones(len(plot_df))
  predictions = _get_predicted_probabilities(
      estimator=estimator, input_df=plot_df, get_input_fn=_get_input_fn_law)
  return pd.DataFrame(
      data=np.array(np.reshape(predictions, x_grid.shape)).flatten())
 
查看上TensorFlow.org