Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/pt-br/lattice/tutorials/premade_models.ipynb
25118 views
Kernel: Python 3
#@title Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

Modelos pré-fabricados do TF Lattice

Visão geral

Os modelos pré-fabricados são maneiras rápidas e fáceis de criar instâncias do tf.keras.model para casos de uso típicos. Este guia descreve as etapas necessárias para criar e treinar/testar um modelo pré-fabricado do TFL.

Configuração

Instale o pacote do TF Lattice:

#@test {"skip": true} !pip install tensorflow-lattice pydot

Importe os pacotes necessários:

import tensorflow as tf import copy import logging import numpy as np import pandas as pd import sys import tensorflow_lattice as tfl logging.disable(sys.maxsize)

Configure os valores padrão usados para treinamento neste guia:

LEARNING_RATE = 0.01 BATCH_SIZE = 128 NUM_EPOCHS = 500 PREFITTING_NUM_EPOCHS = 10

Baixe o dataset UCI Statlog (Heart):

heart_csv_file = tf.keras.utils.get_file( 'heart.csv', 'http://storage.googleapis.com/download.tensorflow.org/data/heart.csv') heart_df = pd.read_csv(heart_csv_file) thal_vocab_list = ['normal', 'fixed', 'reversible'] heart_df['thal'] = heart_df['thal'].map( {v: i for i, v in enumerate(thal_vocab_list)}) heart_df = heart_df.astype(float) heart_train_size = int(len(heart_df) * 0.8) heart_train_dict = dict(heart_df[:heart_train_size]) heart_test_dict = dict(heart_df[heart_train_size:]) # This ordering of input features should match the feature configs. If no # feature config relies explicitly on the data (i.e. all are 'quantiles'), # then you can construct the feature_names list by simply iterating over each # feature config and extracting it's name. feature_names = [ 'age', 'sex', 'cp', 'chol', 'fbs', 'trestbps', 'thalach', 'restecg', 'exang', 'oldpeak', 'slope', 'ca', 'thal' ] # Since we have some features that manually construct their input keypoints, # we need an index mapping of the feature names. feature_name_indices = {name: index for index, name in enumerate(feature_names)} label_name = 'target' heart_train_xs = [ heart_train_dict[feature_name] for feature_name in feature_names ] heart_test_xs = [heart_test_dict[feature_name] for feature_name in feature_names] heart_train_ys = heart_train_dict[label_name] heart_test_ys = heart_test_dict[label_name]

Configurações de características

A calibração de características e as configurações por característica são definidas usando tfl.configs.FeatureConfig. As configurações de características incluem restrições de monotonicidade, regularização por recurso (ver tfl.configs.RegularizerConfig) e tamanhos de lattice para modelos lattice.

É necessário especificar totalmente a configuração para qualquer característica que queremos que o modelo reconheça. Caso contrário, o modelo não terá como saber se essa característica existe.

Defina as configurações das características

Agora que os quantis podem ser computados, defina uma configuração para cada característica que o modelo deve aceitar como entrada.

# Features: # - age # - sex # - cp chest pain type (4 values) # - trestbps resting blood pressure # - chol serum cholestoral in mg/dl # - fbs fasting blood sugar > 120 mg/dl # - restecg resting electrocardiographic results (values 0,1,2) # - thalach maximum heart rate achieved # - exang exercise induced angina # - oldpeak ST depression induced by exercise relative to rest # - slope the slope of the peak exercise ST segment # - ca number of major vessels (0-3) colored by flourosopy # - thal normal; fixed defect; reversable defect # # Feature configs are used to specify how each feature is calibrated and used. heart_feature_configs = [ tfl.configs.FeatureConfig( name='age', lattice_size=3, monotonicity='increasing', # We must set the keypoints manually. pwl_calibration_num_keypoints=5, pwl_calibration_input_keypoints='quantiles', pwl_calibration_clip_max=100, # Per feature regularization. regularizer_configs=[ tfl.configs.RegularizerConfig(name='calib_wrinkle', l2=0.1), ], ), tfl.configs.FeatureConfig( name='sex', num_buckets=2, ), tfl.configs.FeatureConfig( name='cp', monotonicity='increasing', # Keypoints that are uniformly spaced. pwl_calibration_num_keypoints=4, pwl_calibration_input_keypoints=np.linspace( np.min(heart_train_xs[feature_name_indices['cp']]), np.max(heart_train_xs[feature_name_indices['cp']]), num=4), ), tfl.configs.FeatureConfig( name='chol', monotonicity='increasing', # Explicit input keypoints initialization. pwl_calibration_input_keypoints=[126.0, 210.0, 247.0, 286.0, 564.0], # Calibration can be forced to span the full output range by clamping. pwl_calibration_clamp_min=True, pwl_calibration_clamp_max=True, # Per feature regularization. regularizer_configs=[ tfl.configs.RegularizerConfig(name='calib_hessian', l2=1e-4), ], ), tfl.configs.FeatureConfig( name='fbs', # Partial monotonicity: output(0) <= output(1) monotonicity=[(0, 1)], num_buckets=2, ), tfl.configs.FeatureConfig( name='trestbps', monotonicity='decreasing', pwl_calibration_num_keypoints=5, pwl_calibration_input_keypoints='quantiles', ), tfl.configs.FeatureConfig( name='thalach', monotonicity='decreasing', pwl_calibration_num_keypoints=5, pwl_calibration_input_keypoints='quantiles', ), tfl.configs.FeatureConfig( name='restecg', # Partial monotonicity: output(0) <= output(1), output(0) <= output(2) monotonicity=[(0, 1), (0, 2)], num_buckets=3, ), tfl.configs.FeatureConfig( name='exang', # Partial monotonicity: output(0) <= output(1) monotonicity=[(0, 1)], num_buckets=2, ), tfl.configs.FeatureConfig( name='oldpeak', monotonicity='increasing', pwl_calibration_num_keypoints=5, pwl_calibration_input_keypoints='quantiles', ), tfl.configs.FeatureConfig( name='slope', # Partial monotonicity: output(0) <= output(1), output(1) <= output(2) monotonicity=[(0, 1), (1, 2)], num_buckets=3, ), tfl.configs.FeatureConfig( name='ca', monotonicity='increasing', pwl_calibration_num_keypoints=4, pwl_calibration_input_keypoints='quantiles', ), tfl.configs.FeatureConfig( name='thal', # Partial monotonicity: # output(normal) <= output(fixed) # output(normal) <= output(reversible) monotonicity=[('normal', 'fixed'), ('normal', 'reversible')], num_buckets=3, # We must specify the vocabulary list in order to later set the # monotonicities since we used names and not indices. vocabulary_list=thal_vocab_list, ), ]

Defina monotonicidades e keypoints

Em seguida, defina corretamente as monotonicidades para as características em que usamos um vocabulário personalizado (como "thal" acima).

tfl.premade_lib.set_categorical_monotonicities(heart_feature_configs)

Por fim, conclua as configurações das características ao calcular e configurar keypoints.

feature_keypoints = tfl.premade_lib.compute_feature_keypoints( feature_configs=heart_feature_configs, features=heart_train_dict) tfl.premade_lib.set_feature_keypoints( feature_configs=heart_feature_configs, feature_keypoints=feature_keypoints, add_missing_feature_configs=False)

Modelo linear calibrado

Para criar um modelo pré-fabricado do TFL, primeiro construa uma configuração de modelo a partir de tfl.configs. Um modelo linear calibrado é criado usando a tfl.configs.CalibratedLinearConfig. Ela aplica a calibração categórica e por partes nas características de entrada e, em seguida, uma combinação linear e uma calibração linear por partes de saída opcional. Ao usar a calibração de saída ou especificar limites de saída, a camada linear aplicará a média ponderada nas saídas calibradas.

Este exemplo cria um modelo linear calibrado nas primeiras 5 características.

# Model config defines the model structure for the premade model. linear_model_config = tfl.configs.CalibratedLinearConfig( feature_configs=heart_feature_configs[:5], use_bias=True, output_calibration=True, output_calibration_num_keypoints=10, # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=np.linspace(-2.0, 2.0, num=10), regularizer_configs=[ # Regularizer for the output calibrator. tfl.configs.RegularizerConfig(name='output_calib_hessian', l2=1e-4), ]) # A CalibratedLinear premade model constructed from the given model config. linear_model = tfl.premade.CalibratedLinear(linear_model_config) # Let's plot our model. tf.keras.utils.plot_model(linear_model, show_layer_names=False, rankdir='LR')

Agora, como com qualquer outro tf.keras.Model, é preciso compilar e ajustar o modelo aos dados.

linear_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) linear_model.fit( heart_train_xs[:5], heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False)

Após o treinamento do modelo, é possível avaliá-lo no dataset de teste.

print('Test Set Evaluation...') print(linear_model.evaluate(heart_test_xs[:5], heart_test_ys))

Modelo lattice calibrado

Um modelo lattice calibrado é criado usando tfl.configs.CalibratedLatticeConfig. Esse tipo de modelo aplica calibração linear por partes e categórica nas características de entrada e, em seguida, um modelo lattice e uma calibração linear por partes de saída opcional.

Este exemplo cria um modelo lattice calibrado nas primeiras 5 características.

# This is a calibrated lattice model: inputs are calibrated, then combined # non-linearly using a lattice layer. lattice_model_config = tfl.configs.CalibratedLatticeConfig( feature_configs=heart_feature_configs[:5], # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=[-2.0, 2.0], regularizer_configs=[ # Torsion regularizer applied to the lattice to make it more linear. tfl.configs.RegularizerConfig(name='torsion', l2=1e-2), # Globally defined calibration regularizer is applied to all features. tfl.configs.RegularizerConfig(name='calib_hessian', l2=1e-2), ]) # A CalibratedLattice premade model constructed from the given model config. lattice_model = tfl.premade.CalibratedLattice(lattice_model_config) # Let's plot our model. tf.keras.utils.plot_model(lattice_model, show_layer_names=False, rankdir='LR')

Como antes, compile, ajuste e avalie o modelo.

lattice_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) lattice_model.fit( heart_train_xs[:5], heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) print('Test Set Evaluation...') print(lattice_model.evaluate(heart_test_xs[:5], heart_test_ys))

Modelo ensemble lattice calibrado

Quando o número de características for grande, você pode usar um modelo ensemble, que cria vários lattices menores para subconjuntos de características e calcula a média da saída deles, em vez de só criar um lattice grande. Os modelos lattice ensemble são criados usando tfl.configs.CalibratedLatticeEnsembleConfig. Um modelo ensemble lattice calibrado aplica a calibração linear por partes e categórica na característica de entrada e, em seguida, um ensemble de modelos lattice e uma calibração linear por partes de saída opcional.

Inicialização explícita de ensemble lattice

Se você já sabe com que subconjuntos de características quer alimentar os lattices, é possível definir os lattices de maneira explícita usando nomes de características. Este exemplo cria um modelo ensemble lattice calibrado com 5 lattices e 3 características por lattice.

# This is a calibrated lattice ensemble model: inputs are calibrated, then # combined non-linearly and averaged using multiple lattice layers. explicit_ensemble_model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=heart_feature_configs, lattices=[['trestbps', 'chol', 'ca'], ['fbs', 'restecg', 'thal'], ['fbs', 'cp', 'oldpeak'], ['exang', 'slope', 'thalach'], ['restecg', 'age', 'sex']], num_lattices=5, lattice_rank=3, # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=[-2.0, 2.0]) # A CalibratedLatticeEnsemble premade model constructed from the given # model config. explicit_ensemble_model = tfl.premade.CalibratedLatticeEnsemble( explicit_ensemble_model_config) # Let's plot our model. tf.keras.utils.plot_model( explicit_ensemble_model, show_layer_names=False, rankdir='LR')

Como antes, compile, ajuste e avalie o modelo.

explicit_ensemble_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) explicit_ensemble_model.fit( heart_train_xs, heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) print('Test Set Evaluation...') print(explicit_ensemble_model.evaluate(heart_test_xs, heart_test_ys))

Ensemble lattice aleatório

Se você não sabe com que subconjuntos de características quer alimentar os lattices, outra opção é usar subconjuntos aleatórios para cada lattice. Este exemplo cria um modelo ensemble lattice calibrado com 5 lattices e 3 características por lattice.

# This is a calibrated lattice ensemble model: inputs are calibrated, then # combined non-linearly and averaged using multiple lattice layers. random_ensemble_model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=heart_feature_configs, lattices='random', num_lattices=5, lattice_rank=3, # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=[-2.0, 2.0], random_seed=42) # Now we must set the random lattice structure and construct the model. tfl.premade_lib.set_random_lattice_ensemble(random_ensemble_model_config) # A CalibratedLatticeEnsemble premade model constructed from the given # model config. random_ensemble_model = tfl.premade.CalibratedLatticeEnsemble( random_ensemble_model_config) # Let's plot our model. tf.keras.utils.plot_model( random_ensemble_model, show_layer_names=False, rankdir='LR')

Como antes, compile, ajuste e avalie o modelo.

random_ensemble_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) random_ensemble_model.fit( heart_train_xs, heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) print('Test Set Evaluation...') print(random_ensemble_model.evaluate(heart_test_xs, heart_test_ys))

Ensemble lattice aleatório de camada RTL

Ao usar um ensemble lattice aleatório, você pode especificar para o modelo usar uma única camada tfl.layers.RTL. Ressaltamos que tfl.layers.RTL só é compatível com as restrições de monotonicidade, precisa apresentar o mesmo tamanho de lattice para todas as características e não pode ter regularização por característica. Observe que o uso de uma camada tfl.layers.RTL permite escalar para ensembles muito maiores em comparação com o uso de instâncias tfl.layers.Lattice.

Este exemplo cria um modelo ensemble lattice calibrado com 5 lattices e 3 características por lattice.

# Make sure our feature configs have the same lattice size, no per-feature # regularization, and only monotonicity constraints. rtl_layer_feature_configs = copy.deepcopy(heart_feature_configs) for feature_config in rtl_layer_feature_configs: feature_config.lattice_size = 2 feature_config.unimodality = 'none' feature_config.reflects_trust_in = None feature_config.dominates = None feature_config.regularizer_configs = None # This is a calibrated lattice ensemble model: inputs are calibrated, then # combined non-linearly and averaged using multiple lattice layers. rtl_layer_ensemble_model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=rtl_layer_feature_configs, lattices='rtl_layer', num_lattices=5, lattice_rank=3, # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=[-2.0, 2.0], random_seed=42) # A CalibratedLatticeEnsemble premade model constructed from the given # model config. Note that we do not have to specify the lattices by calling # a helper function (like before with random) because the RTL Layer will take # care of that for us. rtl_layer_ensemble_model = tfl.premade.CalibratedLatticeEnsemble( rtl_layer_ensemble_model_config) # Let's plot our model. tf.keras.utils.plot_model( rtl_layer_ensemble_model, show_layer_names=False, rankdir='LR')

Como antes, compile, ajuste e avalie o modelo.

rtl_layer_ensemble_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) rtl_layer_ensemble_model.fit( heart_train_xs, heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) print('Test Set Evaluation...') print(rtl_layer_ensemble_model.evaluate(heart_test_xs, heart_test_ys))

Ensemble lattice do Crystals

Os modelos pré-fabricados também fornecem um algoritmo de arranjo de características heurístico chamado Crystals. Para usar o algoritmo Crystals, primeiro é preciso treinar um modelo de prefitting que estima as interações de características por partes. Em seguida, arranjamos o ensemble final para que as características com mais interações não lineares fiquem nos mesmos lattices.

A biblioteca Premade oferece funções helper para construir a configuração de modelo de prefitting e extrair a estrutura de crystals. Observe que o modelo de prefitting não precisa ser totalmente treinado, então algumas épocas deve ser o suficiente.

Este exemplo cria um modelo ensemble lattice calibrado com 5 lattices e 3 características por lattice.

# This is a calibrated lattice ensemble model: inputs are calibrated, then # combines non-linearly and averaged using multiple lattice layers. crystals_ensemble_model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=heart_feature_configs, lattices='crystals', num_lattices=5, lattice_rank=3, # We initialize the output to [-2.0, 2.0] since we'll be using logits. output_initialization=[-2.0, 2.0], random_seed=42) # Now that we have our model config, we can construct a prefitting model config. prefitting_model_config = tfl.premade_lib.construct_prefitting_model_config( crystals_ensemble_model_config) # A CalibratedLatticeEnsemble premade model constructed from the given # prefitting model config. prefitting_model = tfl.premade.CalibratedLatticeEnsemble( prefitting_model_config) # We can compile and train our prefitting model as we like. prefitting_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) prefitting_model.fit( heart_train_xs, heart_train_ys, epochs=PREFITTING_NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) # Now that we have our trained prefitting model, we can extract the crystals. tfl.premade_lib.set_crystals_lattice_ensemble(crystals_ensemble_model_config, prefitting_model_config, prefitting_model) # A CalibratedLatticeEnsemble premade model constructed from the given # model config. crystals_ensemble_model = tfl.premade.CalibratedLatticeEnsemble( crystals_ensemble_model_config) # Let's plot our model. tf.keras.utils.plot_model( crystals_ensemble_model, show_layer_names=False, rankdir='LR')

Como antes, compile, ajuste e avalie o modelo.

crystals_ensemble_model.compile( loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=[tf.keras.metrics.AUC(from_logits=True)], optimizer=tf.keras.optimizers.Adam(LEARNING_RATE)) crystals_ensemble_model.fit( heart_train_xs, heart_train_ys, epochs=NUM_EPOCHS, batch_size=BATCH_SIZE, verbose=False) print('Test Set Evaluation...') print(crystals_ensemble_model.evaluate(heart_test_xs, heart_test_ys))