পান্ডাস ডেটাফ্রেম টু ফেয়ারনেস ইনডিকেটরস কেস স্টাডি

TensorFlow.org-এ দেখুন Google Colab-এ চালান GitHub এ দেখুন নোটবুক ডাউনলোড করুন

কেস স্টাডি ওভারভিউ

এই ক্ষেত্রে গবেষণায় আমরা প্রয়োগ করা হবে TensorFlow মডেল বিশ্লেষণ এবং ফর্সা সূচক একটি পান্ডাস DataFrame, যেখানে প্রতিটি সারির স্থল সত্য লেবেল, বিভিন্ন বৈশিষ্ট্য রয়েছে, এবং একটি মডেল ভবিষ্যদ্বাণী হিসাবে সংরক্ষিত ডেটা নির্ণয় করা। আমরা দেখাব কিভাবে এই কার্যপ্রবাহটি সম্ভাব্য ন্যায্যতার উদ্বেগগুলি চিহ্নিত করতে ব্যবহার করা যেতে পারে, মডেলটি নির্মাণ এবং প্রশিক্ষণের জন্য ব্যবহৃত কাঠামোর থেকে স্বাধীন। এই কেস স্টাডির মতো, আমরা যেকোন মেশিন লার্নিং ফ্রেমওয়ার্ক (যেমন TensorFlow, JAX, ইত্যাদি) থেকে ফলাফল বিশ্লেষণ করতে পারি একবার সেগুলিকে পান্ডাস ডেটাফ্রেমে রূপান্তর করা হয়।

এই ব্যায়াম জন্য, আমরা লিভারেজ হবে ডীপ নিউরাল নেটওয়ার্ক (DNN) মডেল যে উন্নত ছিল Tensorflow জাফরি সঙ্গে নীতিশাস্ত্র জন্য আকৃতি সীমাবদ্ধতাসমূহ ক্ষেত্রে ল স্কুল প্রবেশিকা কাউন্সিল (LSAC) থেকে ল স্কুল প্রবেশিকা ডেটা সেটটি ব্যবহার গবেষণা। এই ক্লাসিফায়ার তাদের ল স্কুল অ্যাডমিশন টেস্ট (LSAT) স্কোর এবং স্নাতক GPA এর উপর ভিত্তি করে একটি ছাত্র বার পাস করবে কিনা তা ভবিষ্যদ্বাণী করার চেষ্টা করে। এই ক্লাসিফায়ার তাদের LSAT স্কোর এবং স্নাতক GPA এর উপর ভিত্তি করে একটি ছাত্র বার পাস করবে কি না তা ভবিষ্যদ্বাণী করার চেষ্টা করে।

LSAC ডেটাসেট

এই কেস স্টাডি মধ্যে ব্যবহার ডেটা সেটটি মূলত 'নামক একটি অধ্যয়নের জন্য সংগ্রহ করা হয়েছিল 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 মধ্যে।

    • যদি এই মানগুলির মধ্যে একটি পাওয়া না যায় তবে একটি কী-এরর উত্থাপিত হবে।
  • একটি DataFrame ছাড়াও, এছাড়াও আপনি একটি অন্তর্ভুক্ত করতে হবে eval_config যে, উপর ছন্দোবিজ্ঞান গনা টুকরা, এবং উদাহরণ লেবেল ও ভবিষ্যৎবাণী জন্য কলাম নামে গনা মেট্রিক্স অন্তর্ভুক্ত করা উচিত।

    • metrics_specs গনা মেট্রিক্স সেট হবে। FairnessIndicators মেট্রিক সততা মেট্রিক্স রেন্ডার করা প্রয়োজন হবে এবং আপনি অতিরিক্ত ঐচ্ছিক বৈশিষ্ট্যের মান একটি তালিকা দেখতে পারেন এখানে

    • slicing_specs কি বৈশিষ্ট্যটি আপনাকে তদন্ত করতে আগ্রহী হন নির্দিষ্ট করার একটি ঐচ্ছিক slicing প্যারামিটার। এই ক্ষেত্রে অধ্যয়নের মধ্যে race1 ব্যবহার করা হয়, তবে আপনি এই মানটিকে অন্য বৈশিষ্ট্যেও সেট করতে পারেন (উদাহরণস্বরূপ এই ডেটাফ্রেমের প্রসঙ্গে লিঙ্গ)। তাহলে 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)`

ফেয়ারনেস ইন্ডিকেটর দিয়ে মডেল পারফরম্যান্স অন্বেষণ করুন।

ন্যায্যতা সূচকগুলি চালানোর পরে, আমরা আমাদের মডেলের কার্যক্ষমতা বিশ্লেষণ করার জন্য নির্বাচিত বিভিন্ন মেট্রিক্সকে কল্পনা করতে পারি। এই কেস স্টাডির মধ্যে আমরা ন্যায্যতা সূচক অন্তর্ভুক্ত করেছি এবং নির্বিচারে 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.Eval ফলাফল

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

উপসংহার

এই কেস স্টাডির মধ্যে আমরা একটি পান্ডাস ডেটাফ্রেমে একটি ডেটাসেট আমদানি করেছি যা আমরা তারপরে ন্যায্যতা সূচকগুলির সাথে বিশ্লেষণ করেছি। আপনার মডেলের ফলাফল এবং অন্তর্নিহিত ডেটা বোঝা আপনার মডেল ক্ষতিকারক পক্ষপাতকে প্রতিফলিত করে না তা নিশ্চিত করার জন্য একটি গুরুত্বপূর্ণ পদক্ষেপ। এই কেস স্টাডির পরিপ্রেক্ষিতে আমরা LSAC ডেটাসেট পরীক্ষা করেছি এবং কীভাবে এই ডেটা থেকে ভবিষ্যদ্বাণীগুলি ছাত্রদের জাতি দ্বারা প্রভাবিত হতে পারে। শিক্ষা, নিয়োগ এবং মেশিন লার্নিং সহ 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())