本頁面由 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