Tensorflow モデル分析 モデルの検証

概要

TFMA は、サポートされているメトリックに基づいて値のしきい値と変更しきい値を設定することにより、モデルの検証をサポートします。

構成

一般的な値のしきい値

値のしきい値は、対応するメトリクスが下限よりも大きいか、上限よりも小さいかどうかをチェックすることにより、候補モデルをゲートするのに役立ちます。ユーザーは、 lower_bound 値と upper_bound 値のいずれかまたは両方を設定できます。 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

変更しきい値は、対応するメトリックがベースライン モデルのメトリックより大きいか小さいかをチェックすることにより、候補モデルをゲートするのに役立ちます。変化を測定するには、絶対変化と相対変化の 2 つの方法があります。絶対変化は、候補モデルとベースライン モデルのメトリック間の値の差、つまり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)

設定を proto 形式で書き留めた方が読みやすいかもしれません。

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 }
      }
    }
  }