【问题标题】:Upweight a Category提升类别
【发布时间】:2018-01-04 15:56:35
【问题描述】:

我已经构建了一个 TensorFlow 模型,它使用 DNNClassifier 将输入分为两类。

我的问题是结果 1 的发生率超过 90-95%。因此,TensorFlow 为我的所有预测提供了相同的概率。

我正在尝试预测其他结果(例如,结果 2 的误报比错过可能发生的结果 2 更可取)。我知道,在一般机器学习中,在这种情况下,尝试提升结果 2 的权重是值得的。

但是,我不知道如何在 TensorFlow 中执行此操作。 documentation 暗示它是可能的,但我找不到任何实际外观的例子。有没有人成功地做到了这一点,或者有谁知道我在哪里可以找到一些示例代码或详尽的解释(我正在使用 Python)?

注意:当有人使用 TensorFlow 的更基本部分而不是估算器时,我已经看到暴露的权重被操纵。出于维护原因,我需要使用估算器来执行此操作。

【问题讨论】:

标签: python tensorflow machine-learning deep-learning


【解决方案1】:

tf.estimator.DNNClassifier 构造函数有weight_column 参数:

weight_column:一个字符串或_NumericColumn创建者 tf.feature_column.numeric_column 定义特征列表示 权重。它用于在训练期间减轻重量或增加示例。 它将乘以示例的损失。如果是字符串, 它用作从features 获取权重张量的键。如果是 一个_NumericColumn,原始张量通过键weight_column.key获取,然后 对它应用weight_column.normalizer_fn 得到权重张量。

所以只需添加一个新列并为稀有类填充一些权重:

weight = tf.feature_column.numeric_column('weight')
...
tf.estimator.DNNClassifier(..., weight_column=weight)

[更新]这是一个完整的工作示例:

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('mnist', one_hot=False)
train_x, train_y = mnist.train.next_batch(1024)
test_x, test_y = mnist.test.images, mnist.test.labels

x_column = tf.feature_column.numeric_column('x', shape=[784])
weight_column = tf.feature_column.numeric_column('weight')
classifier = tf.estimator.DNNClassifier(feature_columns=[x_column],
                                        hidden_units=[100, 100],
                                        weight_column=weight_column,
                                        n_classes=10)

# Training
train_input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': train_x, 'weight': np.ones(train_x.shape[0])},
                                                    y=train_y.astype(np.int32),
                                                    num_epochs=None, shuffle=True)
classifier.train(input_fn=train_input_fn, steps=1000)

# Testing
test_input_fn = tf.estimator.inputs.numpy_input_fn(x={'x': test_x, 'weight': np.ones(test_x.shape[0])},
                                                   y=test_y.astype(np.int32),
                                                   num_epochs=1, shuffle=False)
acc = classifier.evaluate(input_fn=test_input_fn)
print('Test Accuracy: %.3f' % acc['accuracy'])

【讨论】:

  • 我确实看到了这一点,但令人困惑的是,它似乎是在对单个数据进行加权,而不是按类别加权。我确信有一种解决方法,我可以通过首先扫描数据集为每行创建一个具有正确权重的数字列,但这似乎是一种麻烦的方法。
  • @AbigailFox 你是对的,但事实就是如此。请参阅this answer,特别是有关权重的部分。 DNNClassifier 使用 tf.nn.sigmoid_cross_entropy_with_logits 损失进行二元分类。
  • 我创建了一个具有适当权重的新列,但如果我只在DNNClassifier 的声明中使用权重列,它会给我一个Value Errornot in feature dictionary。如果我使用 weights 列作为模型中的特征列,该错误就会消失,但我相信这会扭曲我的结果/不会给出正确的输出。
  • 你的 tensorflow 版本是什么?在 1.4.1 中为我工作。我在tensorflow的源代码中也没有看到这个检查。
  • @AbigailFox 查看更新:我添加了一个完整的示例。我认为您忘记从输入函数返回 weight 并导致错误。
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多