אימות מודל ניתוח מודל 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

סף שינוי שימושי כדי להגדיר את המודל המועמד על ידי בדיקה אם המדד המתאים גדול/קטן יותר מזה של מודל בסיס. ישנן שתי דרכים שבהן ניתן למדוד את השינוי: שינוי מוחלט ושינוי יחסי. Aboslute שינוי מחושב כיחס בין diference הערך בין המדדים של המודל המועמד ואת הבסיס, כלומר, 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 ל-gate על מדדי זמן אימון של מודל (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 כאשר אין כשלים. כאשר יש כשלים, מסופק מידע על המדדים המשויכים, הספים והערכים המטריים שנצפו. להלן דוגמה שבה "ספירת_examle_weighted" נכשלת בסף ערך (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 }
      }
    }
  }