在我的项目中,我使用的是预制估算器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
不幸的是,使用预制的估算器几乎没有自由定制评估过程。当前,a DNNClassifier似乎没有提供其他方法来调整评估指标的方法。
尽管不是理想的解决方案,但一种解决方案是使用tf.contrib.metrics.add_metrics,使用所需度量来扩充估算器,如果将完全相同的键分配给新度量,它将替换旧度量:
如果此名称与估算器现有指标之间存在名称冲突,则它将覆盖现有指标。
它具有为产生概率预测的任何估计器工作的优势,但仍然需要为每个评估计算出覆盖指标。甲DNNClassifier估计器提供逻辑值下键(0和1之间)'logistic'(在罐头估计可能的密钥的列表是这里)。对于其他估计量头来说,情况可能并非总是如此,但是可能有其他选择:在使用构造的多标签分类器中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)
Run Code Online (Sandbox Code Playgroud)
在评估时,警告消息仍然会出现,但是会在不久后调用经过仔细插值的AUC。将此度量分配给其他键也将允许您检查两种求和方法之间的差异。我对多标签逻辑回归任务的测试表明,测量结果的确可能略有不同:auc_precision_recall = 0.05173396,auc_precision_recall_careful = 0.05059402。
'trapezoidal'尽管文档表明谨慎地插值是“严格首选”的,但还有一个默认默认求和方法仍为默认值的原因。如请求请求#19079中所述,更改将明显向后不兼容。对同一请求请求的后续注释提出了上述解决方法。
| 归档时间: |
|
| 查看次数: |
2001 次 |
| 最近记录: |