【问题标题】:How Tensorflow handles categorical features with multiple inputs within one column?Tensorflow 如何在一列中处理具有多个输入的分类特征?
【发布时间】:2018-04-12 05:43:08
【问题描述】:

例如,我有一个csv格式的数据:

csv
col0  col1  col2  col3
1     A     E|A|C 3
0     B     D|F   2 
2     C     |     2 

以逗号分隔的每一列代表一个特征。通常,一个特征是 one-hot(例如col0, col1, col3),但在这种情况下,col2 的特征有多个输入(由 | 分隔)。

我确信 tensorflow 可以处理具有稀疏张量的 one-hot 特征,但我不确定它是否可以处理具有多个输入的特征,例如 col2

在Tensorflow的稀疏张量中应该如何表示?

我正在使用下面的代码(但我不知道col2的输入法)

col0 = tf.feature_column.numeric_column('ID')
col1 = tf.feature_column.categorical_column_with_hash_bucket('Title', hash_bucket_size=1000)
col3 = tf.feature_column.numeric_column('Score')

columns = [col0, col1, col3]

tf.estimator.DNNClassifier(
        model_dir=None,
        feature_columns=columns,
        hidden_units=[10, 10],
        n_classes=4
    )

感谢您的帮助。

【问题讨论】:

  • 嗯,您的第一个问题是您发布的 .csv 文件不包含逗号。
  • 当然,逗号包含csv。

标签: python tensorflow sparse-matrix categorical-data


【解决方案1】:

OK 看起来编写自定义功能列对我来说是同样的任务。

我以 HashedCategoricalColumn 为基础,并进行了清理以仅使用字符串。不过应该添加类型检查。

class _SparseArrayCategoricalColumn(
    _CategoricalColumn,
    collections.namedtuple('_SparseArrayCategoricalColumn',
                           ['key', 'num_buckets', 'category_delimiter'])):

  @property
  def name(self):
    return self.key

  @property
  def _parse_example_spec(self):
    return {self.key: parsing_ops.VarLenFeature(dtypes.string)}

  def _transform_feature(self, inputs):
    input_tensor = inputs.get(self.key)
    flat_input = array_ops.reshape(input_tensor, (-1,))
    input_tensor = tf.string_split(flat_input, self.category_delimiter)

    if not isinstance(input_tensor, sparse_tensor_lib.SparseTensor):
      raise ValueError('SparseColumn input must be a SparseTensor.')

    sparse_values = input_tensor.values
    # tf.summary.text(self.key, flat_input)
    sparse_id_values = string_ops.string_to_hash_bucket_fast(
        sparse_values, self.num_buckets, name='lookup')


    return sparse_tensor_lib.SparseTensor(
        input_tensor.indices, sparse_id_values, input_tensor.dense_shape)


  @property
  def _variable_shape(self):
    if not hasattr(self, '_shape'):
        self._shape = tensor_shape.vector(self.num_buckets)
    return self._shape

  @property
  def _num_buckets(self):
    """Returns number of buckets in this sparse feature."""
    return self.num_buckets

  def _get_sparse_tensors(self, inputs, weight_collections=None,
                          trainable=None):
    return _CategoricalColumn.IdWeightPair(inputs.get(self), None)


def categorical_column_with_array_input(key,
                                        num_buckets, category_delimiter="|"):
  if (num_buckets is None) or (num_buckets < 1):
    raise ValueError('Invalid num_buckets {}.'.format(num_buckets))

  return _SparseArrayCategoricalColumn(key, num_buckets, category_delimiter)

然后它可以被嵌入/指示符列包裹。 似乎这是你需要的。 这对我来说是第一步。我需要处理具有“str:float|str:float...”等值的列。

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 1970-01-01
    • 2021-01-01
    • 2021-05-08
    • 2018-08-11
    • 1970-01-01
    • 2019-06-13
    • 2021-12-17
    • 2017-08-17
    相关资源
    最近更新 更多