为什么DNNClassifier不接受稀疏特征,而LinearClassifier接受

时间:2019-05-21 22:30:26

标签: tensorflow

tf.estimator.DNNClassifier 不接受诸如 categorical_column_with_hash_bucket 之类的稀疏特征列。它只能接受始终需要使用indicator_column包装的密集列。

category_column = tf.feature_column.categorical_column_with_hash_bucket(key, hash_size)
tf.feature_column.indicator_column(category_column)
另一方面,

tf.estimator.LinearClassifier 可以直接接受 categorical_column_with_hash_bucket

tf.feature_column.categorical_column_with_hash_bucket(key, hash_size)

根据此tf source code

稀疏特征可以直接输入线性模型中。它们的行为就像一个指标列,但实现高效。

我想知道在Linear中有什么这样的有效实现,而DNN限制了DNN只接受密集列。

1 个答案:

答案 0 :(得分:0)

线性分类器和其他“浅层模型”对它们可以接受的输入源有些挑剔。 categorical_column_with_hash_bucket是一种将可变大小的输入或庞大的稀疏向量压缩成漂亮的固定大小数字表示形式的怪异方法。

因此,在DNN中,我们应该看一下2种情况来代替categorical_column_with_hash_bucket。一种用于字符串,另一种用于稀疏向量。

如果是字符串,我们可以使用嵌入层将字符串投影为固定大小的表示形式。它允许到达器,更高的尺寸表示,并且最重要的是,它是可训练的。嵌入可以与网络的主要部分一起训练。

对于稀疏向量,事情变得棘手。首先,当涉及到低维数据时,DNN不会发光,并且稀疏矢量通常只有很少的信息(低熵)。因此,稀疏的数据很容易被具有数百万个参数的DNN过度拟合。不过,您仍然可以尝试为您的案例使用嵌入层。否则,请坚持使用线性模型-它们更加健壮,可以用于稀疏向量。