TFラティスカスタム推定量

概要

カスタム推定器を使用して、TFLレイヤーを使用して任意の単調モデルを作成できます。このガイドでは、このような見積もりを作成するために必要な手順の概要を説明します。

設定

TF Latticeパッケージのインストール:

pip install tensorflow-lattice

必要なパッケージのインポート:

import tensorflow as tf

import logging
import numpy as np
import pandas as pd
import sys
import tensorflow_lattice as tfl
from tensorflow import feature_column as fc

from tensorflow_estimator.python.estimator.canned import optimizers
from tensorflow_estimator.python.estimator.head import binary_class_head
logging
.disable(sys.maxsize)

UCI Statlog(Heart)データセットのダウンロード:

csv_file = tf.keras.utils.get_file(
   
'heart.csv', 'http://storage.googleapis.com/download.tensorflow.org/data/heart.csv')
df
= pd.read_csv(csv_file)
target
= df.pop('target')
train_size
= int(len(df) * 0.8)
train_x
= df[:train_size]
train_y
= target[:train_size]
test_x
= df[train_size:]
test_y
= target[train_size:]
df
.head()

このガイドのトレーニングに使用されるデフォルト値の設定:

LEARNING_RATE = 0.1
BATCH_SIZE
= 128
NUM_EPOCHS
= 1000

特徴列

他のTF推定用として、データはinput_fnを介して、典型的であり、使用して解析された推定器に渡される必要がFeatureColumnsを

# Feature columns.
# - age
# - sex
# - ca        number of major vessels (0-3) colored by flourosopy
# - thal      3 = normal; 6 = fixed defect; 7 = reversable defect
feature_columns
= [
    fc
.numeric_column('age', default_value=-1),
    fc
.categorical_column_with_vocabulary_list('sex', [0, 1]),
    fc
.numeric_column('ca'),
    fc
.categorical_column_with_vocabulary_list(
       
'thal', ['normal', 'fixed', 'reversible']),
]

以来、カテゴリの特徴は、高密度の機能欄でラップする必要がないことを注意tfl.laysers.CategoricalCalibration層が直接カテゴリインデックスを消費することができます。

input_fnの作成

他の推定量と同様に、input_fnを使用して、トレーニングと評価のためにデータをモデルにフィードできます。

train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn(
    x
=train_x,
    y
=train_y,
    shuffle
=True,
    batch_size
=BATCH_SIZE,
    num_epochs
=NUM_EPOCHS,
    num_threads
=1)

test_input_fn
= tf.compat.v1.estimator.inputs.pandas_input_fn(
    x
=test_x,
    y
=test_y,
    shuffle
=False,
    batch_size
=BATCH_SIZE,
    num_epochs
=1,
    num_threads
=1)

model_fnの作成

カスタム推定器を作成する方法はいくつかあります。ここでは、構築しますmodel_fn解析された入力テンソルにKerasモデルを呼び出します。入力の機能を解析するには、使用することができますtf.feature_column.input_layertf.keras.layers.DenseFeatures 、またはtfl.estimators.transform_features 。後者を使用する場合、カテゴリの特徴を密な特徴列でラップする必要はなく、結果のテンソルは連結されないため、キャリブレーションレイヤーで特徴を使用しやすくなります。

モデルを構築するには、TFLレイヤーまたはその他のKerasレイヤーを組み合わせて組み合わせることができます。ここでは、TFLレイヤーからキャリブレーションされたラティスKerasモデルを作成し、いくつかの単調性制約を課します。次に、Kerasモデルを使用してカスタム推定量を作成します。

def model_fn(features, labels, mode, config):
 
"""model_fn for the custom estimator."""
 
del config
  input_tensors
= tfl.estimators.transform_features(features, feature_columns)
  inputs
= {
      key
: tf.keras.layers.Input(shape=(1,), name=key) for key in input_tensors
 
}

  lattice_sizes
= [3, 2, 2, 2]
  lattice_monotonicities
= ['increasing', 'none', 'increasing', 'increasing']
  lattice_input
= tf.keras.layers.Concatenate(axis=1)([
      tfl
.layers.PWLCalibration(
          input_keypoints
=np.linspace(10, 100, num=8, dtype=np.float32),
         
# The output range of the calibrator should be the input range of
         
# the following lattice dimension.
          output_min
=0.0,
          output_max
=lattice_sizes[0] - 1.0,
          monotonicity
='increasing',
     
)(inputs['age']),
      tfl
.layers.CategoricalCalibration(
         
# Number of categories including any missing/default category.
          num_buckets
=2,
          output_min
=0.0,
          output_max
=lattice_sizes[1] - 1.0,
     
)(inputs['sex']),
      tfl
.layers.PWLCalibration(
          input_keypoints
=[0.0, 1.0, 2.0, 3.0],
          output_min
=0.0,
          output_max
=lattice_sizes[0] - 1.0,
         
# You can specify TFL regularizers as tuple
         
# ('regularizer name', l1, l2).
          kernel_regularizer
=('hessian', 0.0, 1e-4),
          monotonicity
='increasing',
     
)(inputs['ca']),
      tfl
.layers.CategoricalCalibration(
          num_buckets
=3,
          output_min
=0.0,
          output_max
=lattice_sizes[1] - 1.0,
         
# Categorical monotonicity can be partial order.
         
# (i, j) indicates that we must have output(i) <= output(j).
         
# Make sure to set the lattice monotonicity to 'increasing' for this
         
# dimension.
          monotonicities
=[(0, 1), (0, 2)],
     
)(inputs['thal']),
 
])
  output
= tfl.layers.Lattice(
      lattice_sizes
=lattice_sizes, monotonicities=lattice_monotonicities)(
          lattice_input
)

  training
= (mode == tf.estimator.ModeKeys.TRAIN)
  model
= tf.keras.Model(inputs=inputs, outputs=output)
  logits
= model(input_tensors, training=training)

 
if training:
    optimizer
= optimizers.get_optimizer_instance_v2('Adagrad', LEARNING_RATE)
 
else:
    optimizer
= None

  head
= binary_class_head.BinaryClassHead()
 
return head.create_estimator_spec(
      features
=features,
      mode
=mode,
      labels
=labels,
      optimizer
=optimizer,
      logits
=logits,
      trainable_variables
=model.trainable_variables,
      update_ops
=model.updates)

トレーニングと推定量

使用model_fn我々は推定器を作成し、訓練することができます。

estimator = tf.estimator.Estimator(model_fn=model_fn)
estimator
.train(input_fn=train_input_fn)
results
= estimator.evaluate(input_fn=test_input_fn)
print('AUC: {}'.format(results['auc']))
2021-09-30 20:51:11.094402: E tensorflow/stream_executor/cuda/cuda_driver.cc:271] failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
AUC: 0.5946115255355835