Skip to main content
 首页 » 编程设计

python之Tensorflow 如何处理一列中具有多个输入的分类特征

2024年10月01日34zhengyun_ustc

例如,我有一个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 可以处理具有稀疏张量的单热特征,但我不确定它是否可以处理具有多个输入的特征,例如 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 
    ) 

感谢您的帮助。

请您参考如下方法:

好的,看起来编写自定义功能专栏对我来说同样适用于相同的任务。

我以 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) 

然后它可能被 embedding/indicator 列包裹。 看来这就是你所需要的。 这对我来说是第一步。我需要处理具有“str:float|str:float...”等值的列。