سوالی دارید؟ در انجمن بازدید از انجمن TensorFlow با انجمن ارتباط برقرار کنید

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

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

این آموزش نشان می دهد که چگونه می توان از کتابخانه TensorFlow Lattice (TFL) برای آموزش مدلهایی استفاده کرد که رفتارهای مسئولانه دارند و برخی از مفروضات اخلاقی یا منصفانه را نقض نمی کنند . به طور خاص ، ما بر استفاده از محدودیت های یکنواختی تمرکز خواهیم کرد تا از مجازات ناعادلانه برخی ویژگی ها جلوگیری کنیم. این آموزش شامل نمایش آزمایشات مقاله Deathological Ethics By Monotonicity Shape Constraints توسط سرنا وانگ و مایا گوپتا است که در AISTATS 2020 منتشر شده است.

ما از برآوردگرهای کنسرو شده TFL در مجموعه داده های عمومی استفاده خواهیم کرد ، اما توجه داشته باشید که همه چیز در این آموزش با مدل های ساخته شده از لایه های TFL Keras نیز قابل انجام است.

قبل از ادامه ، اطمینان حاصل کنید که در زمان اجرا تمام بسته های مورد نیاز نصب شده است (همانطور که در سلول های کد زیر وارد شده است).

برپایی

نصب بسته TF Lattice:

pip install -q tensorflow-lattice seaborn

وارد کردن بسته های مورد نیاز:

import tensorflow as tf

import logging
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
import sys
import tensorflow_lattice as tfl
logging.disable(sys.maxsize)

مقادیر پیش فرض مورد استفاده در این آموزش:

# List of learning rate hyperparameters to try.
# For a longer list of reasonable hyperparameters, try [0.001, 0.01, 0.1].
LEARNING_RATES = [0.01]
# Default number of training epochs and batch sizes.
NUM_EPOCHS = 1000
BATCH_SIZE = 1000
# Directory containing dataset files.
DATA_DIR = 'https://raw.githubusercontent.com/serenalwang/shape_constraints_for_ethics/master'

مطالعه موردی شماره 1: پذیرش دانشکده حقوق

در قسمت اول این آموزش ، ما یک مطالعه موردی را با استفاده از مجموعه داده های پذیرش دانشکده حقوق از شورای پذیرش دانشکده حقوق (LSAC) در نظر خواهیم گرفت. ما یک طبقه بندی کننده را آموزش خواهیم داد تا دانش آموز با استفاده از دو ویژگی نمره LSAT دانشجو و معدل کارشناسی را پیش بینی کند که آیا دانشجو از این نوار عبور می کند یا نه.

فرض کنید از نمره طبقه بندی برای راهنمایی پذیرش دانشکده های حقوق یا بورسیه تحصیلی استفاده شده است. با توجه به هنجارهای اجتماعی مبتنی بر شایستگی ، انتظار داریم دانش آموزان با معدل بالاتر و LSAT بالاتر باید نمره بالاتری از طبقه بندی کننده دریافت کنند. با این حال ، مشاهده خواهیم کرد که برای مدل ها آسان است که این هنجارهای بصری را نقض کنند و گاهی اوقات افراد را به دلیل داشتن نمره GPA یا LSAT بالاتر مجازات می کنند.

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

بارگیری اطلاعات دانشکده حقوق

# Load data file.
law_file_name = 'lsac.csv'
law_file_path = os.path.join(DATA_DIR, law_file_name)
raw_law_df = pd.read_csv(law_file_path, delimiter=',')

مجموعه داده پیش پردازش:

# Define label column name.
LAW_LABEL = 'pass_bar'
def preprocess_law_data(input_df):
  # Drop rows with where the label or features of interest are missing.
  output_df = input_df[~input_df[LAW_LABEL].isna() & ~input_df['ugpa'].isna() &
                       (input_df['ugpa'] > 0) & ~input_df['lsat'].isna()]
  return output_df


law_df = preprocess_law_data(raw_law_df)

داده ها را به مجموعه های قطار / اعتبارسنجی / آزمون تقسیم کنید

def split_dataset(input_df, random_state=888):
  """Splits an input dataset into train, val, and test sets."""
  train_df, test_val_df = train_test_split(
      input_df, test_size=0.3, random_state=random_state)
  val_df, test_df = train_test_split(
      test_val_df, test_size=0.66, random_state=random_state)
  return train_df, val_df, test_df


law_train_df, law_val_df, law_test_df = split_dataset(law_df)

توزیع داده را تجسم کنید

ابتدا توزیع داده ها را تجسم خواهیم کرد. ما نمرات GPA و LSAT را برای تمام دانش آموزانی که از این نوار عبور کرده اند و همچنین برای همه دانش آموزانی که از این نوار عبور نکرده اند رسم خواهیم کرد.

def plot_dataset_contour(input_df, title):
  plt.rcParams['font.family'] = ['serif']
  g = sns.jointplot(
      x='ugpa',
      y='lsat',
      data=input_df,
      kind='kde',
      xlim=[1.4, 4],
      ylim=[0, 50])
  g.plot_joint(plt.scatter, c='b', s=10, linewidth=1, marker='+')
  g.ax_joint.collections[0].set_alpha(0)
  g.set_axis_labels('Undergraduate GPA', 'LSAT score', fontsize=14)
  g.fig.suptitle(title, fontsize=14)
  # Adust plot so that the title fits.
  plt.subplots_adjust(top=0.9)
  plt.show()
law_df_pos = law_df[law_df[LAW_LABEL] == 1]
plot_dataset_contour(
    law_df_pos, title='Distribution of students that passed the bar')

png

law_df_neg = law_df[law_df[LAW_LABEL] == 0]
plot_dataset_contour(
    law_df_neg, title='Distribution of students that failed the bar')

png

برای پیش بینی مقطع امتحان میله ، یک مدل خطی کالیبره شده آموزش دهید

در مرحله بعدی ، ما یک مدل خطی کالیبره شده را از TFL آموزش خواهیم داد تا پیش بینی کند دانش آموز از این میله عبور می کند یا نه. دو ویژگی ورودی نمره LSAT و معدل کارشناسی خواهد بود و برچسب آموزش این است که آیا دانشجو نوار را گذرانده است.

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

توابع یاور برای آموزش یک برآوردگر خطی کالیبره شده TFL

این توابع برای مطالعه موردی دانشکده حقوق و همچنین مطالعه موردی پیش فرض اعتبار در زیر استفاده خواهد شد.

def train_tfl_estimator(train_df, monotonicity, learning_rate, num_epochs,
                        batch_size, get_input_fn,
                        get_feature_columns_and_configs):
  """Trains a TFL calibrated linear estimator.

  Args:
    train_df: pandas dataframe containing training data.
    monotonicity: if 0, then no monotonicity constraints. If 1, then all
      features are constrained to be monotonically increasing.
    learning_rate: learning rate of Adam optimizer for gradient descent.
    num_epochs: number of training epochs.
    batch_size: batch size for each epoch. None means the batch size is the full
      dataset size.
    get_input_fn: function that returns the input_fn for a TF estimator.
    get_feature_columns_and_configs: function that returns TFL feature columns
      and configs.

  Returns:
    estimator: a trained TFL calibrated linear estimator.

  """
  feature_columns, feature_configs = get_feature_columns_and_configs(
      monotonicity)

  model_config = tfl.configs.CalibratedLinearConfig(
      feature_configs=feature_configs, use_bias=False)

  estimator = tfl.estimators.CannedClassifier(
      feature_columns=feature_columns,
      model_config=model_config,
      feature_analysis_input_fn=get_input_fn(input_df=train_df, num_epochs=1),
      optimizer=tf.keras.optimizers.Adam(learning_rate))

  estimator.train(
      input_fn=get_input_fn(
          input_df=train_df, num_epochs=num_epochs, batch_size=batch_size))
  return estimator


def optimize_learning_rates(
    train_df,
    val_df,
    test_df,
    monotonicity,
    learning_rates,
    num_epochs,
    batch_size,
    get_input_fn,
    get_feature_columns_and_configs,
):
  """Optimizes learning rates for TFL estimators.

  Args:
    train_df: pandas dataframe containing training data.
    val_df: pandas dataframe containing validation data.
    test_df: pandas dataframe containing test data.
    monotonicity: if 0, then no monotonicity constraints. If 1, then all
      features are constrained to be monotonically increasing.
    learning_rates: list of learning rates to try.
    num_epochs: number of training epochs.
    batch_size: batch size for each epoch. None means the batch size is the full
      dataset size.
    get_input_fn: function that returns the input_fn for a TF estimator.
    get_feature_columns_and_configs: function that returns TFL feature columns
      and configs.

  Returns:
    A single TFL estimator that achieved the best validation accuracy.
  """
  estimators = []
  train_accuracies = []
  val_accuracies = []
  test_accuracies = []
  for lr in learning_rates:
    estimator = train_tfl_estimator(
        train_df=train_df,
        monotonicity=monotonicity,
        learning_rate=lr,
        num_epochs=num_epochs,
        batch_size=batch_size,
        get_input_fn=get_input_fn,
        get_feature_columns_and_configs=get_feature_columns_and_configs)
    estimators.append(estimator)
    train_acc = estimator.evaluate(
        input_fn=get_input_fn(train_df, num_epochs=1))['accuracy']
    val_acc = estimator.evaluate(
        input_fn=get_input_fn(val_df, num_epochs=1))['accuracy']
    test_acc = estimator.evaluate(
        input_fn=get_input_fn(test_df, num_epochs=1))['accuracy']
    print('accuracies for learning rate %f: train: %f, val: %f, test: %f' %
          (lr, train_acc, val_acc, test_acc))
    train_accuracies.append(train_acc)
    val_accuracies.append(val_acc)
    test_accuracies.append(test_acc)
  max_index = val_accuracies.index(max(val_accuracies))
  return estimators[max_index]

توابع راهنما برای پیکربندی ویژگی های مجموعه داده دانشکده حقوق

این عملکردهای کمکی مخصوص مطالعه موردی دانشکده حقوق است.

def get_input_fn_law(input_df, num_epochs, batch_size=None):
  """Gets TF input_fn for law school models."""
  return tf.compat.v1.estimator.inputs.pandas_input_fn(
      x=input_df[['ugpa', 'lsat']],
      y=input_df['pass_bar'],
      num_epochs=num_epochs,
      batch_size=batch_size or len(input_df),
      shuffle=False)


def get_feature_columns_and_configs_law(monotonicity):
  """Gets TFL feature configs for law school models."""
  feature_columns = [
      tf.feature_column.numeric_column('ugpa'),
      tf.feature_column.numeric_column('lsat'),
  ]
  feature_configs = [
      tfl.configs.FeatureConfig(
          name='ugpa',
          lattice_size=2,
          pwl_calibration_num_keypoints=20,
          monotonicity=monotonicity,
          pwl_calibration_always_monotonic=False),
      tfl.configs.FeatureConfig(
          name='lsat',
          lattice_size=2,
          pwl_calibration_num_keypoints=20,
          monotonicity=monotonicity,
          pwl_calibration_always_monotonic=False),
  ]
  return feature_columns, feature_configs

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

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 plot_model_contour(estimator, input_df, num_keypoints=20):
  x = np.linspace(min(input_df['ugpa']), max(input_df['ugpa']), num_keypoints)
  y = np.linspace(min(input_df['lsat']), max(input_df['lsat']), 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=['ugpa', 'lsat'])
  plot_df[LAW_LABEL] = np.ones(len(plot_df))
  predictions = get_predicted_probabilities(
      estimator=estimator, input_df=plot_df, get_input_fn=get_input_fn_law)
  grid_predictions = np.reshape(predictions, x_grid.shape)

  plt.rcParams['font.family'] = ['serif']
  plt.contour(
      x_grid,
      y_grid,
      grid_predictions,
      colors=('k',),
      levels=np.linspace(0, 1, 11))
  plt.contourf(
      x_grid,
      y_grid,
      grid_predictions,
      cmap=plt.cm.bone,
      levels=np.linspace(0, 1, 11))  # levels=np.linspace(0,1,8));
  plt.xticks(fontsize=20)
  plt.yticks(fontsize=20)

  cbar = plt.colorbar()
  cbar.ax.set_ylabel('Model score', fontsize=20)
  cbar.ax.tick_params(labelsize=20)

  plt.xlabel('Undergraduate GPA', fontsize=20)
  plt.ylabel('LSAT score', fontsize=20)

مدل خطی کالیبره شده غیر محدود (غیر یکنواخت) را آموزش دهید

nomon_linear_estimator = optimize_learning_rates(
    train_df=law_train_df,
    val_df=law_val_df,
    test_df=law_test_df,
    monotonicity=0,
    learning_rates=LEARNING_RATES,
    batch_size=BATCH_SIZE,
    num_epochs=NUM_EPOCHS,
    get_input_fn=get_input_fn_law,
    get_feature_columns_and_configs=get_feature_columns_and_configs_law)
accuracies for learning rate 0.010000: train: 0.949061, val: 0.945876, test: 0.951781
plot_model_contour(nomon_linear_estimator, input_df=law_df)

png

آموزش مدل خطی کالیبره شده یکنواخت

mon_linear_estimator = optimize_learning_rates(
    train_df=law_train_df,
    val_df=law_val_df,
    test_df=law_test_df,
    monotonicity=1,
    learning_rates=LEARNING_RATES,
    batch_size=BATCH_SIZE,
    num_epochs=NUM_EPOCHS,
    get_input_fn=get_input_fn_law,
    get_feature_columns_and_configs=get_feature_columns_and_configs_law)
accuracies for learning rate 0.010000: train: 0.949249, val: 0.945447, test: 0.951781
plot_model_contour(mon_linear_estimator, input_df=law_df)

png

سایر مدل های غیرقانونی را آموزش دهید

ما نشان دادیم که مدلهای خطی کالیبره شده TFL را می توان آموزش داد که در هر دو نمره LSAT و GPA یکنواخت باشند بدون اینکه از دقت بسیار بالایی برخوردار باشند.

اما ، چگونه مدل خطی کالیبره شده با انواع دیگر مدل ها ، مانند شبکه های عصبی عمیق (DNN) یا درختان شیب دار تقویت شده (GBT) مقایسه می شود؟ آیا به نظر می رسد DNN و GBT خروجی نسبتاً منصفانه ای دارند؟ برای پرداختن به این سوال ، ما در مرحله بعدی DNN و GBT بدون محدودیت را آموزش خواهیم داد. در حقیقت ، مشاهده خواهیم کرد که DNN و GBT به راحتی یکنواختی نمره LSAT و معدل کارشناسی را نقض می کنند.

یک مدل شبکه عصبی عمیق (DNN) بدون محدودیت را آموزش دهید

این معماری قبلاً برای دستیابی به دقت اعتبار بالا بهینه سازی شده بود.

feature_names = ['ugpa', 'lsat']

dnn_estimator = tf.estimator.DNNClassifier(
    feature_columns=[
        tf.feature_column.numeric_column(feature) for feature in feature_names
    ],
    hidden_units=[100, 100],
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.008),
    activation_fn=tf.nn.relu)

dnn_estimator.train(
    input_fn=get_input_fn_law(
        law_train_df, batch_size=BATCH_SIZE, num_epochs=NUM_EPOCHS))
dnn_train_acc = dnn_estimator.evaluate(
    input_fn=get_input_fn_law(law_train_df, num_epochs=1))['accuracy']
dnn_val_acc = dnn_estimator.evaluate(
    input_fn=get_input_fn_law(law_val_df, num_epochs=1))['accuracy']
dnn_test_acc = dnn_estimator.evaluate(
    input_fn=get_input_fn_law(law_test_df, num_epochs=1))['accuracy']
print('accuracies for DNN: train: %f, val: %f, test: %f' %
      (dnn_train_acc, dnn_val_acc, dnn_test_acc))
accuracies for DNN: train: 0.949124, val: 0.946735, test: 0.952002
plot_model_contour(dnn_estimator, input_df=law_df)

png

یک مدل بدون محدودیت Gradient Boosted Trees (GBT) را آموزش دهید

ساختار درخت قبلاً برای دستیابی به دقت اعتبار بالا بهینه سازی شده بود.

tree_estimator = tf.estimator.BoostedTreesClassifier(
    feature_columns=[
        tf.feature_column.numeric_column(feature) for feature in feature_names
    ],
    n_batches_per_layer=2,
    n_trees=20,
    max_depth=4)

tree_estimator.train(
    input_fn=get_input_fn_law(
        law_train_df, num_epochs=NUM_EPOCHS, batch_size=BATCH_SIZE))
tree_train_acc = tree_estimator.evaluate(
    input_fn=get_input_fn_law(law_train_df, num_epochs=1))['accuracy']
tree_val_acc = tree_estimator.evaluate(
    input_fn=get_input_fn_law(law_val_df, num_epochs=1))['accuracy']
tree_test_acc = tree_estimator.evaluate(
    input_fn=get_input_fn_law(law_test_df, num_epochs=1))['accuracy']
print('accuracies for GBT: train: %f, val: %f, test: %f' %
      (tree_train_acc, tree_val_acc, tree_test_acc))
accuracies for GBT: train: 0.949249, val: 0.945017, test: 0.950896
plot_model_contour(tree_estimator, input_df=law_df)

png

مطالعه موردی شماره 2: پیش فرض اعتبار

مورد دوم موردی که در این آموزش بررسی خواهیم کرد پیش بینی احتمال پیش فرض اعتبار یک فرد است. ما از مجموعه داده مشتری پیش فرض کارت اعتباری از مخزن UCI استفاده خواهیم کرد. این داده ها از 30،000 کاربر کارت اعتباری تایوانی جمع آوری شده است و حاوی یک برچسب باینری است که آیا یک کاربر در یک پنجره زمانی ، پیش فرض پرداخت را انجام نداده است یا خیر. این ویژگی ها شامل وضعیت تأهل ، جنسیت ، تحصیلات و مدت زمان تأخیر کاربر در پرداخت قبض های موجود خود برای هر یک از ماه های آوریل تا سپتامبر 2005 است.

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

داده پیش فرض اعتبار را بارگیری کنید

# Load data file.
credit_file_name = 'credit_default.csv'
credit_file_path = os.path.join(DATA_DIR, credit_file_name)
credit_df = pd.read_csv(credit_file_path, delimiter=',')
# Define label column name.
CREDIT_LABEL = 'default'

داده ها را به مجموعه های قطار / اعتبارسنجی / آزمون تقسیم کنید

credit_train_df, credit_val_df, credit_test_df = split_dataset(credit_df)

توزیع داده را تجسم کنید

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

def get_agg_data(df, x_col, y_col, bins=11):
  xbins = pd.cut(df[x_col], bins=bins)
  data = df[[x_col, y_col]].groupby(xbins).agg(['mean', 'sem'])
  return data


def plot_2d_means_credit(input_df, x_col, y_col, x_label, y_label):
  plt.rcParams['font.family'] = ['serif']
  _, ax = plt.subplots(nrows=1, ncols=1)
  plt.setp(ax.spines.values(), color='black', linewidth=1)
  ax.tick_params(
      direction='in', length=6, width=1, top=False, right=False, labelsize=18)
  df_single = get_agg_data(input_df[input_df['MARRIAGE'] == 1], x_col, y_col)
  df_married = get_agg_data(input_df[input_df['MARRIAGE'] == 2], x_col, y_col)
  ax.errorbar(
      df_single[(x_col, 'mean')],
      df_single[(y_col, 'mean')],
      xerr=df_single[(x_col, 'sem')],
      yerr=df_single[(y_col, 'sem')],
      color='orange',
      marker='s',
      capsize=3,
      capthick=1,
      label='Single',
      markersize=10,
      linestyle='')
  ax.errorbar(
      df_married[(x_col, 'mean')],
      df_married[(y_col, 'mean')],
      xerr=df_married[(x_col, 'sem')],
      yerr=df_married[(y_col, 'sem')],
      color='b',
      marker='^',
      capsize=3,
      capthick=1,
      label='Married',
      markersize=10,
      linestyle='')
  leg = ax.legend(loc='upper left', fontsize=18, frameon=True, numpoints=1)
  ax.set_xlabel(x_label, fontsize=18)
  ax.set_ylabel(y_label, fontsize=18)
  ax.set_ylim(0, 1.1)
  ax.set_xlim(-2, 8.5)
  ax.patch.set_facecolor('white')
  leg.get_frame().set_edgecolor('black')
  leg.get_frame().set_facecolor('white')
  leg.get_frame().set_linewidth(1)
  plt.show()
plot_2d_means_credit(credit_train_df, 'PAY_0', 'default',
                     'Repayment Status (April)', 'Observed default rate')

png

برای پیش بینی نرخ پیش فرض اعتبار ، یک مدل خطی کالیبره شده آموزش دهید

در مرحله بعدی ، ما یک مدل خطی کالیبره شده از TFL را آموزش خواهیم داد تا پیش بینی کند که آیا یک شخص پیش پرداخت وام را می کند یا نه. دو ویژگی ورودی وضعیت تأهل فرد و چند ماه شخص در بازپرداخت وامهای خود در ماه آوریل است (وضعیت بازپرداخت). برچسب آموزش این خواهد بود که آیا فرد از وام خود کوتاهی کرده است یا خیر.

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

توابع راهنما برای پیکربندی ویژگیهای مجموعه داده پیش فرض اعتبار

این توابع کمکی مخصوص مطالعه موردی پیش فرض اعتبار است.

def get_input_fn_credit(input_df, num_epochs, batch_size=None):
  """Gets TF input_fn for credit default models."""
  return tf.compat.v1.estimator.inputs.pandas_input_fn(
      x=input_df[['MARRIAGE', 'PAY_0']],
      y=input_df['default'],
      num_epochs=num_epochs,
      batch_size=batch_size or len(input_df),
      shuffle=False)


def get_feature_columns_and_configs_credit(monotonicity):
  """Gets TFL feature configs for credit default models."""
  feature_columns = [
      tf.feature_column.numeric_column('MARRIAGE'),
      tf.feature_column.numeric_column('PAY_0'),
  ]
  feature_configs = [
      tfl.configs.FeatureConfig(
          name='MARRIAGE',
          lattice_size=2,
          pwl_calibration_num_keypoints=3,
          monotonicity=monotonicity,
          pwl_calibration_always_monotonic=False),
      tfl.configs.FeatureConfig(
          name='PAY_0',
          lattice_size=2,
          pwl_calibration_num_keypoints=10,
          monotonicity=monotonicity,
          pwl_calibration_always_monotonic=False),
  ]
  return feature_columns, feature_configs

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

def plot_predictions_credit(input_df,
                            estimator,
                            x_col,
                            x_label='Repayment Status (April)',
                            y_label='Predicted default probability'):
  predictions = get_predicted_probabilities(
      estimator=estimator, input_df=input_df, get_input_fn=get_input_fn_credit)
  new_df = input_df.copy()
  new_df.loc[:, 'predictions'] = predictions
  plot_2d_means_credit(new_df, x_col, 'predictions', x_label, y_label)

مدل خطی کالیبره شده غیر محدود (غیر یکنواخت) را آموزش دهید

nomon_linear_estimator = optimize_learning_rates(
    train_df=credit_train_df,
    val_df=credit_val_df,
    test_df=credit_test_df,
    monotonicity=0,
    learning_rates=LEARNING_RATES,
    batch_size=BATCH_SIZE,
    num_epochs=NUM_EPOCHS,
    get_input_fn=get_input_fn_credit,
    get_feature_columns_and_configs=get_feature_columns_and_configs_credit)
accuracies for learning rate 0.010000: train: 0.818762, val: 0.830065, test: 0.817172
plot_predictions_credit(credit_train_df, nomon_linear_estimator, 'PAY_0')

png

آموزش مدل خطی کالیبره شده یکنواخت

mon_linear_estimator = optimize_learning_rates(
    train_df=credit_train_df,
    val_df=credit_val_df,
    test_df=credit_test_df,
    monotonicity=1,
    learning_rates=LEARNING_RATES,
    batch_size=BATCH_SIZE,
    num_epochs=NUM_EPOCHS,
    get_input_fn=get_input_fn_credit,
    get_feature_columns_and_configs=get_feature_columns_and_configs_credit)
accuracies for learning rate 0.010000: train: 0.818762, val: 0.830065, test: 0.817172
plot_predictions_credit(credit_train_df, mon_linear_estimator, 'PAY_0')

png