مقاييس ومؤامرات تحليل نموذج Tensorflow

ملخص

يدعم TFMA المقاييس والمخططات التالية:

  • مقاييس keras القياسية ( tf.keras.metrics.* )
    • لاحظ أنك لا تحتاج إلى نموذج keras لاستخدام مقاييس keras. يتم حساب المقاييس خارج الرسم البياني في الحزمة باستخدام فئات المقاييس مباشرة.
  • مقاييس ومخططات TFMA القياسية ( tfma.metrics.* )

  • مقاييس keras المخصصة (المقاييس المشتقة من tf.keras.metrics.Metric )

  • مقاييس TFMA المخصصة (المقاييس المشتقة من tfma.metrics.Metric ) باستخدام مجمعات الشعاع المخصصة أو المقاييس المشتقة من مقاييس أخرى).

يوفر TFMA أيضًا دعمًا مدمجًا لتحويل مقاييس التصنيف الثنائية للاستخدام مع مشكلات متعددة الفئات/متعددة الملصقات:

  • الثنائية على أساس معرف الفئة، أعلى K، وما إلى ذلك.
  • المقاييس المجمعة بناءً على المتوسط ​​الجزئي، والمتوسط ​​الكلي، وما إلى ذلك.

يوفر TFMA أيضًا دعمًا مدمجًا للمقاييس القائمة على الاستعلام/التصنيف حيث يتم تجميع الأمثلة بواسطة مفتاح استعلام تلقائيًا في المسار.

يوجد مجتمعة أكثر من 50 مقياسًا ومخططًا قياسيًا متاحًا لمجموعة متنوعة من المشكلات بما في ذلك الانحدار والتصنيف الثنائي والتصنيف متعدد الفئات/متعدد العلامات والتصنيف وما إلى ذلك.

إعدادات

هناك طريقتان لتكوين المقاييس في TFMA: (1) باستخدام tfma.MetricsSpec أو (2) عن طريق إنشاء مثيلات لفئات tf.keras.metrics.* و/أو tfma.metrics.* في python واستخدام tfma.metrics.specs_from_metrics لتحويلها إلى قائمة tfma.MetricsSpec .

تصف الأقسام التالية أمثلة على التكوينات لأنواع مختلفة من مشكلات التعلم الآلي.

مقاييس الانحدار

ما يلي هو مثال لإعداد التكوين لمشكلة الانحدار. راجع tf.keras.metrics.* و tfma.metrics.* لمعرفة المقاييس الإضافية المحتملة المدعومة.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "MeanSquaredError" }
    metrics { class_name: "Accuracy" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics {
      class_name: "CalibrationPlot"
      config: '"min_value": 0, "max_value": 10'
    }
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.MeanSquaredError(name='mse'),
    tf.keras.metrics.Accuracy(name='accuracy'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.CalibrationPlot(
        name='calibration', min_value=0, max_value=10)
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

لاحظ أن هذا الإعداد متاح أيضًا عن طريق استدعاء tfma.metrics.default_regression_specs .

مقاييس التصنيف الثنائي

ما يلي هو مثال لإعداد التكوين لمشكلة التصنيف الثنائي. راجع tf.keras.metrics.* و tfma.metrics.* لمعرفة المقاييس الإضافية المحتملة المدعومة.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "ConfusionMatrixPlot" }
    metrics { class_name: "CalibrationPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.BinaryCrossentropy(name='binary_crossentropy'),
    tf.keras.metrics.BinaryAccuracy(name='accuracy'),
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    tf.keras.metrics.AUC(
        name='auc_precision_recall', curve='PR', num_thresholds=10000),
    tf.keras.metrics.Precision(name='precision'),
    tf.keras.metrics.Recall(name='recall'),
    tfma.metrics.MeanLabel(name='mean_label'),
    tfma.metrics.MeanPrediction(name='mean_prediction'),
    tfma.metrics.Calibration(name='calibration'),
    tfma.metrics.ConfusionMatrixPlot(name='confusion_matrix_plot'),
    tfma.metrics.CalibrationPlot(name='calibration_plot')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

لاحظ أن هذا الإعداد متاح أيضًا عن طريق استدعاء tfma.metrics.default_binary_classification_specs .

مقاييس التصنيف متعددة الفئات/متعددة الملصقات

ما يلي هو مثال لإعداد التكوين لمشكلة تصنيف متعددة الفئات. راجع tf.keras.metrics.* و tfma.metrics.* لمعرفة المقاييس الإضافية المحتملة المدعومة.

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "SparseCategoricalCrossentropy" }
    metrics { class_name: "SparseCategoricalAccuracy" }
    metrics { class_name: "Precision" config: '"top_k": 1' }
    metrics { class_name: "Precision" config: '"top_k": 3' }
    metrics { class_name: "Recall" config: '"top_k": 1' }
    metrics { class_name: "Recall" config: '"top_k": 3' }
    metrics { class_name: "MultiClassConfusionMatrixPlot" }
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    tfma.metrics.ExampleCount(name='example_count'),
    tf.keras.metrics.SparseCategoricalCrossentropy(
        name='sparse_categorical_crossentropy'),
    tf.keras.metrics.SparseCategoricalAccuracy(name='accuracy'),
    tf.keras.metrics.Precision(name='precision', top_k=1),
    tf.keras.metrics.Precision(name='precision', top_k=3),
    tf.keras.metrics.Recall(name='recall', top_k=1),
    tf.keras.metrics.Recall(name='recall', top_k=3),
    tfma.metrics.MultiClassConfusionMatrixPlot(
        name='multi_class_confusion_matrix_plot'),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

لاحظ أن هذا الإعداد متاح أيضًا عن طريق استدعاء tfma.metrics.default_multi_class_classification_specs .

مقاييس ثنائية متعددة الفئات/متعددة العلامات

يمكن تحويل المقاييس متعددة الفئات/المسميات المتعددة إلى مقاييس ثنائية لإنتاج مقاييس لكل فئة، ولكل top_k، وما إلى ذلك باستخدام tfma.BinarizationOptions . على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    binarize: { class_ids: { values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] } }
    // Metrics to binarize
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    // Metrics to binarize
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, binarize=tfma.BinarizationOptions(
        class_ids={'values': [0,1,2,3,4,5,6,7,8,9]}))

مقاييس مجمعة متعددة الفئات/متعددة العلامات

يمكن تجميع مقاييس متعددة الفئات/متعددة التصنيفات لإنتاج قيمة مجمعة واحدة لمقياس تصنيف ثنائي باستخدام tfma.AggregationOptions .

لاحظ أن إعدادات التجميع مستقلة عن إعدادات الثنائية بحيث يمكنك استخدام كل من tfma.AggregationOptions و tfma.BinarizationOptions في نفس الوقت.

المتوسط ​​الجزئي

يمكن إجراء المتوسط ​​الجزئي باستخدام خيار micro_average ضمن tfma.AggregationOptions . على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: { micro_average: true }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, aggregate=tfma.AggregationOptions(micro_average=True))

يدعم المتوسط ​​الدقيق أيضًا إعداد top_k حيث يتم استخدام قيم k العليا فقط في الحساب. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      micro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(micro_average=True,
                                      top_k_list={'values': [1, 3]}))

ماكرو / متوسط ​​ماكرو مرجح

يمكن إجراء متوسط ​​الماكرو باستخدام خيارات macro_average أو weighted_macro_average ضمن tfma.AggregationOptions . ما لم يتم استخدام إعدادات top_k ، يتطلب الماكرو تعيين class_weights لمعرفة الفئات التي سيتم حساب المتوسط ​​لها. إذا لم يتم توفير class_weight ، فسيتم افتراض 0.0. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      class_weights: { key: 0 value: 1.0 }
      class_weights: { key: 1 value: 1.0 }
      class_weights: { key: 2 value: 1.0 }
      class_weights: { key: 3 value: 1.0 }
      class_weights: { key: 4 value: 1.0 }
      class_weights: { key: 5 value: 1.0 }
      class_weights: { key: 6 value: 1.0 }
      class_weights: { key: 7 value: 1.0 }
      class_weights: { key: 8 value: 1.0 }
      class_weights: { key: 9 value: 1.0 }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(
        macro_average=True, class_weights={i: 1.0 for i in range(10)}))

مثل المتوسط ​​الجزئي، يدعم المتوسط ​​الكلي أيضًا إعداد top_k حيث يتم استخدام قيم k العليا فقط في الحساب. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    aggregate: {
      macro_average: true
      top_k_list: { values: [1, 3] }
    }
    // Metrics to aggregate
    metrics { class_name: "AUC" }
    ...
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    // Metrics to aggregate
    tf.keras.metrics.AUC(name='auc', num_thresholds=10000),
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics,
    aggregate=tfma.AggregationOptions(macro_average=True,
                                      top_k_list={'values': [1, 3]}))

الاستعلام / الترتيب المقاييس القائمة

يتم تمكين المقاييس المستندة إلى الاستعلام/التصنيف عن طريق تحديد خيار query_key في مواصفات المقاييس. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    query_key: "doc_id"
    metrics {
      class_name: "NDCG"
      config: '"gain_key": "gain", "top_k_list": [1, 2]'
    }
    metrics { class_name: "MinLabelPosition" }
  }
""", tfma.EvalConfig()).metrics_specs

يمكن إنشاء هذا الإعداد نفسه باستخدام كود بايثون التالي:

metrics = [
    tfma.metrics.NDCG(name='ndcg', gain_key='gain', top_k_list=[1, 2]),
    tfma.metrics.MinLabelPosition(name='min_label_position')
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics, query_key='doc_id')

مقاييس التقييم متعددة النماذج

يدعم TFMA تقييم نماذج متعددة في نفس الوقت. عند إجراء تقييم متعدد النماذج، سيتم حساب المقاييس لكل نموذج. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    # no model_names means all models
    ...
  }
""", tfma.EvalConfig()).metrics_specs

إذا كانت هناك حاجة إلى حساب المقاييس لمجموعة فرعية من النماذج، فقم بتعيين model_names في metric_specs . على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    model_names: ["my-model1"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

تدعم واجهة برمجة التطبيقات specs_from_metrics أيضًا تمرير أسماء النماذج:

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, model_names=['my-model1'])

مقاييس مقارنة النماذج

يدعم TFMA تقييم مقاييس المقارنة لنموذج مرشح مقابل نموذج أساسي. هناك طريقة بسيطة لإعداد زوج النموذج المرشح والنموذج الأساسي وهي تمرير نموذج eval_shared_model بأسماء النماذج المناسبة (tfma.BASELINE_KEY وtfma.CANDIDATE_KEY):


eval_config = text_format.Parse("""
  model_specs {
    # ... model_spec without names ...
  }
  metrics_spec {
    # ... metrics ...
  }
""", tfma.EvalConfig())

eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path='/path/to/saved/candidate/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 تقييم المقاييس على النماذج التي لها مخرجات مختلفة. تقوم النماذج متعددة المخرجات بتخزين توقعات المخرجات الخاصة بها في شكل إملاء مرتبط باسم المخرج. عند استخدام نماذج متعددة المخرجات، يجب تحديد أسماء المخرجات المرتبطة بمجموعة من المقاييس في قسم output_names في MetricsSpec. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    output_names: ["my-output"]
    ...
  }
""", tfma.EvalConfig()).metrics_specs

تدعم واجهة برمجة التطبيقات specs_from_metrics أيضًا تمرير أسماء المخرجات:

metrics = [
    ...
]
metrics_specs = tfma.metrics.specs_from_metrics(
    metrics, output_names=['my-output'])

تخصيص إعدادات القياس

يسمح TFMA بتخصيص الإعدادات المستخدمة مع مقاييس مختلفة. على سبيل المثال، قد ترغب في تغيير الاسم، وتعيين الحدود، وما إلى ذلك. ويتم ذلك عن طريق إضافة قسم config إلى تكوين المقياس. يتم تحديد التكوين باستخدام إصدار سلسلة JSON للمعلمات التي سيتم تمريرها إلى أسلوب المقاييس __init__ (لسهولة الاستخدام، قد يتم حذف الأقواس البادئة واللاحقة '{' و '}'). على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics {
      class_name: "ConfusionMatrixAtThresholds"
      config: '"thresholds": [0.3, 0.5, 0.8]'
    }
  }
""", tfma.MetricsSpec()).metrics_specs

هذا التخصيص مدعوم بالطبع أيضًا بشكل مباشر:

metrics = [
   tfma.metrics.ConfusionMatrixAtThresholds(thresholds=[0.3, 0.5, 0.8]),
]
metrics_specs = tfma.metrics.specs_from_metrics(metrics)

النواتج

إن مخرجات التقييم المتري عبارة عن سلسلة من مفاتيح/قيم القياس و/أو مفاتيح/قيم الرسم بناءً على التكوين المستخدم.

مفاتيح مترية

يتم تعريف MetricKeys باستخدام نوع مفتاح منظم. يحدد هذا المفتاح بشكل فريد كل جانب من الجوانب التالية للمقياس:

  • اسم المقياس ( auc ، mean_label ، إلخ)
  • اسم النموذج (يستخدم فقط في حالة التقييم متعدد النماذج)
  • اسم المخرجات (يستخدم فقط في حالة تقييم النماذج متعددة المخرجات)
  • المفتاح الفرعي (على سبيل المثال معرف الفئة إذا كان النموذج متعدد الفئات ثنائيًا)

القيمة المترية

يتم تعريف MetricValues ​​باستخدام نموذج أولي يتضمن أنواع القيم المختلفة التي تدعمها المقاييس المختلفة (على سبيل المثال double و ConfusionMatrixAtThresholds وما إلى ذلك).

فيما يلي أنواع قيم المقاييس المدعومة:

  • double_value - غلاف لنوع مزدوج.
  • bytes_value - قيمة البايتات.
  • bounded_value - يمثل قيمة حقيقية يمكن أن تكون تقديرًا نقطيًا، اختياريًا بحدود تقريبية من نوع ما. يحتوي على value الخصائص، lower_bound ، و upper_bound .
  • value_at_cutoffs - القيمة عند القطع (على سبيل المثال الدقة@K، استدعاء@K). يحتوي على values خصائص، ولكل منها خصائص cutoff value .
  • confusion_matrix_at_thresholds - مصفوفة الارتباك عند العتبات. يحتوي على matrices خصائص، كل واحدة منها لها خصائص لقيم مصفوفة threshold precision recall والارتباك مثل false_negatives .
  • array_value - للمقاييس التي تُرجع مصفوفة من القيم.

مفاتيح المؤامرة

تشبه PlotKeys المفاتيح المترية باستثناء أنه لأسباب تاريخية، يتم تخزين جميع قيم المخططات في نموذج أولي واحد بحيث لا يكون لمفتاح المخطط اسم.

قيم المؤامرة

يتم تخزين جميع المخططات المدعومة في نموذج أولي واحد يسمى PlotData .

EvalResult

العائد من عملية التقييم هو tfma.EvalResult . يحتوي هذا السجل على slicing_metrics التي تشفر المفتاح المتري كإملاء متعدد المستويات حيث تتوافق المستويات مع اسم الإخراج ومعرف الفئة واسم المقياس وقيمة المقياس على التوالي. تم تصميم هذا ليتم استخدامه لعرض واجهة المستخدم في دفتر ملاحظات Jupiter. إذا كان الوصول إلى البيانات الأساسية مطلوبًا، فيجب استخدام ملف نتائج metrics بدلاً من ذلك (راجع metrics_for_slice.proto ).

التخصيص

بالإضافة إلى المقاييس المخصصة التي تتم إضافتها كجزء من keras المحفوظة (أو EvalSavedModel القديم). هناك طريقتان لتخصيص المقاييس في حفظ ما بعد TFMA: (1) عن طريق تحديد فئة قياس keras مخصصة و(2) عن طريق تحديد فئة مقاييس TFMA مخصصة مدعومة بمجمع شعاع.

في كلتا الحالتين، يتم تكوين المقاييس عن طريق تحديد اسم فئة المقياس والوحدة المرتبطة به. على سبيل المثال:

from google.protobuf import text_format

metrics_specs = text_format.Parse("""
  metrics_specs {
    metrics { class_name: "MyMetric" module: "my.module"}
  }
""", tfma.EvalConfig()).metrics_specs

مقاييس Keras المخصصة

لإنشاء مقياس keras مخصص، يحتاج المستخدمون إلى توسيع tf.keras.metrics.Metric مع التنفيذ ثم التأكد من توفر وحدة المقياس في وقت التقييم.

لاحظ أنه بالنسبة للمقاييس المضافة لحفظ نموذج النشر، يدعم TFMA فقط المقاييس التي تأخذ التصنيف (أي y_true)، والتنبؤ (y_pred)، ووزن المثال (sample_weight) كمعلمات لطريقة update_state .

مثال متري كيراس

فيما يلي مثال لمقياس keras المخصص:

class MyMetric(tf.keras.metrics.Mean):

  def __init__(self, name='my_metric', dtype=None):
    super(MyMetric, self).__init__(name=name, dtype=dtype)

  def update_state(self, y_true, y_pred, sample_weight=None):
    return super(MyMetric, self).update_state(
        y_pred, sample_weight=sample_weight)

مقاييس TFMA المخصصة

لإنشاء مقياس TFMA مخصص، يحتاج المستخدمون إلى توسيع tfma.metrics.Metric مع التنفيذ ثم التأكد من توفر وحدة المقياس في وقت التقييم.

متري

يتكون تطبيق tfma.metrics.Metric من مجموعة من kwargs التي تحدد تكوين المقاييس إلى جانب وظيفة لإنشاء الحسابات (ربما المتعددة) اللازمة لحساب قيمة المقاييس. هناك نوعان رئيسيان من العمليات الحسابية يمكن استخدامهما: tfma.metrics.MetricComputation و tfma.metrics.DerivedMetricComputation الموضحين في الأقسام أدناه. سيتم تمرير الوظيفة التي تنشئ هذه الحسابات المعلمات التالية كمدخلات:

  • eval_config: tfam.EvalConfig
    • تم تمرير تكوين التقييم إلى المقيم (مفيد للبحث عن إعدادات مواصفات النموذج مثل مفتاح التنبؤ المراد استخدامه، وما إلى ذلك).
  • model_names: List[Text]
    • قائمة بأسماء النماذج التي سيتم حساب المقاييس لها (لا شيء إذا كان النموذج فرديًا)
  • output_names: List[Text] .
    • قائمة بأسماء المخرجات لحساب المقاييس (لا شيء إذا كان النموذج فرديًا)
  • sub_keys: List[tfma.SubKey] .
    • قائمة المفاتيح الفرعية (معرف الفئة، أعلى K، إلخ) لحساب المقاييس لـ (أو لا شيء)
  • aggregation_type: tfma.AggregationType
    • نوع التجميع في حالة حساب مقياس التجميع.
  • class_weights: Dict[int, float] .
    • أوزان الفئة المستخدمة في حالة حساب مقياس التجميع.
  • query_key: Text
    • مفتاح الاستعلام المستخدم في حالة حساب مقياس قائم على الاستعلام/التصنيف.

إذا لم يكن المقياس مرتبطًا بواحد أو أكثر من هذه الإعدادات، فقد يترك هذه المعلمات خارج تعريف التوقيع الخاص به.

إذا تم حساب المقياس بنفس الطريقة لكل نموذج ومخرج ومفتاح فرعي، فيمكن استخدام الأداة المساعدة tfma.metrics.merge_per_key_computations لإجراء نفس الحسابات لكل من هذه المدخلات بشكل منفصل.

حساب المتري

يتكون MetricComputation من مجموعة من preprocessors ووحدة combiner . preprocessors عبارة عن قائمة من preprocessor ، وهي عبارة عن حزمة من beam.DoFn DoFn التي تأخذ المستخلصات كمدخلات لها وتخرج الحالة الأولية التي سيتم استخدامها بواسطة الموحد (انظر البنية لمزيد من المعلومات حول المستخلصات). سيتم تنفيذ كافة المعالجات المسبقة بالتسلسل حسب ترتيب القائمة. إذا كانت preprocessors فارغة، فسيتم تمرير الموحد StandardMetricInputs (تحتوي مدخلات القياس القياسية على تسميات وتنبؤات وexample_weights). combiner عبارة عن beam.CombineFn CombineFn تأخذ مجموعة من (مفتاح الشريحة، مخرجات المعالج المسبق) كمدخل لها وتخرج مجموعة من (slice_key، نتائج القياس) كنتيجة لها.

لاحظ أن التقطيع يحدث بين preprocessors combiner .

لاحظ أنه إذا كان الحساب المتري يريد الاستفادة من كل من المدخلات المترية القياسية، ولكن مع زيادة عدد قليل من الميزات من مقتطفات features ، فيمكن استخدام الميزة الخاصة للمعالج المسبق والتي ستدمج الميزات المطلوبة من أدوات الدمج المتعددة في أداة واحدة واحدة قيمة StandardMetricsInputs المشتركة التي يتم تمريرها إلى جميع المجمعات (المجمعات مسؤولة عن قراءة الميزات التي تهمها وتجاهل الباقي).

مثال

فيما يلي مثال بسيط جدًا لتعريف متري TFMA لحساب عدد الأمثلة:

class ExampleCount(tfma.metrics.Metric):

  def __init__(self, name: Text = 'example_count'):
    super(ExampleCount, self).__init__(_example_count, name=name)


def _example_count(
    name: Text = 'example_count') -> tfma.metrics.MetricComputations:
  key = tfma.metrics.MetricKey(name=name)
  return [
      tfma.metrics.MetricComputation(
          keys=[key],
          preprocessors=[_ExampleCountPreprocessor()],
          combiner=_ExampleCountCombiner(key))
  ]


class ExampleCountTest(tfma.test.testutil.TensorflowModelAnalysisTest):

  def testExampleCount(self):
    metric = ExampleCount()
    computations = metric.computations(example_weighted=False)
    computation = computations[0]

    with beam.Pipeline() as pipeline:
      result = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'PreProcess' >> beam.ParDo(computation.preprocessors[0])
          | 'Process' >> beam.Map(tfma.metrics.to_standard_metric_inputs)
          | 'AddSlice' >> beam.Map(lambda x: ((), x))
          | 'ComputeMetric' >> beam.CombinePerKey(computation.combiner)
      )

      def check_result(got):
        try:
          self.assertLen(got, 1)
          got_slice_key, got_metrics = got[0]
          self.assertEqual(got_slice_key, ())
          key = computation.keys[0]
          self.assertIn(key, got_metrics)
          self.assertAlmostEqual(got_metrics[key], expected_value, places=5)
        except AssertionError as err:
          raise util.BeamAssertException(err)

      util.assert_that(result, check_result, label='result')

class _ExampleCountPreprocessor(beam.DoFn):

  def process(self, extracts: tfma.Extracts) -> Iterable[int]:
    yield 1


class _ExampleCountPreprocessorTest(unittest.TestCase):

  def testExampleCountPreprocessor(self):
    ...  # Init the test case here
    with beam.Pipeline() as pipeline:
      updated_pcoll = (
          pipeline
          | 'Create' >> beam.Create([...])  # Add inputs
          | 'Preprocess'
          >> beam.ParDo(
              _ExampleCountPreprocessor()
          )
      )

      beam_testing_util.assert_that(
          updated_pcoll,
          lambda result: ...,  # Assert the test case
      )


class _ExampleCountCombiner(beam.CombineFn):

  def __init__(self, metric_key: tfma.metrics.MetricKey):
    self._metric_key = metric_key

  def create_accumulator(self) -> int:
    return 0

  def add_input(self, accumulator: int, state: int) -> int:
    return accumulator + state

  def merge_accumulators(self, accumulators: Iterable[int]) -> int:
    accumulators = iter(accumulators)
    result = next(accumulator)
    for accumulator in accumulators:
      result += accumulator
    return result

  def extract_output(self,
                     accumulator: int) -> Dict[tfma.metrics.MetricKey, int]:
    return {self._metric_key: accumulator}

حساب المشتقات

يتكون DerivedMetricComputation من دالة نتيجة تُستخدم لحساب القيم المترية بناءً على مخرجات الحسابات المترية الأخرى. تأخذ دالة النتيجة إملاءًا للقيم المحسوبة كمدخل لها وتخرج إملاءً لنتائج القياس الإضافية.

لاحظ أنه من المقبول (الموصى به) تضمين الحسابات التي تعتمد عليها الحسابات المشتقة في قائمة الحسابات التي تم إنشاؤها بواسطة المقياس. يؤدي هذا إلى تجنب الاضطرار إلى إنشاء الحسابات المشتركة وتمريرها بين مقاييس متعددة. سيقوم المقيِّم تلقائيًا بإلغاء الحسابات المكررة التي لها نفس التعريف بحيث يتم تشغيل عملية حسابية واحدة فعليًا.

مثال

توفر مقاييس TJUR مثالاً جيدًا للمقاييس المشتقة.