前言
- feature_column 输入输出类型,用一个数据集给出demo
- feature_column 接estimator
- feature_column 接Keras
1. feature_column的输入输出类型
1.1 输入输出类型
feature_column输入可以是原始特征的列名,或者是feature_column。初上手感觉feature_column设计的有点奇怪,不过熟悉了逻辑后用起来还是很方便的。几个需要习惯一下的点:
- 深度模型的输入必须是Dense类型,所有输出是categorical类型需要经过indicator或者embedding的转换才可以;
- indicator,embedding,bucketized 的输入不能是原始特征,前两者只能是categorical类型的feature_column,后者只能是numeric_column;
feature_column | 输入 | 输出 | 输出是否为dense |
---|---|---|---|
categorical_column_with_identity | 数值型离散 | categorical | N |
categorical_column_with_vocabulary_list | 字符型/数值型离散 | categorical | N |
categorical_column_with_hash_bucket | 类别太多的离散值 | categorical | N |
crossed_column | categorical/离散值 | categorical | N |
indicator_column | categorical | one/multi-hot | Y |
embedding_column | categorical | dense vector | Y |
numeric_column | 数值型连续值 | numeric | Y |
bucketzied_column | numeric_column | one-hot | Y |
以下给出各种特征工程的demo,原始特征如下:
1.2 输入-连续值
1.3 输入-离散值
1.4 输入-categorical
2. feature_column接estimator
如果是使用预定义的estimator,feature_column 可以直接作为输入,不需要任何额外操作,只需要注意深度模型只支持Dense类型的feature_column即可。
如果是自定义estimator,则需要多一步用feature_column先创建input_layer。
input_layer = tf.feature_column.input_layer(features, feature_columns)
3. feature_column接keras
为什么要这么搭配呢,好像是没啥必要,只不过进一步证明tf的官方文档确实坑而已。
def model_fn():
#define Keras input
input = {}
for f in FEATURE_NAME:
input[f] = Input(shape=(1,), name = f, dtype = DTYPE[f])
#generate feature_columns
feature_columns = build_features()
#Define transformation from feature_columns to Dense Tensor
feature_layer = tf.keras.layers.DenseFeatures( feature_columns )
#Transform input
dense_feature = feature_layer(input)
output = Dense(1, activation='sigmoid')(dense_feature)
#feed input placeholder as list
model = Model(inputs = [i for i in input.values()], outputs = output)
return model