前言
Feature Column 是 TensorFlow 2 中的一个模块, 但是 官方文档 对它的介绍极其简略,简直就是一句话。 倒是 Tutorial: Classify structured data with feature columns 中有一部分涉及了这块内容, 本文就是基于这篇文章, 对Featrue Column 本身及其在整个TF2 Machine Learning PipeLine 的作用加以介绍。
缩略语
FC: Feature Column
TF2:TensorFlow 2
1. FC 是什么?
-
FC是针对结构化数据(Structure Data)使用的, 文中举例,比如在 csv 中存储的数据, 我觉得存储在结构化数据库(RMSDB) 中的数据也可以归类到这里。 所以FC的应用场景还是挺大的。
-
FC 的角色是 结构化数据 和 模型 之间的 桥梁 (feature columns as a bridge to map from columns in a CSV to features used to train the model)
-
FC 是 Input pipeline 的一部分。
-
FC 是关于具体某个结构化数据说明书,其本身并不存储任何数据。在下面的例子中可以看到, 一组 FC 是针对具体某个 DataFrame 的说明, 一组创建好的 FC 是依附于某个具体DataFrame的。
-
FC 往往和 Pandas 的 DataFrame 和 layers.DenseFeatures 连用。 FC 上接 Dataframe, 下接 DenseFeatures Layer, 这就解释了“桥梁” 一词。
2. FC 怎么用?
直接放官方代码, 可以当模板用, 注意点
- 对不同类型的数据 FC提供不同的函数处理(numeric,categorical ),如果是文本则需要单独的文本 embedding。文本处理不在 FC 覆盖范围内。
- FC可以做一些对 Feture 的变形, 比如bucketized, embedding, crossed 。
- 每个FC都是针对单独一列的, 一般来说一个 Datafame 包含很多列, 所以FC 一般都放在一个list中 (feature_columns)
- Model 中第一个layer 是 tf.keras.layers.DenseFeatures(feature_columns)
- 训练数据, 测试数据都用同一个 FC, 这个FC一般是基于训练数据做的。对于模型来说, 只需要第一层是 feature_layer 就可以了, 和传入的数据无关。
feature_columns = []
# numeric cols
for header in ['PhotoAmt', 'Fee', 'Age']:
feature_columns.append(feature_column.numeric_column(header))
# bucketized cols
age = feature_column.numeric_column('Age')
age_buckets = feature_column.bucketized_column(age, boundaries=[1, 2, 3, 4, 5])
feature_columns.append(age_buckets)
# indicator_columns
indicator_column_names = ['Type', 'Color1', 'Color2', 'Gender', 'MaturitySize',
'FurLength', 'Vaccinated', 'Sterilized', 'Health']
for col_name in indicator_column_names:
categorical_column = feature_column.categorical_column_with_vocabulary_list(
col_name, dataframe[col_name].unique())
indicator_column = feature_column.indicator_column(categorical_column)
feature_columns.append(indicator_column)
# embedding columns
breed1 = feature_column.categorical_column_with_vocabulary_list(
'Breed1', dataframe.Breed1.unique())
breed1_embedding = feature_column.embedding_column(breed1, dimension=8)
feature_columns.append(breed1_embedding)
# crossed columns
age_type_feature = feature_column.crossed_column([age_buckets, animal_type], hash_bucket_size=100)
feature_columns.append(feature_column.indicator_column(age_type_feature))
# Create a feature layer
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
# Create, compile, and train the model
model = tf.keras.Sequential([
feature_layer,
layers.Dense(128, activation='relu'),
layers.Dense(128, activation='relu'),
layers.Dropout(.1),
layers.Dense(1)
])
model.compile(optimizer='adam',
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(train_ds,
validation_data=val_ds,
epochs=10)
3. FC 函数介绍 (未完成)
- bucketized_column : 通过划分不同的区间,把数值型转化成Category
- categorical_column_with_hash_bucket :对于类型巨多而且sparse 的Category, 会面临 Feture 爆炸的情况。 优点是让Feture 打打减少, 缺点是如果出现撞车(不同Featrue 放到一个篮子里), 可能会对结果造成影响。
- categorical_column_with_identity : 把int 数值,直接当成 Category 的类型来用。
- categorical_column_with_vocabulary_file :给一个词汇文件,处理categorical, word-> int
- categorical_column_with_vocabulary_list : 给一个词汇list,处理categorical, word-> int
- crossed_column : 把不同列放在一起组合成一个新列使用
- embedding_column : 类似Word embedding,参考上面例子
- indicator_column : 配合其他函数完成 One-hot encoding, 参考上面例子
- make_parse_example_spec : ??? Creates parsing spec dictionary from input feature_columns.
- numeric_column : 标识是数值列,原样使用
- sequence_categorical_column_with_hash_bucket : ??? A sequence of categorical terms where ids are set by hashing.
- sequence_categorical_column_with_identity : ??? Returns a feature column that represents sequences of integers.
- sequence_categorical_column_with_vocabulary_file : ??? A sequence of categorical terms where ids use a vocabulary file.
- sequence_categorical_column_with_vocabulary_list : ??? A sequence of categorical terms where ids use an in-memory list.
- sequence_numeric_column : ??? Returns a feature column that represents sequences of numeric data.
- shared_embeddings :把几列放在一起做 Embedding
- weighted_categorical_column : 对于Categorical Column 加上权重
网友评论