MinDiff ডেটা প্রস্তুতি

ভূমিকা

MinDiff বাস্তবায়ন করার সময়, আপনাকে মডেলে দেওয়ার আগে আপনার ইনপুট বেছে নেওয়ার এবং আকার দেওয়ার মতো জটিল সিদ্ধান্ত নিতে হবে। এই সিদ্ধান্তগুলি মূলত আপনার মডেলের মধ্যে MinDiff-এর আচরণ নির্ধারণ করবে।

এই নির্দেশিকাটি এই প্রক্রিয়াটির প্রযুক্তিগত দিকগুলিকে কভার করবে, তবে ন্যায্যতার জন্য একটি মডেলকে কীভাবে মূল্যায়ন করা যায়, বা মূল্যায়নের জন্য নির্দিষ্ট স্লাইস এবং মেট্রিকগুলি কীভাবে সনাক্ত করা যায় তা নিয়ে আলোচনা করবে না। দয়া করে দেখতে ফর্সা সূচক নির্দেশিকা এই বিস্তারিত জানার জন্য।

MinDiff প্রদর্শন করার জন্য, এই সহায়িকার ব্যবহার UCI আয় ডেটা সেটটি । মডেল টাস্ক হল ভবিষ্যদ্বাণী করা যে একজন ব্যক্তির আয় $50k এর বেশি, বিভিন্ন ব্যক্তিগত বৈশিষ্ট্যের উপর ভিত্তি করে। এই নির্দেশিকাটি অনুমান 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 ইনপুটের দুটি পদ্ধতির মধ্যে equivalences বিস্তারিত ডকুমেন্টেশন।

এই নির্দেশিকায়, ইনপুটটি একটি পান্ডাস ডেটাফ্রেম হিসাবে ডাউনলোড করা হয়েছে এবং তাই এই রূপান্তরের প্রয়োজন।

# 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 ডেটাসেট তৈরি করা সম্পূর্ণরূপে গ্রহণযোগ্য।

যদিও সেখানে 5,000 অথবা তার বেশি ইতিবাচক নয় "Male" উদাহরণ হিসেবে সুপারিশ করা প্রয়োজনীয়তা নির্দেশিকা , ওইখানে 2,000 এবং এটি আরো ডেটা সংগ্রহ করার আগে যে অনেক সঙ্গে চেষ্টা করতে যুক্তিসঙ্গত।

min_diff_male_ds = df_to_dataset(male_pos)

ইতিবাচক "Female" উদাহরণ অবশ্য অনেক scarcer 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 ডেটাসেট প্রস্তাবিত 5,000 বা তার বেশি উদাহরণের চেয়ে উল্লেখযোগ্যভাবে ছোট। যদিও বর্তমান ডেটার সাথে 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 প্রয়োগ করতে প্রস্তুত! কিভাবে এই কাজ করা হয় জানতে, দয়া করে দিয়ে শুরু অন্যান্য সহায়িকার কটাক্ষপাত করা MinDiffModel সঙ্গে MinDiff একীভূত

একটি কাস্টম প্যাকিং বিন্যাস ব্যবহার করা (ঐচ্ছিক)

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

লাইব্রেরির অন্যান্য অংশগুলি কীভাবে ব্যবহার করতে হয় তা দেখানোর জন্য বাকি গাইডগুলি এগুলি থেকে তৈরি করবে।