Estimador de flujo de tensión: cambio a interpolación cuidadosa para obtener el PR-AUC correcto de un modelo

En mi proyecto, estoy usando el estimador DNNClassifier . Aquí está mi estimador:

 model = tf.estimator.DNNClassifier( hidden_units=network, feature_columns=feature_cols, n_classes= 2, activation_fn=tf.nn.relu, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.1, l1_regularization_strength=0.001 ), config=chk_point_run_config, model_dir=MODEL_CHECKPOINT_DIR ) 

cuando evalúo el modelo usando eval_res = model.evaluate(..) , recibo la siguiente advertencia:

ADVERTENCIA: tensorflow: se sabe que la regla trapezoidal produce PR-AUC incorrectas; por favor cambie a “cuidado_interpolación” en su lugar.

¿Cómo puedo cambiar a la interpolación cuidadosa para obtener los resultados correctos del método eval evaluate() ?

Versión Tensorflow: 1.8

Desafortunadamente, el uso de un estimador prefabricado deja poca libertad para personalizar el proceso de evaluación. Actualmente, un DNNClassifier no parece proporcionar un medio para ajustar las métricas de evaluación, al igual que para otros estimadores.

Si bien no es lo ideal, una solución es boost un estimador con las métricas deseadas utilizando tf.contrib.metrics.add_metrics , que reemplazará la métrica antigua si se asigna la misma clave exacta a la nueva:

Si hay un conflicto de nombres entre esto y los estimadores de las métricas existentes, esto anulará el existente.

Viene con la ventaja de trabajar para cualquier estimador que produzca predicciones probabilísticas, a costa de seguir calculando la métrica anulada para cada evaluación. Un estimador DNNClassifier proporciona valores logísticos (entre 0 y 1) bajo la clave 'logistic' (la lista de claves posibles en estimadores enlatados se encuentra aquí ). Es posible que este no sea siempre el caso para otras cabezas estimadoras, pero puede haber alternativas disponibles: en un clasificador de tags múltiples creado con tf.contrib.estimator.multi_label_head , la logistic no está disponible, pero las probabilities se pueden usar en su lugar.

Por lo tanto, el código se vería así:

 def metric_auc(labels, predictions): return { 'auc_precision_recall': tf.metrics.auc( labels=labels, predictions=predictions['logistic'], num_thresholds=200, curve='PR', summation_method='careful_interpolation') } estimator = tf.estimator.DNNClassifier(...) estimator = tf.contrib.estimator.add_metrics(estimator, metric_auc) 

Al evaluar, el mensaje de advertencia seguirá apareciendo, pero poco después se llamará a las AUC con una interpolación cuidadosa. Asignar esta métrica a una clave diferente también le permitiría verificar la discrepancia entre los dos métodos de resumen. Mis pruebas en una tarea de regresión logística de tags múltiples muestran que las mediciones pueden ser ligeramente diferentes: auc_precision_recall = 0.05173396, auc_precision_recall_careful = 0.05059402.


También hay una razón por la cual el método de sum predeterminado sigue siendo 'trapezoidal' , a pesar de la documentación que sugiere que la interpolación cuidadosa es “estrictamente preferida”. Como se comentó en la solicitud de extracción # 19079 , el cambio sería significativamente incompatible hacia atrás. Los comentarios subsiguientes sobre la misma solicitud de extracción sugieren la solución anterior.