3.6 Mixed Feature DNN
實務表格資料很少只有純數值欄位。客戶資料會有城市、會員方案、裝置類型;工廠資料會有設備型號、產線、班別;交易資料會有通路、付款方式、商品類別。這些類別欄位不能直接丟進 Dense layer,必須先轉成模型可讀的數字表示。
本篇示範如何用 Keras Functional API 建立同時處理數值欄位與類別欄位的 DNN。
1. 為什麼需要 Functional API?
Sequential 適合單一路徑模型。但 mixed feature 任務有多種輸入:數值欄位需要 normalization,類別欄位需要 lookup 或 embedding,不同欄位處理後再合併。Functional API 可以清楚描述這種多輸入模型。
2. 範例資料
Notebook 建立一份合成客戶資料:age、income、visits 是數值欄位;city、plan、device 是類別欄位;target 是二元分類標籤。
這種資料型態很接近真實表格資料。
3. 數值欄位前處理
normalizer = tf.keras.layers.Normalization()
normalizer.adapt(train_df[numeric_cols].astype('float32').values)
Normalization layer 會學習訓練集平均值與變異,並在模型內完成標準化。這樣模型保存時,前處理也會一起保存。
4. 類別欄位前處理
lookup = tf.keras.layers.StringLookup(output_mode='one_hot')
lookup.adapt(tf.constant(train_df[col].astype(str).values.reshape(-1, 1)))
StringLookup 會建立字串類別到向量的 mapping。類別少時 one-hot 很直覺;類別多時,可改成 integer lookup 搭配 embedding。
5. 合併多種輸入
每個輸入各自建立 Input,前處理後用 Concatenate() 合併,再接 Dense layers。這讓模型同時學習數值特徵與類別特徵。
6. 如何套用自己的資料?
先整理:
numeric_cols = ['age', 'income', 'visits']
categorical_cols = ['city', 'plan', 'device']
target_col = 'target'
所有 normalization 與 lookup 都只用訓練資料 adapt()。
7. 小結
Mixed Feature DNN 是表格資料實務中的重要模板。它讓訓練與推論使用一致的前處理流程,也更接近部署需求。