tensorflow feature_column踩坑合集
- 2020 年 3 月 7 日
- 筆記
踩坑內容包含以下
- feature_column的輸入輸出類型,用一個數據集給出demo
- feature_column接estimator
- feature_column接Keras
feature_column 輸入輸出類型
輸入輸出類型
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,原始特徵如下

輸入-連續值

輸入-離散值

輸入-categorical

feature_column接estimator
如果是使用預定義的estimator, feature_column可以直接作為輸入,不需要任何額外操作,只需要注意深度模型只支援Dense類型的feature_column即可。
如果是自定義estimator,則需要多一步用feature_column先創建input_layer
input_layer = tf.feature_column.input_layer(features, feature_columns) 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