Tensorflow估计器:切换到autumn_interpolation以获取模型的正确PR-AUC

Ash*_*man 3 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
    )
Run Code Online (Sandbox Code Playgroud)

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

警告:tensorflow:梯形规则会产生不正确的PR-AUC。请改用“ careful_interpolation”。

我如何才能切换到autumn_interpolation以从该evaluate()方法获得正确的结果?

Tensorflow版本: 1.8

E_n*_*ate 7

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

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

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

它具有为产生概率预测的任何估计器工作的优势,但仍然需要为每个评估计算出覆盖指标。甲DNNClassifier估计器提供逻辑值下键(0和1之间)'logistic'(在罐头估计可能的密钥的列表是这里)。对于其他估计量头来说,情况可能并非总是如此,但是可能有其他选择:在使用构造的多标签分类器中tf.contrib.estimator.multi_label_headlogistic不可用,但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)
Run Code Online (Sandbox Code Playgroud)

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


'trapezoidal'尽管文档表明谨慎地插值是“严格首选”的,但还有一个默认默认求和方法仍为默认值的原因。如请求请求#19079中所述,更改将明显向后不兼容。对同一请求请求的后续注释提出了上述解决方法。