我正在尝试为包含2个类但具有不平衡数据的数据创建DNNClassifier。我在训练期间使用class_weight来扩大低频等级的损失。
classifier = tf.contrib.learn.DNNClassifier(
feature_columns=feature_columns,
hidden_units=[220, 100, 10],
n_classes=2,
dropout=0.5,
weight_column_name="class_weight",
model_dir="./tf_model"
)
classifier.fit(input_fn=get_train_inputs, steps=500)
但是,DNNClassifier还需要为predict方法设置class_weight。我可以为通过模型进行分类的新数据提供什么class_weight?
谢谢, -Prasad
答案 0 :(得分:2)
这不是您或我希望的答案,但tf.contrib.learn.DNNClassifier
weight_column_name
列是模型功能的要求有效地使得该参数完全无用。
虽然试图明白这个参数完全是浪费时间,但我对此Tensor Flow Issue进行了评论。
结果是:
为了DNNClassifier
使用weight_column_name
,它必须是模型功能之一。
如果是模型训练时在模型上定义的特征,则必须是模型测试时在模型上定义的特征,并且当模型是模型时,它也必须是在模型上定义的特征用于预测。
首先,我尝试使用列存在的测试集,当然准确率达到99.96%,因为培训已经学会将重量列值与标签相关联。 (我大约兴奋了30多岁......然后羞怯地花了好几分钟。)
然后,我尝试构建一个没有权重列或weight_column_name
param定义的测试模型,该模型恢复了使用权重列作为特征和weight_column_name
参数训练的模型,但是得到了这个错误:
Object was never used (type <class 'tensorflow.python.framework.ops.Tensor'>):
<tf.Tensor 'report_uninitialized_variables_1/boolean_mask/Gather:0' shape=(?,) dtype=string>
If you want to mark it as used call its "mark_used()" method.
我对mark_used()
位很感兴趣,所以我试着这样做:
tf.contrib.layers.real_valued_column("outcome_class_weight").mark_used()
...但是,显然,这不是错误引用的Tensor,因为我得到了错误AttributeError: '_RealValuedColumn' object has no attribute 'mark_used'
感觉这个参数是一个无底的兔子洞,似乎解决阶级不平衡的唯一方法是:
对于测试集中的每一行以及预测,请使用weight_column_name
列的值,该值介于两个类中每个类使用的值之间。或者,一个值是所有类的所有值的平均值。我会先尝试这个,但我怀疑我会长期坚持下去,除非它能改善召回:它感觉像是一个严重的污点。
下拉到低级API并手动设计损失功能。作为TensorFlow新手,这对我来说听起来非常痛苦,并且将成为最后的选择。然后,一旦我变得更容易使用TensorFlow,我可能想知道为什么我仍然在使用高级API。
根据Tensor Flow Issue的评论,弄清楚如何仅将类权重纳入InputFn,而不是以任何方式将其纳入模型本身。我不相信我实际上正确地理解了这些评论,所以经过一些思考和谷歌搜索后,我怀疑我最终不得不空手而归。
对未充分表示的类(我的偏好)进行过度抽样,或对大量代表的类进行欠采样。我强烈怀疑我会长期采取这种方法,因为我已经知道如何做得相当好。 (尽管如此,我仍然对此感到沮丧,因为课堂权衡似乎不像欠采样或过采样那样容易出错。)
===更新===
我尝试了选项1.它沉没了所有指标。故事的道德:你不能将线性解决方案用于非线性模型。
选项3是我的误解。如果在模型上定义占位符功能,则输入功能必须提供该功能的周期数据。
所以,现在我要对我表现不佳的班级进行过度抽样。
稍后,当我对TensorFlow更有信心时,我将使用低级API构建一个接受非模型特征的权重向量的模型。
此外,本周末我将起草一份代码,以便在github线程上发表其他评论。
答案 1 :(得分:0)
这不是编程问题,但答案是:
这取决于。
你必须做出决定。
一种简单的方法是将类权重设置为与数据集中使用该类标记的样本数成反比。