分类数据转换成稀疏张量

wide and deep 模型训练一般是以多个训练样本作为 1 个批次 (batch) 进行训练,训练样本在行维度上定义,每一行对应一个训练样本实例,包括特征(feature column),标注(label)以及权重(weight),如图 2。特征在列维度上定义,每个特征对应 1 个 feature column,feature column 由在列维度上的 1 个或者若干个张量 (tensor) 组成,tensor 中的每个元素对应一个样本在该 feature column 上某个维度的值。feature column 的定义在可以在源代码的 feature_column.py 文件中找到,对应类为_FeatureColumn,该类定义了基本接口,是 wide and deep 模型中所有特征类的抽象父类。

图片描述

图 2 feature_column, label, weight 示意图

wide and deep 模型中使用的特征包括两大类: 一类是连续型特征,主要用于 deep 模型的训练,包括 real value 类型的特征以及 embedding 类型的特征等;一类是离散型特征,主要用于 wide 模型的训练,包括 sparse 类型的特征以及 cross 类型的特征等。以下是所有特征的一个汇总图

图片描述

图 3 wide and deep 模型特征类图

图中类与类的关系除了 inherit(继承)之外,同时我们也标出了特征类之间的构成关系:_BucketizedColumn 由_RealValueColumn 通过对连续值域进行分桶构成,_CrossedColumn 由若干_SparseColumn 或者_BucketizedColumn 或者_CrossedColumn 经过交叉组合构成。图中左边部分特征属于离散型特征,右边部分特征属于连续型特征。

我们在实际使用的时候,通常情况下是调用 TensorFlow 提供的接口来构建特征的。以下是构建各类特征的接口:

sparse_column_with_integerized_feature() --> _SparseColumnIntegerized
sparse_column_with_hash_bucket() --> _SparseColumnHashed
sparse_column_with_keys() --> _SparseColumnKeys
sparse_column_with_vocabulary_file() --> _SparseColumnVocabulary
weighted_sparse_column() --> _WeightedSparseColumn
one_hot_column() --> _OneHotColumn
embedding_column() --> _EmbeddingColumn
shared_embedding_columns() --> List[_EmbeddingColumn]
scattered_embedding_column() --> _ScatteredEmbeddingColumn
real_valued_column() --> _RealValuedColumn
bucketized_column() -->_BucketizedColumn
crossed_column() --> _CrossedColumn

[TensorFlow Wide And Deep 模型详解与应用(一)_特征]

sparse_column_with_integerized_feature

tf.contrib.layers.sparse_column_with_integerized_feature(
    column_name, bucket_size, combiner='sum', dtype=tf.dtypes.int64)

函数说明

tf.contrib.layers.sparse_column_with_integerized_feature 是 TensorFlow 1.x 中用于创建稀疏特征列的函数。它将整数特征进行分桶(bucketization),将连续整数特征转换为离散的稀疏表示。

核心参数:

  • column_name: 特征列名

  • bucket_size: 桶大小,特征值被映射到 [0, bucket_size) 范围

  • combiner: 稀疏张量合并方式('sum', 'mean', 'sqrtn')

  • dtype: 数据类型,默认 tf.int64

工作原理:
特征值 v 被转换为 ID: v % bucket_size,超出范围的值会被截断。

示例

monthly_income = tf.contrib.layers.sparse_column_with_integerized_feature("monthly_income", keys=['1','2','3','4','5','6'])
#Other columns are also declared in the same way

m = tf.contrib.learn.LinearClassifier(feature_columns=[caste, ..., monthly_income, smoke,drink,tobacco,sex],model_dir=model_dir)

Note: 创建稀疏特征列:使用整数化后的特征值,sparse_column_with_integerized_feature 函数会创建一个稀疏特征列,其中包括两个值:索引(indices)和值(values)。索引表示特征值在原始特征空间中的位置,而值则表示特征值对应的整数化后的值。    稀疏特征表示:TensorFlow 的稀疏特征表示基于稀疏矩阵的概念,使用 tf.SparseTensor 类型来表示。稀疏矩阵包含三个属性:indices、values 和 dense_shape。在这种情况下,indices 表示稀疏特征值的位置,values 表示整数化后的特征值,dense_shape 表示稀疏矩阵的形状。[Ailake]

sparse_column_with_keys

sparse_column_with_integerized_feature输入需要是int类型的,这个就只需要是string类型就可以。

tf.contrib.lookup索引构建和查询

index_to_string_table_from_file和index_table_from_file

从文件中构建int->string映射和string->int映射,分别返回tf.contrib.lookup.HashTable对象和tf.contrib.lookup.IdTableWithHashBuckets对象,其中的属性及函数参考链接。

tf.contrib.lookup.IdTableWithHashBuckets(    table, num_oov_buckets, hasher_spec=tf.contrib.lookup.FastHashSpec, name=None,    key_dtype=None)

IdTableWithHashBuckets是一个带哈希桶处理的ID查找表包装器,主要用于处理词汇表外(Out-Of-Vocabulary, OOV)的键。当查找的键不在预先定义的词汇表中时,它不会统一给一个默认值,而是通过哈希函数将其映射到若干个"桶"中的一个,从而让模型能区分不同的未知词。简单来说,它实现了:已知词 → 返回词表对应的固定ID;未知词 → 返回基于哈希计算的桶ID(在 [vocab_size, vocab_size + num_oov_buckets) 范围内)

但是index_to_string_table_from_file和index_table_from_file都返回的hashtable的key的字符串居然是bytes类型,不是str,可能是因为tf.string默认是utf-8编码的bytes,而不是py3的unicode。

输入:

B-DET
B-TYPE
E-DET
E-TYPE
I-DET
I-TYPE
O
S-DET
S-TYPE
工

代码及输出:

import tensorflow as tf

indices = tf.constant([1, 5, 9], tf.int64)
reverse_vocab_tags = tf.contrib.lookup.index_to_string_table_from_file(
    'vocab.tags.txt')

values1 = reverse_vocab_tags.lookup(indices)
values = reverse_vocab_tags.export()
with tf.Session() as sess:
    tf.tables_initializer().run()
    print(values1.eval())
    print(sess.run(values))

[b'B-TYPE' b'I-TYPE' b'\xe5\xb7\xa5']
(array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]), array([b'\xe5\xb7\xa5', b'S-TYPE', b'S-DET', b'O', b'I-TYPE', b'I-DET',
       b'E-TYPE', b'E-DET', b'B-TYPE', b'B-DET'], dtype=object))

import tensorflow as tf

features = tf.constant(['工', 'a', 'O', 'b'])
# print(type('工')) # str
reverse_vocab_tags = tf.contrib.lookup.index_table_from_file(
    'vocab.tags.txt', key_dtype=tf.dtypes.string
    , num_oov_buckets=1)

values = reverse_vocab_tags.lookup(features)
with tf.Session() as sess:
    tf.tables_initializer().run()
    print(values.eval())

[ 9 10  6 10]

[tf.contrib.lookup.index_table_from_file]

[tf.contrib.lookup.index_to_string_table_from_file]

from: -柚子皮-

ref: 


 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐