احفظ التاريخ! يعود مؤتمر Google I / O من 18 إلى 20 مايو. سجل الآن
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

TF مقدرات شعرية معلبة

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

ملخص

المقدرات المعلبة هي طرق سريعة وسهلة لتدريب نماذج 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 (القلب):

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 ، والتي تشبه مدخلات التدريب_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)))

ميزة Configs

يتم تعيين معايرة الميزات والتكوينات لكل ميزة باستخدام tfl.configs.FeatureConfig . تتضمن تكوينات الميزات قيود الرتابة ، وتنظيم كل ميزة (انظر tfl.configs.RegularizerConfig ) ، وأحجام الشبكة لنماذج الشبكة.

إذا لم يتم تحديد تكوين لميزة الإدخال ، tfl.config.FeatureConfig استخدام التكوين الافتراضي في 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 . وهو يطبق معايرة جزئية وخطية فئوية على ميزات الإدخال ، متبوعة بمجموعة خطية ومعايرة اختيارية لمعايرة خطية للإخراج. عند استخدام معايرة الإخراج أو عند تحديد حدود الإخراج ، ستطبق الطبقة الخطية المتوسط ​​المرجح على المدخلات المعايرة.

ينشئ هذا المثال نموذجًا خطيًا معايرًا على الميزات الخمس الأولى. نحن نستخدم 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

بي إن جي

نموذج شبكي معاير

يتم إنشاء نموذج شبكي مُعاير باستخدام tfl.configs.CalibratedLatticeConfig . يطبق النموذج الشبكي المعاير معايرة خطية وقطعية متعددة التعريف على ميزات الإدخال ، متبوعة بنموذج شبكي ومعايرة اختيارية متعددة الخطوط للخرج.

ينشئ هذا المثال نموذجًا شبكيًا معايرًا على الميزات الخمس الأولى.

# 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

بي إن جي

فرقة شعرية معايرة

عندما يكون عدد الميزات كبيرًا ، يمكنك استخدام نموذج مجموعة ، والذي يقوم بإنشاء شبكات متعددة أصغر لمجموعات فرعية من الميزات ويقيم متوسط ​​إنتاجها بدلاً من إنشاء شبكة واحدة ضخمة فقط. يتم إنشاء نماذج شعرية المجموعة باستخدام 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

بي إن جي

RTL Layer Random Lattice فرقة

يستخدم تكوين النموذج التالي طبقة tfl.layers.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

بي إن جي

مجموعة بلورات شعرية

يوفر TFL أيضًا خوارزمية ترتيب ميزة إرشادية ، تسمى البلورات . تقوم خوارزمية البلورات أولاً بتدريب نموذج تفضيلي يقدر تفاعلات الميزات الزوجية. ثم يقوم بترتيب المجموعة النهائية بحيث تكون الميزات ذات التفاعلات غير الخطية في نفس المشابك.

بالنسبة لنماذج Crystals ، ستحتاج أيضًا إلى توفير prefitting_input_fn الذي يتم استخدامه لتدريب نموذج التهيئة ، كما هو موضح أعلاه. لا يحتاج نموذج التهيئة إلى التدريب الكامل ، لذا يجب أن تكون بعض العهود كافية.

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

بي إن جي

يمكنك tfl.visualization معايرة الميزات بمزيد من التفاصيل باستخدام وحدة tfl.visualization .

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

بي إن جي

بي إن جي