Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/pt-br/lattice/tutorials/canned_estimators.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.

Estimadores predefinidos do TF Lattice

Aviso: os Estimadores não são recomendados para novos códigos. Os Estimadores executam código v1.Session, que é mais difícil de escrever corretamente e pode se comportar de forma inesperada, ainda mais quando usado em conjunto com código do TF 2. Os Estimadores são abarcados pelas garantias de compatibilidade, mas não recebem mais correções, exceto para vulnerabilidades de segurança. Confira mais detalhes no guia de migração.

Visão geral

Os estimadores predefinidos são maneiras rápidas e fáceis de treinar modelos do TFL para casos de uso típicos. Este guia descreve as etapas necessárias para criar um estimador predefinido do TFL.

Configuração

Instale o pacote do TF Lattice:

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

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 from tensorflow import feature_column as fc logging.disable(sys.maxsize)

Baixe o dataset 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()

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

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

Colunas de características

Como qualquer outro estimador do TF, os dados precisam ser passados para o estimador, o que geralmente ocorre por uma input_fn, e processados usando FeatureColumns.

# Feature columns. # - 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 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('cp'), fc.numeric_column('trestbps', default_value=-1), fc.numeric_column('chol'), fc.categorical_column_with_vocabulary_list('fbs', [0, 1]), fc.categorical_column_with_vocabulary_list('restecg', [0, 1, 2]), fc.numeric_column('thalach'), fc.categorical_column_with_vocabulary_list('exang', [0, 1]), fc.numeric_column('oldpeak'), fc.categorical_column_with_vocabulary_list('slope', [0, 1, 2]), fc.numeric_column('ca'), fc.categorical_column_with_vocabulary_list( 'thal', ['normal', 'fixed', 'reversible']), ]

Os estimadores predefinidos do TFL usam o tipo de coluna de característica para decidir o tipo de camada de calibração que deve ser utilizado. Usamos uma camada tfl.layers.PWLCalibration para colunas de características numéricas e uma camada tfl.layers.CategoricalCalibration para colunas de características categóricas.

Observe que as colunas de características categóricas não são envolvidas por uma coluna de característica de embedding. Elas são alimentadas diretamente ao estimador.

Criação da input_fn

Como qualquer outro estimador, você pode usar uma input_fn para alimentar os dados no modelo para treinamento e avaliação. Os estimadores do TFL podem calcular automaticamente os quantis das características e usá-los como keypoints de entrada para a camada de calibração PWL. Para isso, eles precisam passar uma feature_analysis_input_fn, que é semelhante a input_fn de treinamento, mas com uma única época ou uma subamostra dos dados.

train_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn( x=train_x, y=train_y, shuffle=False, batch_size=BATCH_SIZE, num_epochs=NUM_EPOCHS, num_threads=1) # feature_analysis_input_fn is used to collect statistics about the input. feature_analysis_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn( x=train_x, y=train_y, shuffle=False, batch_size=BATCH_SIZE, # Note that we only need one pass over the data. num_epochs=1, 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) # Serving input fn is used to create saved models. serving_input_fn = ( tf.estimator.export.build_parsing_serving_input_receiver_fn( feature_spec=fc.make_parse_example_spec(feature_columns)))

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.

Se nenhuma configuração for definida para uma característica de entrada, será usada a configuração padrão em tfl.config.FeatureConfig.

# Feature configs are used to specify how each feature is calibrated and used. feature_configs = [ tfl.configs.FeatureConfig( name='age', lattice_size=3, # By default, input keypoints of pwl are quantiles of the feature. pwl_calibration_num_keypoints=5, monotonicity='increasing', pwl_calibration_clip_max=100, # Per feature regularization. regularizer_configs=[ tfl.configs.RegularizerConfig(name='calib_wrinkle', l2=0.1), ], ), tfl.configs.FeatureConfig( name='cp', pwl_calibration_num_keypoints=4, # Keypoints can be uniformly spaced. pwl_calibration_input_keypoints='uniform', monotonicity='increasing', ), tfl.configs.FeatureConfig( name='chol', # Explicit input keypoint initialization. pwl_calibration_input_keypoints=[126.0, 210.0, 247.0, 286.0, 564.0], monotonicity='increasing', # 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)], ), tfl.configs.FeatureConfig( name='trestbps', pwl_calibration_num_keypoints=5, monotonicity='decreasing', ), tfl.configs.FeatureConfig( name='thalach', pwl_calibration_num_keypoints=5, monotonicity='decreasing', ), tfl.configs.FeatureConfig( name='restecg', # Partial monotonicity: output(0) <= output(1), output(0) <= output(2) monotonicity=[(0, 1), (0, 2)], ), tfl.configs.FeatureConfig( name='exang', # Partial monotonicity: output(0) <= output(1) monotonicity=[(0, 1)], ), tfl.configs.FeatureConfig( name='oldpeak', pwl_calibration_num_keypoints=5, monotonicity='increasing', ), tfl.configs.FeatureConfig( name='slope', # Partial monotonicity: output(0) <= output(1), output(1) <= output(2) monotonicity=[(0, 1), (1, 2)], ), tfl.configs.FeatureConfig( name='ca', pwl_calibration_num_keypoints=4, monotonicity='increasing', ), tfl.configs.FeatureConfig( name='thal', # Partial monotonicity: # output(normal) <= output(fixed) # output(normal) <= output(reversible) monotonicity=[('normal', 'fixed'), ('normal', 'reversible')], ), ]

Modelo linear calibrado

Para criar um estimador predefinido 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. Usamos tfl.visualization para plotar o grafo do modelo com os plots do calibrador.

# Model config defines the model structure for the estimator. model_config = tfl.configs.CalibratedLinearConfig( feature_configs=feature_configs, use_bias=True, output_calibration=True, regularizer_configs=[ # Regularizer for the output calibrator. tfl.configs.RegularizerConfig(name='output_calib_hessian', l2=1e-4), ]) # A CannedClassifier is constructed from the given model config. estimator = tfl.estimators.CannedClassifier( feature_columns=feature_columns[:5], model_config=model_config, feature_analysis_input_fn=feature_analysis_input_fn, optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), config=tf.estimator.RunConfig(tf_random_seed=42)) estimator.train(input_fn=train_input_fn) results = estimator.evaluate(input_fn=test_input_fn) print('Calibrated linear test AUC: {}'.format(results['auc'])) saved_model_path = estimator.export_saved_model(estimator.model_dir, serving_input_fn) model_graph = tfl.estimators.get_model_graph(saved_model_path) tfl.visualization.draw_model_graph(model_graph)

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 calibrated lattice model: Inputs are calibrated, then combined # non-linearly using a lattice layer. model_config = tfl.configs.CalibratedLatticeConfig( feature_configs=feature_configs, regularizer_configs=[ # Torsion regularizer applied to the lattice to make it more linear. tfl.configs.RegularizerConfig(name='torsion', l2=1e-4), # Globally defined calibration regularizer is applied to all features. tfl.configs.RegularizerConfig(name='calib_hessian', l2=1e-4), ]) # A CannedClassifier is constructed from the given model config. estimator = tfl.estimators.CannedClassifier( feature_columns=feature_columns[:5], model_config=model_config, feature_analysis_input_fn=feature_analysis_input_fn, optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), config=tf.estimator.RunConfig(tf_random_seed=42)) estimator.train(input_fn=train_input_fn) results = estimator.evaluate(input_fn=test_input_fn) print('Calibrated lattice test AUC: {}'.format(results['auc'])) saved_model_path = estimator.export_saved_model(estimator.model_dir, serving_input_fn) model_graph = tfl.estimators.get_model_graph(saved_model_path) tfl.visualization.draw_model_graph(model_graph)

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.

Ensemble lattice aleatório

A seguinte configuração de modelo usa um subconjunto aleatório de características para cada lattice.

# This is random lattice ensemble model with separate calibration: # model output is the average output of separately calibrated lattices. model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=feature_configs, num_lattices=5, lattice_rank=3) # A CannedClassifier is constructed from the given model config. estimator = tfl.estimators.CannedClassifier( feature_columns=feature_columns, model_config=model_config, feature_analysis_input_fn=feature_analysis_input_fn, optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), config=tf.estimator.RunConfig(tf_random_seed=42)) estimator.train(input_fn=train_input_fn) results = estimator.evaluate(input_fn=test_input_fn) print('Random ensemble test AUC: {}'.format(results['auc'])) saved_model_path = estimator.export_saved_model(estimator.model_dir, serving_input_fn) model_graph = tfl.estimators.get_model_graph(saved_model_path) tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)

Ensemble lattice aleatório de camada RTL

A seguinte configuração de modelo usa uma camada tfl.layers.RTL que utiliza um subconjunto aleatório de características para cada lattice. 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.

# Make sure our feature configs have the same lattice size, no per-feature # regularization, and only monotonicity constraints. rtl_layer_feature_configs = copy.deepcopy(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 RTL layer ensemble model with separate calibration: # model output is the average output of separately calibrated lattices. model_config = tfl.configs.CalibratedLatticeEnsembleConfig( lattices='rtl_layer', feature_configs=rtl_layer_feature_configs, num_lattices=5, lattice_rank=3) # A CannedClassifier is constructed from the given model config. estimator = tfl.estimators.CannedClassifier( feature_columns=feature_columns, model_config=model_config, feature_analysis_input_fn=feature_analysis_input_fn, optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), config=tf.estimator.RunConfig(tf_random_seed=42)) estimator.train(input_fn=train_input_fn) results = estimator.evaluate(input_fn=test_input_fn) print('Random ensemble test AUC: {}'.format(results['auc'])) saved_model_path = estimator.export_saved_model(estimator.model_dir, serving_input_fn) model_graph = tfl.estimators.get_model_graph(saved_model_path) tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)

Ensemble lattice do Crystals

O TFL também fornece um algoritmo de arranjo de características heurístico chamado Crystals. Primeiro, o algoritmo Crystals treina um modelo de prefitting que estima as interações de características por partes. Em seguida, ele arranja o ensemble final para que as características com mais interações não lineares fiquem nos mesmos lattices.

Para modelos Crystals, você também precisará fornecer uma prefitting_input_fn que é usada para treinar o modelo de prefitting, conforme descrito acima. O modelo de prefitting não precisa ser totalmente treinado, então algumas épocas deve ser o suficiente.

prefitting_input_fn = tf.compat.v1.estimator.inputs.pandas_input_fn( x=train_x, y=train_y, shuffle=False, batch_size=BATCH_SIZE, num_epochs=PREFITTING_NUM_EPOCHS, num_threads=1)

Em seguida, você pode criar um modelo Crystal ao definir lattice='crystals' na configuração do modelo.

# This is Crystals ensemble model with separate calibration: model output is # the average output of separately calibrated lattices. model_config = tfl.configs.CalibratedLatticeEnsembleConfig( feature_configs=feature_configs, lattices='crystals', num_lattices=5, lattice_rank=3) # A CannedClassifier is constructed from the given model config. estimator = tfl.estimators.CannedClassifier( feature_columns=feature_columns, model_config=model_config, feature_analysis_input_fn=feature_analysis_input_fn, # prefitting_input_fn is required to train the prefitting model. prefitting_input_fn=prefitting_input_fn, optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), prefitting_optimizer=tf.keras.optimizers.legacy.Adam(LEARNING_RATE), config=tf.estimator.RunConfig(tf_random_seed=42)) estimator.train(input_fn=train_input_fn) results = estimator.evaluate(input_fn=test_input_fn) print('Crystals ensemble test AUC: {}'.format(results['auc'])) saved_model_path = estimator.export_saved_model(estimator.model_dir, serving_input_fn) model_graph = tfl.estimators.get_model_graph(saved_model_path) tfl.visualization.draw_model_graph(model_graph, calibrator_dpi=15)

Você pode plotar os calibradores de características com mais detalhes usando o módulo tfl.visualization.

_ = tfl.visualization.plot_feature_calibrator(model_graph, "age") _ = tfl.visualization.plot_feature_calibrator(model_graph, "restecg")