张量流估计器:切换到仔细的插值,以得到正确的模

2024-04-29 05:56:25 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的项目中,我使用的是预制估计器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(..)评估模型时, 我得到以下警告:

WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.

我如何切换到谨慎的插值以从evaluate()方法得到正确的结果?在

Tensorflow版本:1.8


Tags: columnsto项目configmodeltf估计值network
1条回答
网友
1楼 · 发布于 2024-04-29 05:56:25

不幸的是,使用预先制作的估计器几乎没有自由定制评估过程。目前,DNNClassifier似乎没有提供一种调整评估指标的方法,对于其他估计器也是如此。在

尽管不理想,但一种解决方案是使用^{}用所需的度量来扩充估计器,如果将完全相同的密钥分配给新的度量,则将替换旧的度量:

If there is a name conflict between this and estimators existing metrics, this will override the existing one.

它的优点是为任何产生概率预测的估计器工作,而代价是仍然为每个评估计算覆盖的度量。DNNClassifier估计器在键'logistic'下提供逻辑值(介于0和1之间)(罐装估计器中可能的键列表是here)。对于其他估计器头,这种情况可能并不总是如此,但也可能有其他选择:在用^{}构建的多标签分类器中,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_carriend=0.05059402。在


尽管documentation表明谨慎的插值是“严格优先”的,但默认的求和方法仍然是'trapezoidal',这也是一个原因。作为commented in pull request #19079,该更改将明显向后不兼容。对同一个请求的后续注释建议了上面的解决方法。在

相关问题 更多 >