ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
ภาพรวมกรณีศึกษา
ในกรณีศึกษานี้เราจะใช้ TensorFlow รูปแบบการวิเคราะห์ และ ความเป็นธรรมตัวชี้วัด ในการประเมินข้อมูลที่เก็บไว้เป็นนุ่น DataFrame ที่แต่ละแถวมีป้ายชื่อจริงพื้นดินคุณสมบัติต่างๆและการทำนายรูปแบบ เราจะแสดงให้เห็นว่าเวิร์กโฟลว์นี้สามารถนำมาใช้เพื่อระบุข้อกังวลด้านความเป็นธรรมที่อาจเกิดขึ้นได้อย่างไร โดยไม่ขึ้นกับกรอบการทำงานที่ใช้ในการสร้างและฝึกอบรมแบบจำลอง ในกรณีศึกษานี้ เราสามารถวิเคราะห์ผลลัพธ์จากเฟรมเวิร์กการเรียนรู้ของเครื่องใดๆ (เช่น TensorFlow, JAX ฯลฯ) เมื่อมันถูกแปลงเป็น Pandas DataFrame
สำหรับการออกกำลังกายนี้เราจะยกระดับความลึกโครงข่ายประสาทเทียม (DNN) รูปแบบที่ได้รับการพัฒนาใน ข้อ จำกัด รูปร่างจริยธรรมกับ Tensorflow Lattice กรณีศึกษาโดยใช้ชุดข้อมูลที่รับเข้าเรียนโรงเรียนกฎหมายจากการรับสมัครโรงเรียนกฎหมายสภา (LSAC) ลักษณนามนี้พยายามที่จะทำนายว่านักเรียนจะผ่านเกณฑ์หรือไม่ โดยพิจารณาจากคะแนนการทดสอบการรับเข้าศึกษาในโรงเรียนกฎหมาย (LSAT) และเกรดเฉลี่ยในระดับปริญญาตรี ลักษณนามนี้พยายามที่จะทำนายว่านักเรียนจะผ่านเกณฑ์หรือไม่ โดยพิจารณาจากคะแนน LSAT และเกรดเฉลี่ยในระดับปริญญาตรี
ชุดข้อมูล LSAC
ชุดที่ใช้ในกรณีศึกษานี้ถูกเก็บรวบรวมมาเพื่อการศึกษาที่เรียกว่า ' LSAC แห่งชาติระยะยาวบาร์ศึกษา Passage LSAC วิจัยรายงานซีรีส์ 'โดยลินดาไวท์แมนในปี 1998 ชุดข้อมูลที่จะเป็นเจ้าภาพในปัจจุบัน ที่นี่
- dnn_bar_pass_prediction: ทำนายโหลดจากรูปแบบ DNN
- เพศ: เพศของนักเรียน
- 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()
กำหนดค่าตัวบ่งชี้ความเป็นธรรม
มีพารามิเตอร์หลายอย่างที่คุณต้องพิจารณาเมื่อใช้ตัวบ่งชี้ความเป็นธรรมกับ 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)`
สำรวจประสิทธิภาพของแบบจำลองด้วยตัวบ่งชี้ความเป็นธรรม
หลังจากเรียกใช้ตัวบ่งชี้ความเป็นธรรม เราจะเห็นภาพเมตริกต่างๆ ที่เราเลือกเพื่อวิเคราะห์ประสิทธิภาพของแบบจำลองของเรา ในกรณีศึกษานี้ เราได้รวมตัวบ่งชี้ความเป็นธรรมและเลือก 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 ความเป็นธรรมดัชนีเป็นเครื่องมือในการกังวลช่วยลดความเป็นธรรมในการเรียนรู้แบบเครื่องของคุณ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ตัวชี้วัดความเป็นธรรมและทรัพยากรที่จะเรียนรู้เพิ่มเติมเกี่ยวกับความกังวลความเป็นธรรมเห็น ที่นี่
- Hutchinson, B., Mitchell, M. (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())