我已经构建了一个使用DNNClassifier
的TensorFlow模型,用于将输入分类为两个类别。
我的问题是,第一种结果(Outcome 1)出现的频率高达90-95%。因此,TensorFlow对所有预测给出的概率都是相同的。
我试图预测另一种结果(例如,对于第二种结果(Outcome 2),宁愿出现假阳性也不愿错过可能的发生)。我知道在机器学习中,一般在这种情况下,尝试提升第二种结果的权重是值得的。
然而,我不知道如何在TensorFlow中实现这一点。文档暗示这是可能的,但我找不到任何实际操作的例子。是否有人成功地做到了这一点,或者有人知道我可以在哪里找到一些示例代码或详细的解释(我使用的是Python)?
注意:我看到有人在使用TensorFlow的更基础部分而不是估计器时,操作了暴露的权重。出于维护原因,我需要使用估计器来实现这一点。
回答:
tf.estimator.DNNClassifier
构造函数有一个weight_column
参数:
weight_column
:一个字符串或由tf.feature_column.numeric_column
创建的_NumericColumn
,定义表示权重的特征列。它用于在训练期间降低或提升例子的权重。它将乘以例子的损失。如果它是一个字符串,则用作从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 npimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_datamnist = 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.labelsx_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)# 训练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)# 测试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('测试准确率: %.3f' % acc['accuracy'])