Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/es-419/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 prediseñados de TF Lattice

Advertencia: Los estimadores no se recomiendan para código nuevo. Los estimadores ejecutan el código de estilo v1.Session que es más difícil de escribir correctamente y puede tener un comportamiento inesperado; particularmente, cuando se combina con código TF 2. Los estimadores están incluidos dentro de nuestras garantías de compatibilidad, pero no se les harán correcciones a menos que se trate de vulnerabilidades de seguridad. Para más detalles, consulte la Guía de migración.

Descripción general

Los estimadores prediseñados son formas rápidas y sencillas de entrenar modelos de TFL para casos de uso típicos. Esta guía describe los pasos necesarios para crear un estimador prediseñado de TFL.

Preparación

Instalar el paquete TF Lattice:

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

Importar los paquetes requeridos:

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)

Descargar el conjunto de datos Statlog (corazón) de UCI:

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()

Establecer los valores predeterminados que se usan para el entrenamiento en esta guía:

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

Columnas de funciones

Al igual que con cualquier otro estimador de TF, los datos deben pasarse al estimador, que generalmente se realiza a través de input_fn y se analizan mediante 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']), ]

Los estimadores prediseñados de TFL usan el tipo de columna de funciones para decidir qué tipo de capa de calibración usar. Usamos una capa tfl.layers.PWLCalibration para columnas de funciones numéricas y una capa tfl.layers.CategoricalCalibration para columnas de funciones categóricas.

Tenga en cuenta que las columnas de funciones categóricas no están envueltas en una columna de funciones de incorporación. Se ingresan directamente en el estimador.

Crear input_fn

Como con cualquier otro estimador, se puede usar input_fn para alimentar datos al modelo para entrenamiento y evaluación. Los estimadores de TFL pueden calcular automáticamente cuantiles de las funciones y usarlos como puntos clave de entrada para la capa de calibración de PWL. Para esto, requieren pasar un feature_analysis_input_fn, que es similar al input_fn de entrenamiento pero con una única época o una submuestra de los datos.

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)))

Configs de funciones

La calibración de funciones y las configuraciones por función se establecen mediante tfl.configs.FeatureConfig. Las configuraciones de funciones incluyen restricciones de monotonicidad, regularización por función (consulte tfl.configs.RegularizerConfig) y tamaños de cuadrícula para modelos de cuadrícula.

Si no se define ninguna configuración para una función de entrada, se usa la configuración predeterminada en 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 lineal calibrado

Para construir un estimador prediseñado de TFL, cree una configuración de modelo a partir de tfl.configs. Se construye un modelo lineal calibrado con tfl.configs.CalibratedLinearConfig. Esto aplica una calibración categórica y lineal por partes en las funciones de entrada, seguida de una combinación lineal y una calibración lineal por partes de salida opcional. Cuando se usa la calibración de salida o cuando se especifican límites de salida, la capa lineal aplicará un promedio ponderado en las entradas calibradas.

Este ejemplo crea un modelo lineal calibrado en las primeras 5 funciones. Usamos tfl.visualization para trazar el gráfico del modelo con los gráficos del 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 de cuadrícula calibrado

Se construye un modelo de cuadrícula calibrado con tfl.configs.CalibratedLatticeConfig. Un modelo de cuadrícula calibrado aplica una calibración categórica y lineal por partes en las funciones de entrada, seguida de un modelo de cuadrícula y una calibración lineal por partes de salida opcional.

Este ejemplo crea un modelo de cuadrícula calibrado en las primeras 5 funciones.

# 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)

Conjunto de cuadrículas calibrado

Cuando la cantidad de funciones es grande, se puede usar un modelo de conjunto, que crea múltiples cuadrículas más pequeñas para subconjuntos de funciones y promedia su salida en lugar de crear una sola cuadrícula grande. Los modelos de conjunto de cuadrículas se construyen con tfl.configs.CalibratedLatticeEnsembleConfig. Un modelo de conjunto de cuadrículas calibrado aplica una calibración categórica y lineal por partes en la función de entrada, seguida de un conjunto de modelos de cuadrículas y una calibración lineal por partes de salida opcional.

Conjunto de cuadrículas aleatorio

La siguiente configuración del modelo usa un subconjunto aleatorio de funciones para cada cuadrícula.

# 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)

Conjunto de cuadrículas aleatorio de capa RTL

La siguiente configuración del modelo usa una capa tfl.layers.RTL que utiliza un subconjunto aleatorio de funciones para cada cuadrícula. Podemos observar que tfl.layers.RTL solo admite restricciones de monotonicidad y debe tener el mismo tamaño de cuadrícula para todas las funciones y sin regularización por función. Tenga en cuenta que usar una capa tfl.layers.RTL le permite escalar a conjuntos mucho más grandes que usar instancias tfl.layers.Lattice separadas.

# 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)

Conjunto de cuadrículas Crystals

TFL también proporciona un algoritmo de disposición de funciones heurísticas, llamado Crystals. El algoritmo Crystals primero entrena un modelo de preajuste que estima las interacciones de funciones por pares. Luego organiza el conjunto final de manera que las funciones con más interacciones no lineales estén en las mismas cuadrículas.

Para los modelos de Crystals, también deberá proporcionar un prefitting_input_fn que se usa para entrenar el modelo de preajuste, como se describe anteriormente. No es necesario entrenar completamente el modelo de preajuste, por lo que unas pocas épocas deberían ser suficientes.

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)

Luego puede crear un modelo Crystal al establecer lattice='crystals' en la configuración del 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)

Puede trazar calibradores de funciones más detallados con el módulo tfl.visualization.

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