Ich möchte Tensorflow, um das Bestimmtheitsmaß (R im Quadrat) während der Auswertung meiner Schätzer zu berechnen. Ich versuchte es in der folgenden Art und Weise zu implementieren loosly basierend auf der Umsetzung der offiziellen Messdaten:Benutzerdefinierte Metriken mit tf.estimator
def r_squared(labels, predictions, weights=None,
metrics_collections=None,
updates_collections=None,
name=None):
total_error = tf.reduce_sum(tf.square(labels - tf.reduce_mean(labels)))
unexplained_error = tf.reduce_sum(tf.square(labels - predictions))
r_sq = 1 - tf.div(unexplained_error, total_error)
# update_rsq_op = ?
if metrics_collections:
ops.add_to_collections(metrics_collections, r_sq)
# if updates_collections:
# ops.add_to_collections(updates_collections, update_rsq_op)
return r_sq #, update_rsq_op
Dann verwende ich diese Funktion als Metrik im EstimatorSpec:
estim_specs = tf.estimator.EstimatorSpec(
...
eval_metric_ops={
'r_squared': r_squared(labels, predictions),
...
})
Dies ist jedoch nicht da meine Implementierung von R squared kein update_op zurückgibt.
TypeError: Values of eval_metric_ops must be (metric_value, update_op) tuples, given: Tensor("sub_4:0", dtype=float64) for key: r_squared
Jetzt frage ich mich, was genau soll das update_op tun? Muss ich tatsächlich ein update_op implementieren oder kann ich irgendwie eine Art Dummy update_op erstellen? Und wenn es notwendig ist, wie würde ich es umsetzen?
Mögliche Duplikat [Custom eval \ _metric \ _ops in Estimator in Tensorflow] (https://stackoverflow.com/questions/45643809/custom-eval-metric-ops-in-estimator-in-tensorflow) – CvW