Tensorflow估算器:切换到careful_interpolation以获得模型的正确PR-AUC

时间:2018-06-14 05:34:13

标签: python tensorflow

在我的项目中,我正在使用预制估算器DNNClassifier。 这是我的估算员:

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
    )

当我使用eval_res = model.evaluate(..)评估模型时, 我收到以下警告:

  

警告:tensorflow:已知梯形法则会产生不正确的PR-AUC;请切换到“careful_interpolation”。

如何切换到careful_interpolation以从evaluate()方法获得正确的结果?

Tensorflow版本:1.8

1 个答案:

答案 0 :(得分:4)

不幸的是,使用预制的估算器几乎没有自由定制评估过程。目前,DNNClassifier似乎还没有提供调整评估指标的方法,就像其他估算器一样。

尽管不理想,一种解决方案是使用tf.contrib.metrics.add_metrics用所需的度量来扩充估计量,如果将完全相同的密钥分配给新的度量,它将替换旧的度量:

  

如果此名称与估算器的现有指标之间存在名称冲突,则会覆盖现有的指标。

它具有为产生概率预测的任何估计器工作的优势,但仍然需要为每个评估计算覆盖指标。 DNNClassifier估计器在键'logistic'下提供逻辑值(0到1之间)(固定估计器中可能的键列表为here)。对于其他估计量头来说,情况可能并非总是如此,但可能有其他选择:在使用tf.contrib.estimator.multi_label_head构建的多标签分类器中,logistic不可用,但可以使用probabilities代替。

因此,代码如下所示:

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)

进行评估时,警告消息仍会出现,但不久后将调用带有仔细插值的AUC。将此度量分配给其他键也将允许您检查两种求和方法之间的差异。我对多标签Logistic回归任务的测试表明,测量结果的确可能略有不同:auc_precision_recall = 0.05173396,auc_precision_recall_careful = 0.05059402。


尽管documentation暗示“严格首选”仔细插值,但默认求和方法仍为'trapezoidal'也是有原因的。与commented in pull request #19079一样,更改将明显向后不兼容。随后对同一请求请求的注释提出了上述解决方法。