我们能否使用内置的tensorflow
优化器来针对特定指标进行优化?如果不能,应该如何实现?例如,如果我想专注于最大化我的分类器的F分数,这是可能的吗?
estimator = tf.estimator.LinearClassifier( feature_columns=feature_cols, config=my_checkpointing_config, model_dir=output_dir, optimizer=lambda: tf.train.FtrlOptimizer( learning_rate=tf.train.exponential_decay( learning_rate=0.1, global_step=tf.train.get_or_create_global_step(), decay_steps=1000, decay_rate=0.96)))
我试图根据获取更好的F分数来优化我的分类器。尽管使用了衰减的learning_rate
和300个训练步骤,我得到的结果仍然不一致。在查看日志中的指标时,我发现precision
、recall
和accuracy
的行为非常不稳定。尽管增加了训练步骤的数量,也没有显著的改善。因此我想,如果我能让优化器更多地关注于提高整体F分数,我可能会得到更好的结果。因此提出了这个问题。我是否遗漏了什么?
回答:
在分类设置中,优化器最小化的是损失,例如交叉熵;像准确率、F分数、精确率、召回率等量本质上是业务指标,它们在优化过程中无法直接最小化。
这个问题在Stack Overflow上以各种形式频繁出现;这里有一些线程,希望能帮助你理清这些概念(虽然它们提到的是准确率、精确率和召回率,但对于F分数的论证是完全相同的):
总结一下,改编我自己的一个(链接的)回答:
损失和像准确率或F分数这样的指标是不同的东西;大体来说,像准确率和F分数这样的指标是从业务角度我们真正感兴趣的,而损失是从数学角度学习算法(优化器)试图最小化的目标函数。更粗略地说,你可以将损失视为业务目标(准确率、F分数等)的“翻译”到数学领域,这种翻译在分类问题中是必要的(在回归问题中,通常损失和业务目标是相同的,或者至少原则上可以是相同的,例如均方根误差)…