آماده سازی داده های MinDiff

معرفی

هنگام پیاده‌سازی MinDiff، باید تصمیمات پیچیده‌ای اتخاذ کنید و ورودی‌های خود را قبل از انتقال به مدل شکل دهید. این تصمیمات تا حد زیادی رفتار MinDiff را در مدل شما تعیین می کند.

این راهنما جنبه‌های فنی این فرآیند را پوشش می‌دهد، اما در مورد چگونگی ارزیابی یک مدل برای انصاف، یا چگونگی شناسایی برش‌ها و معیارهای خاص برای ارزیابی بحث نمی‌کند. لطفا دیدن هدایت انصاف شاخص برای جزئیات بیشتر در این.

برای نشان دادن MinDiff، این راهنمای استفاده از مجموعه داده درآمد UCI . وظیفه مدل پیش بینی اینکه آیا یک فرد درآمدی بیش از 50 هزار دلار دارد، بر اساس ویژگی های شخصی مختلف است. این راهنما فرض یک شکاف مشکل ساز در FNR (نرخ منفی کاذب) بین وجود دارد "Male" و "Female" برش و صاحب مدل (شما) تصمیم گرفته است به درخواست MinDiff برای پرداختن به موضوع. برای کسب اطلاعات بیشتر در حالات که در آن ممکن است انتخاب کنید به درخواست MinDiff، را ببینید صفحه مورد نیاز .

MinDiff با جریمه کردن تفاوت در امتیازات توزیع بین نمونه ها در دو مجموعه داده کار می کند. این راهنما نحوه انتخاب و ساخت این مجموعه‌های MinDiff اضافی و همچنین نحوه بسته‌بندی همه چیز را با هم نشان می‌دهد تا بتوان آن را به یک مدل برای آموزش منتقل کرد.

برپایی

pip install -q --upgrade tensorflow-model-remediation
import tensorflow as tf
from tensorflow_model_remediation import min_diff
from tensorflow_model_remediation.tools.tutorials_utils import uci as tutorials_utils

داده های اصلی

برای اهداف نمایشی و کاهش زمان اجرا، این راهنما فقط از بخش نمونه ای از مجموعه داده درآمد UCI استفاده می کند. در یک محیط تولید واقعی، از مجموعه داده کامل استفاده می شود.

# Sampled at 0.3 for reduced runtimes.
train = tutorials_utils.get_uci_data(split='train', sample=0.3)

print(len(train), 'train examples')
9768 train examples

در حال تبدیل به tf.data.Dataset

MinDiffModel مستلزم آن است که ورودی یک tf.data.Dataset . اگر قبل از ادغام MinDiff از فرمت دیگری از ورودی استفاده می کردید، باید داده های ورودی خود را تبدیل کنید.

استفاده از tf.data.Dataset.from_tensor_slices برای تبدیل به tf.data.Dataset .

dataset = tf.data.Dataset.from_tensor_slices((x, y, weights))
dataset.shuffle(...)  # Optional.
dataset.batch(batch_size)

مشاهده Model.fit اسناد و مدارک برای جزئیات بیشتر در مورد معادل بین دو روش از ورودی است.

در این راهنما، ورودی به عنوان یک Pandas DataFrame دانلود می شود و بنابراین، به این تبدیل نیاز دارد.

# Function to convert a DataFrame into a tf.data.Dataset.
def df_to_dataset(dataframe, shuffle=True):
  dataframe = dataframe.copy()
  labels = dataframe.pop('target')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=5000)  # Reasonable but arbitrary buffer_size.
  return ds

# Convert the train DataFrame into a Dataset.
original_train_ds = df_to_dataset(train)

ایجاد داده های MinDiff

در طول آموزش، MinDiff مدل را تشویق می‌کند تا تفاوت‌ها در پیش‌بینی‌ها بین دو مجموعه داده اضافی (که ممکن است شامل نمونه‌هایی از مجموعه داده اصلی باشد) را کاهش دهد. انتخاب این دو مجموعه داده تصمیم کلیدی است که تأثیر MinDiff بر مدل را تعیین می کند.

دو مجموعه داده باید به گونه ای انتخاب شوند که تفاوت عملکردی که شما سعی در رفع آن دارید مشهود و به خوبی نشان داده شود. از آنجا که هدف این است که به منظور کاهش شکاف در FNR بین "Male" و "Female" برش، این به معنای ایجاد یک مجموعه داده با تنها مثبت برچسب "Male" نمونه و دیگری با تنها مثبت برچسب "Female" نمونه؛ اینها مجموعه داده های MinDiff خواهند بود.

ابتدا داده های موجود را بررسی کنید.

female_pos = train[(train['sex'] == ' Female') & (train['target'] == 1)]
male_pos = train[(train['sex'] == ' Male') & (train['target'] == 1)]
print(len(female_pos), 'positively labeled female examples')
print(len(male_pos), 'positively labeled male examples')
385 positively labeled female examples
2063 positively labeled male examples

ایجاد مجموعه داده های MinDiff از زیر مجموعه های مجموعه داده اصلی کاملاً قابل قبول است.

در حالی که 5000 یا مثبت تر وجود ندارد "Male" به عنوان نمونه در توصیه می شود راهنمایی مورد نیاز ، بیش از 2000 وجود دارد و آن معقول است که سعی کنید با که بسیاری از قبل از جمع آوری داده های بیشتر.

min_diff_male_ds = df_to_dataset(male_pos)

مثبت "Female" نمونه، با این حال، کمیاب از حد در 385. این است که احتمالا برای عملکرد خوب بیش از حد کوچک و غیره نیاز به کشیدن در نمونه های دیگری.

full_uci_train = tutorials_utils.get_uci_data(split='train')
augmented_female_pos = full_uci_train[((full_uci_train['sex'] == ' Female') &
                                       (full_uci_train['target'] == 1))]
print(len(augmented_female_pos), 'positively labeled female examples')
1179 positively labeled female examples

استفاده از مجموعه داده کامل، تعداد نمونه هایی را که می توان برای MinDiff استفاده کرد، بیش از سه برابر کرده است. هنوز هم کم است اما کافی است به عنوان پاس اول تلاش کنید.

min_diff_female_ds = df_to_dataset(augmented_female_pos)

هر دو مجموعه داده MinDiff به طور قابل توجهی کوچکتر از 5000 نمونه یا بیشتر توصیه شده هستند. در حالی که منطقی است که سعی کنید MinDiff را با داده های فعلی اعمال کنید، ممکن است لازم باشد در صورت مشاهده عملکرد ضعیف یا بیش از حد در طول تمرین، جمع آوری داده های اضافی را در نظر بگیرید.

با استفاده از tf.data.Dataset.filter

متناوبا، شما می توانید دو مجموعه داده MinDiff به طور مستقیم از اصلی تبدیل ایجاد Dataset .

# Male
def male_predicate(x, y):
  return tf.equal(x['sex'], b' Male') and tf.equal(y, 0)

alternate_min_diff_male_ds = original_train_ds.filter(male_predicate).cache()

# Female
def female_predicate(x, y):
  return tf.equal(x['sex'], b' Female') and tf.equal(y, 0)

full_uci_train_ds = df_to_dataset(full_uci_train)
alternate_min_diff_female_ds = full_uci_train_ds.filter(female_predicate).cache()

در نتیجه alternate_min_diff_male_ds و alternate_min_diff_female_ds معادل در خروجی خواهد بود تا min_diff_male_ds و min_diff_female_ds است.

ساخت مجموعه داده آموزشی شما

به عنوان آخرین مرحله، سه مجموعه داده (دو مجموعه جدید ایجاد شده و اصلی) باید در یک مجموعه داده واحد ادغام شوند که می تواند به مدل منتقل شود.

دسته بندی مجموعه داده ها

قبل از ادغام، مجموعه داده ها باید دسته بندی شوند.

  • مجموعه داده اصلی می تواند از همان دسته بندی استفاده کند که قبل از ادغام MinDiff استفاده می شد.
  • مجموعه داده های MinDiff نیازی به داشتن اندازه دسته ای یکسان با مجموعه داده اصلی ندارند. به احتمال زیاد، یک کوچکتر به همان اندازه خوب عمل خواهد کرد. در حالی که آنها حتی نیازی به داشتن اندازه دسته ای یکسان با یکدیگر ندارند، توصیه می شود این کار را برای بهترین عملکرد انجام دهید.

در حالی که به شدت لازم است، آن را به استفاده توصیه می شود drop_remainder=True برای دو مجموعه داده MinDiff این اطمینان خواهد داد که آنها اندازه دسته ای سازگار است.

original_train_ds = original_train_ds.batch(128)  # Same as before MinDiff.

# The MinDiff datasets can have a different batch_size from original_train_ds
min_diff_female_ds = min_diff_female_ds.batch(32, drop_remainder=True)
# Ideally we use the same batch size for both MinDiff datasets.
min_diff_male_ds = min_diff_male_ds.batch(32, drop_remainder=True)

بسته بندی مجموعه داده با pack_min_diff_data

هنگامی که مجموعه داده ها آماده شدند، آنها را در یک مجموعه داده واحد بسته بندی کنید که سپس به مدل منتقل می شود. یک دسته از مجموعه داده به دست آمده شامل یک دسته از هر یک از سه مجموعه داده ای است که قبلا تهیه کرده اید.

شما می توانید این را با استفاده از ارائه انجام utils تابع در tensorflow_model_remediation بسته:

train_with_min_diff_ds = min_diff.keras.utils.pack_min_diff_data(
    original_dataset=original_train_ds,
    sensitive_group_dataset=min_diff_female_ds,
    nonsensitive_group_dataset=min_diff_male_ds)

و بس! شما قادر به استفاده از دیگر خواهد بود util توابع در بسته به دسته های فردی باز کردن در صورت نیاز.

for inputs, original_labels in train_with_min_diff_ds.take(1):
  # Unpacking min_diff_data
  min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
  min_diff_examples, min_diff_membership = min_diff_data
  # Unpacking original data
  original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)

با داده های تازه تشکیل شده خود، اکنون آماده اعمال MinDiff در مدل خود هستید! برای یادگیری نحوه این کار انجام شود، لطفا نگاهی به راهنماهای دیگر شروع با ادغام MinDiff با MinDiffModel .

استفاده از قالب بسته بندی سفارشی (اختیاری)

ممکن است تصمیم بگیرید که سه مجموعه داده را به هر شکلی که انتخاب می کنید، با هم بسته بندی کنید. تنها شرط لازم این است که باید اطمینان حاصل کنید که مدل می داند چگونه داده ها را تفسیر کند. پیاده سازی پیش فرض از MinDiffModel فرض می شود که داده ها با استفاده بسته بندی شده بود min_diff.keras.utils.pack_min_diff_data .

یک راه آسان برای فرمت های ورودی خود را به عنوان شما می خواهید برای تبدیل داده ها به عنوان یک گام نهایی پس از شما استفاده کرده اند min_diff.keras.utils.pack_min_diff_data .

# Reformat input to be a dict.
def _reformat_input(inputs, original_labels):
  unpacked_min_diff_data = min_diff.keras.utils.unpack_min_diff_data(inputs)
  unpacked_original_inputs = min_diff.keras.utils.unpack_original_inputs(inputs)

  return {
      'min_diff_data': unpacked_min_diff_data,
      'original_data': (unpacked_original_inputs, original_labels)}

customized_train_with_min_diff_ds = train_with_min_diff_ds.map(_reformat_input)

مدل شما باید بدانید که چگونه به خواندن این ورودی سفارشی به عنوان دقیق در راهنمای سفارشی MinDiffModel .

for batch in customized_train_with_min_diff_ds.take(1):
  # Customized unpacking of min_diff_data
  min_diff_data = batch['min_diff_data']
  # Customized unpacking of original_data
  original_data = batch['original_data']

منابع اضافی

این راهنما فرآیند و تصمیم‌گیری را که می‌توانید در زمان استفاده از MinDiff دنبال کنید، تشریح می‌کند. بقیه راهنماها بر اساس این چارچوب هستند. برای سهولت این کار، منطق موجود در این راهنما در توابع کمکی لحاظ شده است:

  • get_uci_data : این تابع در حال حاضر در این راهنمای استفاده می شود. این گرداند DataFrame حاوی اطلاعات درآمد UCI از تقسیم نشان نمونه در هر نرخ نشان داده شده است (100٪ اگر نا مشخص).
  • df_to_dataset : این تابع یک تبدیل DataFrame به یک tf.data.Dataset آنچه در این راهنما با قابلیت های اضافه شده که قادر به عبور از batch_size به عنوان یک پارامتر های دقیق.
  • get_uci_with_min_diff_dataset : بازده این تابع یک tf.data.Dataset حاوی هر دو داده های اصلی و داده MinDiff بسته بندی شده هم با استفاده از بازسازی کتابخانه مدل برنامه زمانی توابع آنچه در این راهنما توضیح داده شد.

بقیه راهنماها از این موارد برای نشان دادن نحوه استفاده از سایر بخش‌های کتابخانه ساخته می‌شوند.