Google I/O adalah bungkusnya! Ikuti sesi TensorFlow Lihat sesi

Pandas DataFrame to Fairness Indicators Studi Kasus

Lihat di TensorFlow.org Jalankan di Google Colab Lihat di GitHub Unduh buku catatan

Tinjauan Studi Kasus

Dalam studi kasus ini kita akan menerapkan Analisis Model TensorFlow dan Indikator Keadilan untuk mengevaluasi data yang disimpan sebagai Panda DataFrame, di mana setiap baris berisi label kebenaran tanah, berbagai fitur, dan prediksi model yang. Kami akan menunjukkan bagaimana alur kerja ini dapat digunakan untuk menemukan potensi masalah keadilan, terlepas dari kerangka kerja yang digunakan untuk membangun dan melatih model. Seperti dalam studi kasus ini, kita dapat menganalisis hasil dari kerangka pembelajaran mesin apa pun (mis. TensorFlow, JAX, dll.) setelah dikonversi ke Pandas DataFrame.

Untuk latihan ini, kita akan memanfaatkan model Jauh Neural Network (DNN) yang dikembangkan di Kendala Shape Etika dengan Tensorflow Lattice studi kasus menggunakan Penerimaan Law School dataset dari Dewan Law School Admissions (LSAC). Pengklasifikasi ini mencoba memprediksi apakah seorang siswa akan lulus atau tidak, berdasarkan skor Tes Masuk Sekolah Hukum (LSAT) dan IPK sarjana mereka. Pengklasifikasi ini mencoba untuk memprediksi apakah seorang siswa akan lulus atau tidak, berdasarkan skor LSAT dan IPK sarjana mereka.

Kumpulan Data LSAC

Dataset yang digunakan dalam studi kasus ini awalnya dikumpulkan untuk studi yang disebut ' LSAC Nasional Longitudinal Bar Ayat Study. Laporan Penelitian LSAC Series 'oleh Linda Wightman pada tahun 1998. dataset ini sedang diselenggarakan di sini .

  • dnn_bar_pass_prediction: The LSAT prediksi dari model DNN.
  • jenis kelamin: Gender siswa.
  • LSAT: LSAT skor yang diterima oleh siswa.
  • pass_bar: label kebenaran tanah yang menunjukkan apakah atau tidak siswa akhirnya disahkan bar.
  • ras: Ras siswa.
  • ugpa: Sebuah sarjana IPK mahasiswa.
!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

Mengimpor paket yang diperlukan:

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

Unduh data dan jelajahi kumpulan data awal.

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

Konfigurasi Indikator Kewajaran.

Ada beberapa parameter yang harus Anda perhitungkan saat menggunakan Indikator Kewajaran dengan DataFrame

  • DataFrame masukan Anda harus berisi kolom prediksi dan kolom label dari model Anda. Secara default Keadilan Indikator akan mencari kolom prediksi disebut prediction dan kolom label yang disebut label dalam DataFrame Anda.

    • Jika salah satu dari nilai ini tidak ditemukan, KeyError akan dimunculkan.
  • Selain DataFrame, Anda juga harus mencakup eval_config yang harus mencakup metrik untuk menghitung, irisan untuk menghitung metrik pada, dan nama-nama kolom misalnya label dan prediksi.

    • metrics_specs akan mengatur metrik untuk menghitung. The FairnessIndicators metrik akan diminta untuk membuat metrik keadilan dan Anda dapat melihat daftar metrik opsional tambahan di sini .

    • slicing_specs adalah mengiris parameter opsional untuk menentukan apa fitur Anda tertarik dalam menyelidiki. Dalam studi kasus ini race1 digunakan, namun Anda juga dapat menyetel nilai ini ke fitur lain (misalnya gender dalam konteks DataFrame ini). Jika slicing_specs tidak disediakan semua fitur akan disertakan.

    • Jika DataFrame Anda termasuk label atau prediksi kolom yang berbeda dari default prediction atau label , Anda dapat mengkonfigurasi label_key dan prediction_key ke nilai baru.

  • Jika output_path tidak ditentukan direktori sementara akan dibuat.

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

Jelajahi kinerja model dengan Indikator Kewajaran.

Setelah menjalankan Indikator Kewajaran, kami dapat memvisualisasikan berbagai metrik yang kami pilih untuk menganalisis kinerja model kami. Dalam studi kasus ini kami telah menyertakan Indikator Kewajaran dan memilih AUC secara sewenang-wenang.

Saat pertama kali melihat AUC keseluruhan untuk setiap race slice, kami dapat melihat sedikit perbedaan dalam performa model, tetapi tidak ada yang mengkhawatirkan.

  • Asia: 0,58
  • Black: 0,58
  • Hispanik: 0,58
  • Lainnya: 0.64
  • Putih: 0.6

Namun, ketika kami melihat rasio negatif palsu yang dibagi berdasarkan ras, model kami sekali lagi secara salah memprediksi kemungkinan pengguna melewati standar pada nilai yang berbeda dan, kali ini, melakukannya dengan banyak.

  • Asia: 0.01
  • Black: 0.05
  • Hispanik: 0.02
  • Lainnya: 0.01
  • Putih: 0.01

Terutama perbedaan antara siswa Hitam dan Putih adalah sekitar 380%, yang berarti bahwa model kami hampir 4x lebih mungkin untuk salah memprediksi bahwa siswa kulit hitam tidak akan lulus standar, daripada siswa kulit putih. Jika kita melanjutkan upaya ini, seorang praktisi dapat menggunakan hasil ini sebagai sinyal bahwa mereka harus meluangkan lebih banyak waktu untuk memastikan bahwa model mereka bekerja dengan baik untuk orang-orang dari semua latar belakang.

# 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

The eval_result objek, diberikan atas dalam render_fairness_indicator() , memiliki API sendiri yang dapat digunakan untuk membaca hasil TFMA ke dalam program Anda.

get_slice_names() dan get_metric_names()

Untuk mendapatkan irisan dan metrik yang dievaluasi, Anda dapat menggunakan fungsi masing-masing.

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() dan get_metrics_for_all_slices()

Jika Anda ingin mendapatkan metrik untuk sepotong tertentu, Anda dapat menggunakan get_metrics_for_slice() . Ia mengembalikan pemetaan kamus metrik nama ke nilai-nilai metrik .

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

Jika Anda ingin mendapatkan metrik untuk semua irisan, get_metrics_for_all_slices() mengembalikan sebuah pemetaan kamus setiap irisan ke yang sesuai 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} } }

Kesimpulan

Dalam studi kasus ini kami mengimpor kumpulan data ke dalam DataFrame Pandas yang kemudian kami analisis dengan Indikator Kewajaran. Memahami hasil model Anda dan data pokok merupakan langkah penting dalam memastikan model Anda tidak mencerminkan bias yang berbahaya. Dalam konteks studi kasus ini, kami memeriksa kumpulan data LSAC dan bagaimana prediksi dari data ini dapat dipengaruhi oleh perlombaan siswa. Konsep "apa yang tidak adil dan apa yang adil telah diperkenalkan dalam berbagai disiplin ilmu selama lebih dari 50 tahun, termasuk dalam pendidikan, perekrutan, dan pembelajaran mesin." 1 Keadilan Indikator adalah alat kekhawatiran keadilan membantu mengurangi di mesin Anda model pembelajaran.

Untuk informasi lebih lanjut tentang menggunakan Indikator dan sumber daya Keadilan untuk belajar kekhawatiran keadilan lebih lanjut tentang lihat di sini .


  1. Hutchinson, B., Mitchell, M. (2018). 50 Tahun Uji (Tidak)keadilan: Pelajaran untuk Pembelajaran Mesin. https://arxiv.org/abs/1811.10104

Lampiran

Berikut adalah beberapa fungsi untuk membantu mengonversi model ML ke 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())