在我的项目中,我正在使用预制估算器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
答案 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一样,更改将明显向后不兼容。随后对同一请求请求的注释提出了上述解决方法。