اعتبارسنجی مدل تحلیل مدل تنسورفلو

بررسی اجمالی

TFMA از اعتبارسنجی یک مدل با تنظیم آستانه های ارزش و آستانه های تغییر بر اساس معیارهای پشتیبانی شده پشتیبانی می کند.

پیکربندی

GenericValueThreshold

آستانه ارزش برای دروازه‌بندی مدل کاندید با بررسی اینکه آیا معیارهای مربوطه بزرگتر از یک کران پایین و/یا کوچکتر از یک کران بالا هستند مفید است. کاربر می تواند یکی یا هر دو مقدار low_bound و upper_bound را تنظیم کند. اگر تنظیم نشده باشد، low_bound به صورت پیش‌فرض به بی‌نهایت منفی است و اگر تنظیم نشده باشد، upper_bound به صورت پیش‌فرض به بی‌نهایت است.

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0})
upper_bound = tfma.GenericValueThreshold(upper_bound={'value':1})
lower_upper_bound = tfma.GenericValueThreshold(lower_bound={'value':0},
                                               upper_bound={'value':1))

GenericChangeThreshold

آستانه تغییر برای دروازه‌سازی مدل کاندید با بررسی اینکه آیا متریک مربوطه بزرگتر یا کوچکتر از یک مدل پایه است مفید است. دو روش برای اندازه گیری تغییر وجود دارد: تغییر مطلق و تغییر نسبی. تغییر Aboslute به عنوان تفاوت مقدار بین معیارهای مدل کاندید و مدل پایه محاسبه می شود، یعنی v_c - v_b که در آن v_c نشان دهنده مقدار متریک نامزد و v_b نشان دهنده مقدار پایه است. مقدار نسبی تفاوت نسبی بین متریک نامزد و خط مبنا، یعنی v_c/v_b است. آستانه مطلق و نسبی می توانند با هر دو معیار در مدل دروازه وجود داشته باشند. علاوه بر تنظیم مقادیر آستانه، کاربر همچنین باید MetricDirection را پیکربندی کند. برای معیارهایی با مقادیر مطلوب بالاتر (مانند AUC)، جهت را روی HIGHER_IS_BETTER تنظیم کنید، برای معیارهایی با مقادیر مطلوب کمتر (مثلاً ضرر)، جهت را روی LOWER_IS_BETTER تنظیم کنید. آستانه تغییر نیاز به یک مدل پایه برای ارزیابی همراه با مدل کاندید دارد. برای مثال به راهنمای شروع کار مراجعه کنید.

import tensorflow_model_analysis as tfma

absolute_higher_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
absolute_lower_is_better = tfma.GenericChangeThreshold(absolute={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
relative_higher_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                        direction=tfma.MetricDirection.HIGHER_IS_BETTER)
relative_lower_is_better = tfma.GenericChangeThreshold(relative={'value':1},
                                                       direction=tfma.MetricDirection.LOWER_IS_BETTER)
absolute_and_relative = tfma.GenericChangeThreshold(relative={'value':1},
                                                    absolute={'value':0.2},
                                                    direction=tfma.MetricDirection.LOWER_IS_BETTER)

کنار هم قرار دادن چیزها

مثال زیر آستانه های مقدار و تغییر را ترکیب می کند:

import tensorflow_model_analysis as tfma

lower_bound = tfma.GenericValueThreshold(lower_bound={'value':0.7})
relative_higher_is_better =
    tfma.GenericChangeThreshold(relative={'value':1.01},
                                direction=tfma.MetricDirection.HIGHER_IS_BETTER)
auc_threshold = tfma.MetricThreshold(value_threshold=lower_bound,
                                     change_threshold=relative_higher_is_better)

نوشتن پیکربندی در قالب پروتو ممکن است خواناتر باشد:

from google.protobuf import text_format

auc_threshold = text_format.Parse("""
  value_threshold { lower_bound { value: 0.6 } }
  change_threshold { relative { value: 1.01 } }
""", tfma.MetricThreshold())

MetricThreshold را می‌توان روی معیارهای زمان آموزش مدل (هر مدل EvalSavedModel یا مدل ذخیره‌شده Keras) و معیارهای Post Training (تعریف شده در پیکربندی TFMA) تنظیم کرد. برای معیارهای زمان آموزش، آستانه ها در tfma.MetricsSpec مشخص شده اند:

metrics_spec = tfma.MetricSpec(thresholds={'auc': auc_threshold})

برای معیارهای پس از آموزش، آستانه ها مستقیماً در tfma تعریف می شوند.MetricConfig:

metric_config = tfma.MetricConfig(class_name='TotalWeightedExample',
                                  threshold=lower_bound)

در اینجا یک مثال به همراه سایر تنظیمات در EvalConfig آورده شده است:

# Run in a Jupyter Notebook.
from google.protobuf import text_format

eval_config = text_format.Parse("""
  model_specs {
    # This assumes a serving model with a "serving_default" signature.
    label_key: "label"
    example_weight_key: "weight"
  }
  metrics_spec {
    # Training Time metric thresholds
    thresholds {
      key: "auc"
      value: {
        value_threshold {
          lower_bound { value: 0.7 }
        }
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    # Post Training metrics and their thesholds.
    metrics {
      # This assumes a binary classification model.
      class_name: "AUC"
      threshold {
        value_threshold {
          lower_bound { value: 0 }
        }
      }
    }
  }
  slicing_specs {}
  slicing_specs {
    feature_keys: ["age"]
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candiate/model',
      eval_config=eval_config),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path='/path/to/saved/baseline/model',
      eval_config=eval_config),
]

eval_result = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config,
    # This assumes your data is a TFRecords file containing records in the
    # tf.train.Example format.
    data_location="/path/to/file/containing/tfrecords",
    output_path="/path/for/output")

tfma.view.render_slicing_metrics(eval_result)
tfma.load_validation_result(output_path)

خروجی

علاوه بر خروجی فایل متریک توسط ارزیاب، هنگامی که از اعتبارسنجی استفاده می شود، یک فایل "اعتبارسنجی" اضافی نیز خروجی می شود. قالب بارگذاری ValidationResult است. خروجی «validation_ok» را روی True تنظیم می‌کند که هیچ مشکلی وجود نداشته باشد. هنگامی که خرابی وجود دارد، اطلاعاتی در مورد معیارهای مرتبط، آستانه ها و مقادیر متریک مشاهده شده ارائه می شود. مثال زیر مثالی است که در آن "weighted_examle_count" یک آستانه مقدار را شکست می دهد (1.5 کوچکتر از 1.0 نیست، بنابراین شکست):

  validation_ok: False
  metric_validations_per_slice {
    failures {
      metric_key {
        name: "weighted_example_count"
        model_name: "candidate"
      }
      metric_threshold {
        value_threshold {
          upper_bound { value: 1.0 }
        }
      }
      metric_value {
        double_value { value: 1.5 }
      }
    }
  }