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

TF Lattice 预制模型

概述

利用预制模型,您可以快速轻松地针对典型用例构建 TFL tf.keras.model 实例。本指南概述了构造 TFL 预制模型并对其进行训练/测试所需的步骤。

设置

安装 TF Lattice 软件包:

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

导入所需的软件包:

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)[ASDF]

设置用于在本指南中进行训练的默认值:

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

下载 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]

特征配置

使用 tfl.configs.FeatureConfig 设置特征校准和按特征的配置。特征配置包括单调性约束、按特征的正则化(请参阅 tfl.configs.RegularizerConfig)以及点阵模型的点阵大小。

请注意,我们必须为希望模型识别的任何特征完全指定特征配置。否则,模型将无法获知存在这样的特征。

定义我们的特征配置

现在我们可以计算分位数了,我们为希望模型将其作为输入的每个特征定义一个特征配置。

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

设置单调性和关键点

接下来,我们需要确保为使用自定义词汇表的特征(例如上面的“thal”)正确设置单调性。

tfl.premade_lib.set_categorical_monotonicities(heart_feature_configs)

最后,我们可以通过计算和设置关键点来完成功能配置。

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)

校准线性模型

要构造 TFL 预制模型,请首先从 tfl.configs 构造模型配置。使用 tfl.configs.CalibratedLinearConfig 构造校准线性模型。此模型会将分段线性和分类校准应用于输入特征,随后应用线性组合和可选的输出分段线性校准。使用输出校准或指定输出边界时,线性层会将加权平均应用于校准的输入。

下面的示例将基于前 5 个特征创建一个校准线性模型。

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

现在,与任何其他 tf.keras.Model 一样,我们编译该模型并将其拟合到我们的数据中。

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)

训练完模型后,我们可以在测试集中对其进行评估。

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

校准点阵模型

使用 tfl.configs.CalibratedLatticeConfig 构造校准点阵模型。校准点阵模型会将分段线性和分类校准应用于输入特征,随后应用点阵模型和可选的输出分段线性校准。

下面的示例将基于前 5 个特征创建一个校准点阵模型。

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

和以前一样,我们编译、拟合并评估我们的模型。

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

校准点阵集成模型

当特征数量很大时,可以使用集成模型,这种模型会为特征的子集创建多个较小的点阵并计算它们的输出平均值,而不是仅创建单个巨大的点阵。使用 tfl.configs.CalibratedLatticeEnsembleConfig 构造集成点阵模型。校准点阵集成模型会将分段线性和分类校准应用于输入特征,随后应用点阵模型的集成和可选的输出分段线性校准。

显式点阵集成初始化

如果您已经知道要将哪些特征子集馈入点阵,则可以使用特征名称显式设置点阵。下面的示例将创建一个校准点阵集成模型,此模型具有 5 个点阵,每个点阵有 3 个特征。

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

和以前一样,我们编译、拟合并评估我们的模型。

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

随机点阵集成

如果您不确定要将哪些特征子集馈入点阵,则另一个选择是为每个点阵使用随机的特征子集。下面的示例将创建一个校准点阵集成模型,此模型具有 5 个点阵,每个点阵有 3 个特征。

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

和以前一样,我们编译、拟合并评估我们的模型。

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

RTL 层随机点阵集成

使用随机点阵集成时,可以指定模型使用单个 tfl.layers.RTL 层。我们注意到,tfl.layers.RTL 仅支持单调性约束,对于所有特征都必须具有相同的点阵大小,并且不包含按特征的正则化。请注意,与使用单独的 tfl.layers.Lattice 实例相比,使用 tfl.layers.RTL 层可使您扩展到更大的集成。

下面的示例将创建一个校准点阵集成模型,此模型具有 5 个点阵,每个点阵有 3 个特征。

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

和以前一样,我们编译、拟合并评估我们的模型。

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

晶体点阵集成

预制模型还提供了一种称为晶体的启发式特征排列算法。要使用晶体算法,首先训练一个预拟合模型,此模型会估算成对的特征交互。然后,它将对最终集成进行排列,使具有更多非线性交互的特征处于同一点阵中。

预制库提供了一些辅助函数,用于构造预拟合模型配置以及提取晶体结构。请注意,预拟合模型不需要完全训练,因此几个周期便已足够。

下面的示例将创建一个校准点阵集成模型,此模型具有 5 个点阵,每个点阵有 3 个特征。

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

和以前一样,我们编译、拟合并评估我们的模型。

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