مطالعه موردی Pandas DataFrame to Fairness Indicators

مشاهده در TensorFlow.org در Google Colab اجرا شود در GitHub مشاهده کنید دانلود دفترچه یادداشت

بررسی اجمالی مطالعه موردی

در این مطالعه مورد ما اعمال خواهد شد TensorFlow تجزیه و تحلیل مدل و شاخص عدالت برای ارزیابی داده های ذخیره شده به عنوان یک پاندا DataFrame، که در آن هر ردیف شامل زمین برچسب حقیقت، ویژگی های مختلف، و یک پیش بینی مدل. ما نشان خواهیم داد که چگونه می توان از این گردش کار برای شناسایی نگرانی های بالقوه انصاف، مستقل از چارچوب مورد استفاده برای ساخت و آموزش مدل استفاده کرد. همانطور که در این مطالعه موردی، می‌توانیم نتایج حاصل از هر چارچوب یادگیری ماشینی (مانند TensorFlow، JAX و غیره) را هنگامی که به یک Pandas DataFrame تبدیل شوند، تجزیه و تحلیل کنیم.

برای این تمرین، ما را به مدل شبکه عصبی عمیق (DNN) که در توسعه داده شد اهرم محدودیت شکل اخلاق با Tensorflow شبکه مورد مطالعه با استفاده از دانشکده حقوق پذیرش مجموعه داده از شورای پذیرش دانشکده حقوق (LSAC). این طبقه‌بندی‌کننده تلاش می‌کند تا بر اساس نمره آزمون پذیرش دانشکده حقوق (LSAT) و معدل کارشناسی آن‌ها، پیش‌بینی کند که آیا دانش‌آموزی می‌تواند این نوار را بگذراند یا خیر. این طبقه‌بندی‌کننده تلاش می‌کند تا بر اساس نمره LSAT و معدل مقطع کارشناسی، پیش‌بینی کند که آیا دانش‌آموزی می‌تواند این نوار را بگذراند یا خیر.

مجموعه داده LSAC

مجموعه داده مورد استفاده در این مطالعه مورد در اصل برای مطالعه به نام "جمع آوری شد LSAC ملی طولی نوار پاساژ مطالعه. LSAC گزارش تحقیقات سری توسط لیندا وایتمن در سال 1998. مجموعه داده ها در حال حاضر به میزبانی اینجا .

  • dnn_bar_pass_prediction: پیش بینی آخر از مدل DNN.
  • جنسیت: جنسیت دانش آموز.
  • آخر: آخر نمره دریافت شده توسط دانش آموز.
  • pass_bar: زمین برچسب حقیقت نشان می دهد یا نه دانش آموز در نهایت به تصویب نوار.
  • مسابقه: مسابقه دانش آموز.
  • ugpa: یک مقطع کارشناسی معدل دانش آموز است.
!pip install -q -U pip==20.2

!pip install -q -U \
  tensorflow-model-analysis==0.30.0 \
  tensorflow-data-validation==0.30.0 \
  tfx-bsl==0.30.0

واردات بسته های مورد نیاز:

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

import tensorflow_model_analysis as tfma
from google.protobuf import text_format

import tensorflow as tf
tf.compat.v1.enable_v2_behavior()

داده ها را دانلود کنید و مجموعه داده اولیه را بررسی کنید.

# 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()

پیکربندی نشانگرهای انصاف

چندین پارامتر وجود دارد که باید هنگام استفاده از نشانگرهای انصاف با DataFrame در نظر بگیرید

  • DataFrame ورودی شما باید شامل یک ستون پیش‌بینی و ستون برچسب از مدل شما باشد. به طور پیش فرض انصاف شاخص خواهد برای یک ستون پیش بینی به نام نگاه prediction و یک ستون برچسب به نام label در DataFrame خود را.

    • اگر هر یک از این مقادیر یافت نشد، یک KeyError ایجاد می شود.
  • علاوه بر این به DataFrame، شما همچنین نیاز به شامل eval_config است که باید از معیارهای محاسبه شامل، برش برای محاسبه معیارهای در، و نام ستون برای مثال برچسب و پیش بینی.

    • metrics_specs خواهد معیارهای محاسبه تنظیم شده است. FairnessIndicators متریک مورد نیاز خواهد بود برای ارائه معیارهای عدالت و شما می توانید یک لیست از معیارهای اختیاری اضافی را ببینید در اینجا .

    • slicing_specs یک پارامتر اختیاری برش را مشخص چه ویژگی شما علاقه مند به بررسی هستیم. در این مطالعه موردی از race1 استفاده می‌شود، اما می‌توانید این مقدار را روی ویژگی دیگری نیز تنظیم کنید (به عنوان مثال جنسیت در زمینه این DataFrame). اگر slicing_specs ارائه نشده است تمام ویژگی های موجود خواهد شد.

    • اگر DataFrame خود را شامل یک برچسب و یا پیش بینی ستون است که متفاوت از پیش فرض prediction و یا label ، شما می توانید پیکربندی label_key و prediction_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.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: 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.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: 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)`

عملکرد مدل را با نشانگرهای انصاف کاوش کنید.

پس از اجرای Fairness Indicators، می‌توانیم معیارهای مختلفی را که برای تجزیه و تحلیل عملکرد مدل‌هایمان انتخاب کرده‌ایم تجسم کنیم. در این مطالعه موردی، ما شاخص‌های انصاف را گنجانده‌ایم و AUC را خودسرانه انتخاب کرده‌ایم.

هنگامی که ما برای اولین بار به AUC کلی برای هر بخش مسابقه نگاه می کنیم، می توانیم اختلاف جزئی در عملکرد مدل مشاهده کنیم، اما چیزی که مسلماً نگران کننده نیست.

  • آسیا: 0.58
  • سیاه و سفید: 0.58
  • اسپانیایی: 0.58
  • دیگر: 0.64
  • سفید: 0.6

با این حال، وقتی به نرخ‌های منفی کاذب تقسیم شده بر اساس نژاد نگاه می‌کنیم، مدل ما دوباره به اشتباه احتمال عبور کاربر از نوار را با نرخ‌های مختلف پیش‌بینی می‌کند و این بار این کار را بسیار انجام می‌دهد.

  • آسیا: 0.01
  • سیاه و سفید: 0.05
  • اسپانیایی: 0.02
  • دیگر: 0.01
  • سفید: 0.01

مهم ترین تفاوت بین دانش آموزان سیاه و سفید حدود 380٪ است، به این معنی که مدل ما تقریباً 4 برابر بیشتر احتمال دارد که یک دانش آموز سیاهپوست به طور نادرست از نوار عبور نکند. اگر بخواهیم به این تلاش ادامه دهیم، یک تمرین‌کننده می‌تواند از این نتایج به‌عنوان سیگنالی استفاده کند که باید زمان بیشتری را صرف اطمینان از اینکه مدلشان برای افراد با هر زمینه‌ای خوب عمل می‌کند، صرف کند.

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

tfma.EvalResult

eval_result شی، بالا در رندر render_fairness_indicator() است، API خود را دارد که می توان برای خواندن نتایج TFMA به برنامه های خود را.

get_slice_names() و get_metric_names()

برای بدست آوردن برش ها و معیارهای ارزیابی شده، می توانید از توابع مربوطه استفاده کنید.

pp = pprint.PrettyPrinter()

print("Slices:")
pp.pprint(eval_result.get_slice_names())
print("\nMetrics:")
pp.pprint(eval_result.get_metric_names())
Slices:
[(),
 (('race1', 'white'),),
 (('race1', 'hisp'),),
 (('race1', 'asian'),),
 (('race1', 'black'),),
 (('race1', 'nan'),),
 (('race1', 'other'),)]

Metrics:
['fairness_indicators_metrics/negative_rate@0.9',
 'fairness_indicators_metrics/true_negative_rate@0.5',
 'fairness_indicators_metrics/false_positive_rate@0.9',
 'fairness_indicators_metrics/false_discovery_rate@0.9',
 'fairness_indicators_metrics/false_positive_rate@0.5',
 'auc',
 'fairness_indicators_metrics/false_discovery_rate@0.5',
 'fairness_indicators_metrics/false_omission_rate@0.9',
 'fairness_indicators_metrics/false_omission_rate@0.5',
 'fairness_indicators_metrics/true_positive_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.9',
 'fairness_indicators_metrics/negative_rate@0.5',
 'fairness_indicators_metrics/true_positive_rate@0.9',
 'fairness_indicators_metrics/true_negative_rate@0.9',
 'fairness_indicators_metrics/false_negative_rate@0.5',
 'fairness_indicators_metrics/positive_rate@0.5']

get_metrics_for_slice() و get_metrics_for_all_slices()

اگر شما می خواهید برای دریافت متریک برای یک تکه خاص، شما می توانید استفاده کنید get_metrics_for_slice() . این تابع یک فرهنگ لغت نگاشت نام متریک به مقادیر متریک .

baseline_slice = ()
black_slice = (('race1', 'black'),)

print("Baseline metric values:")
pp.pprint(eval_result.get_metrics_for_slice(baseline_slice))
print("Black metric values:")
pp.pprint(eval_result.get_metrics_for_slice(black_slice))
Baseline metric values:
{'auc': {'doubleValue': 0.6286112666130066},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.052173524948674464},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0502241746297722},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 4.7085412939071474e-05},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.012524719841793012},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8159509202453987},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9486740804106074},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 4.462891060829205e-05},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.014549024858303209},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999553710893917},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9854509751416968},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.05132591958939264},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999529145870609},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.987475280158207} }
Black metric values:
{'auc': {'doubleValue': 0.5779293775558472},
 'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.22189128816083395},
 'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.21048451151707703},
 'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.04880382775119617},
 'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
 'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.6071428571428571},
 'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.889261744966443},
 'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.06254653760238273},
 'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9374534623976173},
 'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
 'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.11073825503355705},
 'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
 'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9511961722488038} }

اگر شما می خواهید برای دریافت متریک برای تمام برش، get_metrics_for_all_slices() برمی گرداند فرهنگ لغت نگاشت هر قطعه به مربوط get_metrics_for_slices(slice) .

pp.pprint(eval_result.get_metrics_for_all_slices())
{(): {'auc': {'doubleValue': 0.6286112666130066},
      'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.052173524948674464},
      'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.0502241746297722},
      'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 4.7085412939071474e-05},
      'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.012524719841793012},
      'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
      'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8159509202453987},
      'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
      'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9486740804106074},
      'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 4.462891060829205e-05},
      'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.014549024858303209},
      'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999553710893917},
      'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9854509751416968},
      'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
      'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.05132591958939264},
      'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999529145870609},
      'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.987475280158207} },
 (('race1', 'asian'),): {'auc': {'doubleValue': 0.5817844271659851},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.07803790412486064},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.07674943566591422},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.010882708585247884},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.8181818181818182},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9714285714285714},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.012263099219620958},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.987736900780379},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.02857142857142857},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9891172914147521} },
 (('race1', 'black'),): {'auc': {'doubleValue': 0.5779293775558472},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.22189128816083395},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.21048451151707703},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.04880382775119617},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.6071428571428571},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.889261744966443},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.06254653760238273},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9374534623976173},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.11073825503355705},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9511961722488038} },
 (('race1', 'hisp'),): {'auc': {'doubleValue': 0.5754180550575256},
                        'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.124634858812074},
                        'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.12139303482587065},
                        'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.017797552836484983},
                        'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                        'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.7272727272727273},
                        'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.953125},
                        'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.021421616358325218},
                        'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9785783836416748},
                        'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                        'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.046875},
                        'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                        'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.982202447163515} },
 (('race1', 'nan'),): {'auc': {'doubleValue': 0.7142857313156128},
                       'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.125},
                       'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.125},
                       'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                       'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 'NaN'},
                       'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.0},
                       'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                       'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 1.0} },
 (('race1', 'other'),): {'auc': {'doubleValue': 0.6389539241790771},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.10294117647058823},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.09523809523809523},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.01366120218579235},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 'NaN'},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.5555555555555556},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9047619047619048},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.022058823529411766},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9779411764705882},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.09523809523809523},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9863387978142076} },
 (('race1', 'white'),): {'auc': {'doubleValue': 0.5987964272499084},
                         'fairness_indicators_metrics/false_discovery_rate@0.5': {'doubleValue': 0.03360940422121293},
                         'fairness_indicators_metrics/false_discovery_rate@0.9': {'doubleValue': 0.03316050982933679},
                         'fairness_indicators_metrics/false_negative_rate@0.5': {'doubleValue': 5.52883286338254e-05},
                         'fairness_indicators_metrics/false_negative_rate@0.9': {'doubleValue': 0.010228340797257698},
                         'fairness_indicators_metrics/false_omission_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_omission_rate@0.9': {'doubleValue': 0.925},
                         'fairness_indicators_metrics/false_positive_rate@0.5': {'doubleValue': 1.0},
                         'fairness_indicators_metrics/false_positive_rate@0.9': {'doubleValue': 0.9761526232114467},
                         'fairness_indicators_metrics/negative_rate@0.5': {'doubleValue': 5.3430220132506944e-05},
                         'fairness_indicators_metrics/negative_rate@0.9': {'doubleValue': 0.010686044026501388},
                         'fairness_indicators_metrics/positive_rate@0.5': {'doubleValue': 0.9999465697798675},
                         'fairness_indicators_metrics/positive_rate@0.9': {'doubleValue': 0.9893139559734986},
                         'fairness_indicators_metrics/true_negative_rate@0.5': {'doubleValue': 0.0},
                         'fairness_indicators_metrics/true_negative_rate@0.9': {'doubleValue': 0.02384737678855326},
                         'fairness_indicators_metrics/true_positive_rate@0.5': {'doubleValue': 0.9999447116713662},
                         'fairness_indicators_metrics/true_positive_rate@0.9': {'doubleValue': 0.9897716592027423} } }

نتیجه

در این مطالعه موردی، ما یک مجموعه داده را به یک Pandas DataFrame وارد کردیم که سپس با شاخص‌های انصاف تحلیل کردیم. درک نتایج مدل شما و داده‌های زیربنایی، گام مهمی برای اطمینان از اینکه مدل شما منعکس کننده سوگیری مضر نیست. در زمینه این مطالعه موردی، مجموعه داده LSAC و اینکه چگونه پیش‌بینی‌های حاصل از این داده‌ها می‌تواند توسط یک مسابقه دانش‌آموزی تحت‌تاثیر قرار گیرد را بررسی کردیم. مفهوم "آنچه ناعادلانه است و آنچه منصفانه است" بیش از 50 سال است که در چندین رشته از جمله در آموزش، استخدام و یادگیری ماشینی معرفی شده است. 1 انصاف شاخص یک ابزار به نگرانی انصاف کمک به کاهش در دستگاه شما مدل یادگیری است.

برای کسب اطلاعات بیشتر در مورد استفاده از شاخص ها و منابع انصاف به یادگیری نگرانی انصاف در مورد بیشتر اینجا .


  1. هاچینسون، بی.، میچل، ام. (2018). 50 سال آزمون (عدم) انصاف: درس هایی برای یادگیری ماشین. https://arxiv.org/abs/1811.10104

ضمیمه

در زیر چند عملکرد برای کمک به تبدیل مدل های ML به Pandas DataFrame آورده شده است.

# 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())