2017-12-11 2 views
0

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?

+0

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

Antwort

1

Ok, also konnte ich es herausfinden. Ich kann meine Metrik in eine Metrik einbetten und deren update_op verwenden. Das scheint für mich zu funktionieren.

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) 

    m_r_sq, update_rsq_op = tf.metrics.mean(r_sq) 

    if metrics_collections: 
     ops.add_to_collections(metrics_collections, m_r_sq) 

    if updates_collections: 
     ops.add_to_collections(updates_collections, update_rsq_op) 

    return m_r_sq, update_rsq_op 
Verwandte Themen