برآورد کننده های کنسرو شده مشبک TF

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

برآورد كنسروها روشهای سریع و آسانی برای آموزش مدلهای TFL برای موارد استفاده معمولی هستند. این راهنما مراحل مورد نیاز برای ایجاد برآورد كننده TFL را تشریح می كند.

برپایی

نصب بسته TF Lattice:

pip install -q tensorflow-lattice

وارد کردن بسته های مورد نیاز:

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)

بارگیری مجموعه داده 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()
Downloading data from http://storage.googleapis.com/download.tensorflow.org/data/heart.csv
16384/13273 [=====================================] - 0s 0us/step

تنظیم مقادیر پیش فرض مورد استفاده برای آموزش در این راهنما:

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

ستون های ویژگی

همانطور که برای هر برآوردگر TF دیگر، نیازهای داده به برآوردگر، که معمولا از طریق یک input_fn منتقل می شود و تجزیه با استفاده از 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']),
]

برآوردگرهای کنسرو شده TFL از نوع ستون ویژگی برای تصمیم گیری از نوع لایه کالیبراسیون استفاده می کنند. ما از یک tfl.layers.PWLCalibration لایه برای ستون ویژگی عددی و tfl.layers.CategoricalCalibration لایه برای ستون ویژگی قطعی.

توجه داشته باشید که ستون های ویژگی طبقه بندی شده با ستون ویژگی جاسازی نمی شوند. آنها مستقیماً در برآورد کننده تغذیه می شوند.

ایجاد input_fn

در مورد هر برآورد کننده دیگر ، می توانید از input_fn برای انتقال داده ها به مدل برای آموزش و ارزیابی استفاده کنید. برآوردگرهای TFL می توانند به صورت خودکار مقادیر ویژگی ها را محاسبه کرده و از آنها به عنوان کلیدهای ورودی برای لایه کالیبراسیون PWL استفاده کنند. برای این کار، آنها نیاز به عبور از یک feature_analysis_input_fn ، که شبیه به آموزش input_fn اما با یک دوره یک یا نمونهای از داده ها.

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

ویژگی های پیکربندی

کالیبراسیون ویژگی ها و تنظیمات هر ویژگی با استفاده از مجموعه ای tfl.configs.FeatureConfig . تنظیمات ویژگی ها عبارتند از محدودیت یکنواختی، در هر ویژگی تنظیم (نگاه کنید به tfl.configs.RegularizerConfig )، و اندازه شبکه برای مدل های شبکه.

اگر هیچ پیکربندی برای یک ویژگی ورودی تعریف شده است، تنظیمات پیش فرض در 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')],
    ),
]

مدل خطی کالیبره شده

برای ساخت یک TFL کنسرو برآوردگر، ساخت یک پیکربندی مدل از tfl.configs . یک مدل خطی کالیبره با استفاده از ساخته شده است tfl.configs.CalibratedLinearConfig . این کالیبراسیون خطی و دسته ای را بر روی ویژگی های ورودی اعمال می کند و به دنبال آن یک ترکیب خطی و یک کالیبراسیون قطعه خطی خروجی اختیاری وجود دارد. هنگام استفاده از کالیبراسیون خروجی یا هنگامی که محدوده خروجی مشخص شده است ، لایه خطی میانگین وزنی را روی ورودی های کالیبره اعمال می کند.

این مثال یک مدل خطی کالیبره شده در 5 ویژگی اول ایجاد می کند. ما با استفاده از tfl.visualization به رسم نمودار مدل با توطئه های کالیبراتور است.

# 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.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)
Calibrated linear test AUC: 0.834586501121521

png

مدل شبکه مشبک کالیبره شده

مدل شبکه کالیبره با استفاده از ساخته شده است tfl.configs.CalibratedLatticeConfig . یک مدل شبکه کالیبره شده بر روی ویژگی های ورودی ، کالیبراسیون خطی و دسته ای را اعمال می کند ، و سپس یک مدل شبکه و یک کالیبراسیون قطعه خطی خروجی اختیاری را دنبال می کند.

این مثال یک مدل شبکه کالیبره شده در 5 ویژگی اول ایجاد می کند.

# 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.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)
Calibrated lattice test AUC: 0.8433583974838257

png

گروه مشبک کالیبره شده

هنگامی که تعداد ویژگی ها زیاد است ، می توانید از یک مدل گروهی استفاده کنید ، که چندین شبکه کوچکتر را برای زیر مجموعه ویژگی ها ایجاد می کند و به جای ایجاد یک شبکه بزرگ ، خروجی آنها را متوسط ​​می کند. مدل های شبکه گروه با استفاده از ساخته tfl.configs.CalibratedLatticeEnsembleConfig . یک مدل مجموعه شبکه کالیبره شده ، بر روی ویژگی ورودی ، کالیبراسیون خطی و دسته ای را اعمال می کند ، و پس از آن مجموعه ای از مدل های شبکه و یک کالیبراسیون قطعه خطی خروجی اختیاری.

گروه مشبک تصادفی

پیکربندی مدل زیر از زیر مجموعه ای تصادفی از ویژگی ها برای هر شبکه استفاده می کند.

# 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.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)
Random ensemble test AUC: 0.902255654335022

png

گروه شبکه RTL شبکه تصادفی

مدل پیکربندی زیر با استفاده از یک tfl.layers.RTL لایه است که با استفاده از یک زیر مجموعه تصادفی از امکانات را برای هر یک از شبکه. توجه داشته باشید که tfl.layers.RTL تنها پشتیبانی از محدودیت های یکنواختی و باید به اندازه شبکه همان برای تمام ویژگی های و تنظیم هر ویژگی را دارند. توجه داشته باشید که با استفاده از یک tfl.layers.RTL لایه اجازه می دهد تا شما را به گروه بسیار بزرگ تر از با استفاده جداگانه مقیاس 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.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)
Random ensemble test AUC: 0.9241854548454285

png

گروه مشبک کریستال

TFL همچنین یک الگوریتم آرایش ویژگی اکتشافی، به نام فراهم می کند کریستال . کریستال الگوریتم قطار ابتدا مدل prefitting که برآوردهای دو به دو فعل و انفعالات ویژگی. سپس مجموعه نهایی را طوری تنظیم می کند که ویژگی های دارای فعل و انفعالات غیر خطی بیشتر در یک شبکه باشد.

برای مدل های کریستال، شما همچنین نیاز به ارائه یک prefitting_input_fn است که برای آموزش مدل prefitting، همانطور که در بالا توضیح داده شد. مدل پیش ساخته نیازی به آموزش کامل ندارد ، بنابراین چند دوره باید کافی باشد.

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)

بعد از آن شما می توانید یک مدل کریستال با تنظیم ایجاد lattice='crystals' در پیکربندی مدل.

# 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.Adam(LEARNING_RATE),
    prefitting_optimizer=tf.keras.optimizers.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)
Crystals ensemble test AUC: 0.8859649300575256

png

شما می توانید کالیبراتورهای ویژگی با جزئیات بیشتر با استفاده از رسم tfl.visualization ماژول.

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

png

png