التحقق من صحة نموذج تحليل نموذج Tensorflow

ملخص

يدعم TFMA التحقق من صحة النموذج من خلال إعداد حدود القيمة وتغيير الحدود بناءً على المقاييس المدعومة .

إعدادات

GenericValueThreshold

تعتبر عتبة القيمة مفيدة لبوابة النموذج المرشح عن طريق التحقق مما إذا كانت المقاييس المقابلة أكبر من الحد الأدنى و/أو أصغر من الحد الأعلى. يمكن للمستخدم تعيين إحدى القيمتين Lower_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

يعد تغيير عتبة مفيدًا لبوابة النموذج المرشح عن طريق التحقق مما إذا كان المقياس المقابل أكبر/أصغر من مقياس النموذج الأساسي. هناك طريقتان لقياس التغيير: التغيير المطلق والتغيير النسبي. يتم حساب التغيير المطلق على أنه فرق القيمة بين مقاييس النموذج المرشح والنموذج الأساسي، أي 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 المحفوظ) ومقاييس ما بعد التدريب (المحددة في تكوين 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 }
      }
    }
  }