पंडों डेटाफ़्रेम टू फेयरनेस इंडिकेटर केस स्टडी

TensorFlow.org पर देखें Google Colab में चलाएं गिटहब पर देखें नोटबुक डाउनलोड करें

केस स्टडी अवलोकन

इस मामले अध्ययन में हमने लागू होगी TensorFlow मॉडल विश्लेषण और निष्पक्षता संकेतक एक पांडा DataFrame, जहां प्रत्येक पंक्ति जमीनी सच्चाई लेबल, विभिन्न सुविधाओं में शामिल है, और एक मॉडल भविष्यवाणी रूप में संग्रहीत डेटा का मूल्यांकन करने के। हम दिखाएंगे कि कैसे इस वर्कफ़्लो का उपयोग संभावित निष्पक्षता चिंताओं को दूर करने के लिए किया जा सकता है, मॉडल के निर्माण और प्रशिक्षण के लिए उपयोग किए जाने वाले ढांचे से स्वतंत्र। जैसा कि इस मामले के अध्ययन में, हम किसी भी मशीन लर्निंग फ्रेमवर्क (जैसे TensorFlow, JAX, आदि) से परिणामों का विश्लेषण कर सकते हैं, जब वे पंडों के डेटाफ़्रेम में परिवर्तित हो जाते हैं।

इस अभ्यास के लिए, हम का लाभ उठाने जाएगा दीप तंत्रिका नेटवर्क (DNN) मॉडल है कि में विकसित किया गया था Tensorflow जाली के साथ नैतिकता के लिए आकार प्रतिबन्ध मामले लॉ स्कूल प्रवेश परिषद (LSAC) से लॉ स्कूल प्रवेश डेटासेट का उपयोग करके अध्ययन। यह क्लासिफायर यह अनुमान लगाने का प्रयास करता है कि कोई छात्र अपने लॉ स्कूल एडमिशन टेस्ट (LSAT) स्कोर और स्नातक GPA के आधार पर बार पास करेगा या नहीं। यह क्लासिफायरियर यह अनुमान लगाने का प्रयास करता है कि कोई छात्र अपने एलएसएटी स्कोर और स्नातक जीपीए के आधार पर बार पास करेगा या नहीं।

एलएसएसी डेटासेट

इस मामले का अध्ययन के भीतर इस्तेमाल डाटासेट मूल रूप से 'नामक एक अध्ययन के लिए एकत्र किया गया था LSAC राष्ट्रीय अनुदैर्ध्य बार पारित अध्ययन। LSAC अनुसंधान रिपोर्ट सीरीज 'लिंडा Wightman द्वारा 1998 में डाटासेट वर्तमान में होस्ट किया गया है यहाँ

  • dnn_bar_pass_prediction: DNN मॉडल से LSAT भविष्यवाणी।
  • लिंग: छात्र की लिंग।
  • LSAT: LSAT स्कोर छात्र द्वारा प्राप्त किया।
  • 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()

निष्पक्षता संकेतक कॉन्फ़िगर करें।

डेटाफ़्रेम के साथ फेयरनेस इंडिकेटर का उपयोग करते समय कई पैरामीटर हैं जिन्हें आपको ध्यान में रखना होगा

  • आपके इनपुट डेटाफ़्रेम में आपके मॉडल का एक पूर्वानुमान कॉलम और लेबल कॉलम होना चाहिए। डिफ़ॉल्ट रूप से निष्पक्षता संकेतक एक भविष्यवाणी स्तंभ कहा जाता है के लिए दिखेगा prediction और एक लेबल नामक कॉलम label अपने DataFrame के भीतर।

    • यदि इनमें से कोई भी मान नहीं मिलता है तो एक KeyError उठाया जाएगा।
  • एक DataFrame के अलावा, आप भी एक शामिल करना होगा eval_config कि, पर मीट्रिक की गणना करने के स्लाइस, और उदाहरण के लेबल और भविष्यवाणियों के लिए स्तंभ नाम गणना करने के लिए मीट्रिक में शामिल करना चाहिए।

    • metrics_specs गणना करने के लिए मैट्रिक्स सेट हो जाएगा। FairnessIndicators मीट्रिक निष्पक्षता मैट्रिक्स प्रस्तुत करना आवश्यक हो जाएगा और आप अतिरिक्त वैकल्पिक मैट्रिक्स की एक सूची देख सकते हैं यहां

    • slicing_specs क्या सुविधा आप जांच में रुचि रखते हैं निर्दिष्ट करने के लिए एक वैकल्पिक टुकड़ा करने की क्रिया पैरामीटर है। इस मामले के अध्ययन के भीतर दौड़ 1 का उपयोग किया जाता है, हालांकि आप इस मान को किसी अन्य विशेषता पर भी सेट कर सकते हैं (उदाहरण के लिए इस डेटाफ़्रेम के संदर्भ में लिंग)। यदि 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)`

निष्पक्षता संकेतकों के साथ मॉडल प्रदर्शन का अन्वेषण करें।

फेयरनेस इंडिकेटर चलाने के बाद, हम अपने मॉडल के प्रदर्शन का विश्लेषण करने के लिए चुने गए विभिन्न मेट्रिक्स की कल्पना कर सकते हैं। इस केस स्टडी में हमने फेयरनेस इंडिकेटर को शामिल किया है और मनमाने ढंग से एयूसी को चुना है।

जब हम पहली बार प्रत्येक रेस स्लाइस के लिए समग्र एयूसी को देखते हैं तो हम मॉडल के प्रदर्शन में थोड़ी सी विसंगति देख सकते हैं, लेकिन ऐसा कुछ भी नहीं है जो यकीनन खतरनाक हो।

  • एशियाई: 0.58
  • काला: 0.58
  • हिस्पैनिक: 0.58
  • अन्य: 0.64
  • व्हाइट: 0.6

हालांकि, जब हम दौड़ से विभाजित झूठी नकारात्मक दरों को देखते हैं, तो हमारा मॉडल फिर से गलत तरीके से भविष्यवाणी करता है कि उपयोगकर्ता अलग-अलग दरों पर बार पास कर सकता है और इस बार, बहुत कुछ करता है।

  • एशियाई: 0.01
  • काला: 0.05
  • हिस्पैनिक: 0.02
  • अन्य: 0.01
  • व्हाइट: 0.01

सबसे विशेष रूप से ब्लैक एंड व्हाइट छात्रों के बीच का अंतर लगभग 380% है, जिसका अर्थ है कि हमारे मॉडल में गलत तरीके से भविष्यवाणी करने की लगभग 4x अधिक संभावना है कि एक अश्वेत छात्र एक छोटे छात्र की तुलना में बार पास नहीं करेगा। यदि हम इस प्रयास को जारी रखते हैं, तो एक व्यवसायी इन परिणामों को एक संकेत के रूप में उपयोग कर सकता है कि उन्हें यह सुनिश्चित करने में अधिक समय देना चाहिए कि उनका मॉडल सभी पृष्ठभूमि के लोगों के लिए अच्छा काम करता है।

# 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() , अपने स्वयं के एपीआई कि अपने कार्यक्रमों में 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} } }

निष्कर्ष

इस केस स्टडी के भीतर हमने एक डेटासेट को पंडों के डेटाफ़्रेम में आयात किया, जिसका हमने तब फेयरनेस इंडिकेटर के साथ विश्लेषण किया था। अपने मॉडल के परिणामों और अंतर्निहित डेटा को समझना यह सुनिश्चित करने के लिए एक महत्वपूर्ण कदम है कि आपका मॉडल हानिकारक पूर्वाग्रह को नहीं दर्शाता है। इस केस स्टडी के संदर्भ में हमने एलएसएसी डेटासेट की जांच की और इस डेटा से भविष्यवाणियां छात्रों की दौड़ से कैसे प्रभावित हो सकती हैं। "क्या अनुचित है और क्या उचित है" की अवधारणा को शिक्षा, काम पर रखने और मशीन सीखने सहित 50 से अधिक वर्षों से कई विषयों में पेश किया गया है। 1 निष्पक्षता संकेतक अपने मशीन में मदद कम करने निष्पक्षता चिंताओं मॉडल सीखने के लिए एक उपकरण है।

अधिक जानने के लिए के बारे में निष्पक्षता चिंताओं को देखें निष्पक्षता संकेतक और संसाधनों का उपयोग कर के बारे में अधिक जानकारी के लिए यहाँ


  1. हचिंसन, बी।, मिशेल, एम। (2018)। टेस्ट (अन) निष्पक्षता के 50 साल: मशीन लर्निंग के लिए सबक। https://arxiv.org/abs/1811.10104

अनुबंध

एमएल मॉडल को पंडों डेटाफ़्रेम में बदलने में मदद करने के लिए नीचे कुछ कार्य दिए गए हैं।

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