דף זה תורגם על ידי Cloud Translation API.
Switch to English

DataFrame פנדה להוגנות מחוונים מקרה

בפעילות זו, למד כיצד להשתמש אינדיקטורים גינות עם פנדה DataFrame.

סקירת מקרה

במחקר במקרה זה אנו נחול TensorFlow ניתוח דגם ו מחווני גינות כדי להעריך את נתון המאוחסנים בתור DataFrame פנדה, שבו כל שורה מכילה תוויות אמת קרקע, תכונות שונות, ואת תחזית מודל. אנו נראים כיצד זרימת עבודה זו יכולה לשמש כדי לזהות חששות גינות פוטנציאל, ללא תלות במסגרת האחד המשמש לבנייה ולאמן את הדגם. כמו מקרה זה, אנחנו יכולים לנתח את התוצאות מכל מסגרת למידת מכונה (למשל TensorFlow, JAX, וכו ') פעם הם מומרים פנדה DataFrame.

בתרגיל הזה, נוכל למנף את הרשת העצבית העמוקה (DNN) מודל שפותח את אילוצי צורה לאתיקה עם Tensorflow סריג מקרה באמצעות במערך קבלת הספר למשפטים ממועצת קבלת הספר למשפטים (LSAC). ניסיונות מסווגים זה לחזות אם תלמיד יעבור הבר, המבוסס על מבחן הקבלה לבתי הספר למשפטים שלהם (של מבחני כניסה) ציון ו GPA ראשון. ניסיונות מסווגים זה לחזות אם תלמיד יעבור הבר, המבוסס על ציון מבחן הכניסה שלהם GPA ראשון.

מערך נתונים LSAC

בסיס הנתונים המשמשים בתוך מקרה זה נאסף במקור עבור מחקר שנקרא ' LSAC הלאומי Longitudinal Study בר Passage. דו"ח מחקר LSAC סדרה 'על ידי לינדה Wightman בשנת 1998. נתון מתארחת כעת כאן .

  • dnn_bar_pass_prediction: התחזית של מבחני הכניסה מהמודל DNN.
  • מין: מין של התלמיד.
  • מבחני כניסה: מבחן כניסת ציון שקבל את התלמיד.
  • pass_bar: תווית אמת קרקע המציינת אם או לא את התלמיד בסופו של דבר עבר הבר.
  • גזע: גזע של התלמיד.
  • ugpa: ממוצע ציונים לתואר ראשון של תלמיד.
 !pip install -q -U \
  tensorflow-model-analysis==0.22.2 \
  tensorflow-data-validation==0.22.1 \
  tfx-bsl==0.22.1 \
  pyarrow==0.16.0

 
ERROR: tensorflow-serving-api 2.2.0 has requirement tensorflow~=2.2.0, but you'll have tensorflow 2.3.0 which is incompatible.
ERROR: tensorflow-transform 0.22.0 has requirement tensorflow!=2.0.*,<2.3,>=1.15, but you'll have tensorflow 2.3.0 which is incompatible.
WARNING: You are using pip version 20.1.1; however, version 20.2 is available.
You should consider upgrading via the '/tmpfs/src/tf_docs_env/bin/python -m pip install --upgrade pip' command.

ייבוא ​​חבילות נדרשו:

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

import tensorflow_model_analysis as tfma
from google.protobuf import text_format

 

הורד את הנתונים ולבחון את הנתונים הראשוניים.

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

אינדיקטורים גינות Configure.

ישנם מספר פרמטרים אשר תצטרך לקחת בחשבון בעת ​​שימוש מחוונים הגינות עם 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: 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.6/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:68: 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%, כלומר המודל שלנו הוא כמעט 4x יותר סיכוי שגוי לנבא כי סטודנט שחור לא יעבור על הבר, מתלמיד whilte. אם היינו ממשיכים עם המאמץ הזה, מתרגלת יכול להשתמש בתוצאות הללו כאיתות כי הם צריכים לבלות יותר זמן על מנת להבטיח כי המודל שלהם עובד היטב עבור אנשים מכל הרקעים.

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

סיכום

בתוך מקרה זה ייבאנו במערך לתוך DataFrame פנדה כי אז ניתחנו עם מחוונים הגינות. הבנת תוצאות המודל שלך שבבסיס נתון היא צעד חשוב בהבטחת המודל שלך איננו משקף הטיה מזיקה. בהקשר של מקרה זה בדקנו את בסיס הנתונים LSAC וכיצד תחזיות מנתונים אלה עשויים להיות מושפעים על ידי גזע סטודנטים. הקונספט של "מה הוגן ומה הוגן הוכנס בדיסציפלינות רבות במשך יותר 50 שנים, כוללים בחינוך, שכירה, וכן למידת מכונה." מחוון הגינות 1 הוא כלי חששות הגינות למתן עזרת המחשב שלך מודל לימודים.

לקבלת מידע נוסף על השימוש מחוונים הגינות ומשאבים כדי ללמוד על יותר דאגות הגינות לראות כאן .


  1. האצ'ינסון, B., מיטשל, M. (2018). 50 שנים של מבחן (Un) גינות: לקחים עבור מכונת למידה. https://arxiv.org/abs/1811.10104

נִספָּח

להלן מספר פונקציות לעזור להמיר דגמי ML כדי פנדה 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())
 
צפה על TensorFlow.org