如何将float类型数据与one-hot向量组合为单条样本输入Keras层?
Keras混合数值型与One-Hot分类型特征的输入处理方案
注意:Keras输入层不支持嵌套数组格式的张量输入,你预期的
[float, float, float, [one-hot-vector]]嵌套结构无法直接传入模型,可选择以下两种主流方案处理
方案1:直接展平合并为单维向量(最简实现,适配大部分场景)
将one-hot向量直接展开为独立的float元素,和前面的连续特征拼接为一维数组即可直接喂给普通Keras层。
以你给出的样例数据[0.1, 0.2, 0.4, [0,0,0,1]]为例,展平后得到一维数组[0.1, 0.2, 0.4, 0, 0, 0, 1],所有元素均为float类型,符合Keras输入要求。
批量数据处理代码示例:
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense # 模拟两类特征数据 # continuous_feat维度:(样本数, 连续特征数量) continuous_feat = np.array([[0.1, 0.2, 0.4], [0.5, 0.3, 0.2]], dtype=np.float32) # one_hot_feat维度:(样本数, one-hot编码长度) one_hot_feat = np.array([[0,0,0,1], [1,0,0,0]], dtype=np.float32) # 横向拼接两类特征 train_x = np.concatenate([continuous_feat, one_hot_feat], axis=1) # 直接定义对应维度的输入层即可 model = Sequential() model.add(Dense(16, activation='relu', input_shape=(7,))) model.add(Dense(1, activation='sigmoid'))
适用场景:不需要对两类特征做差异化特征提取、特征总维度不高的场景。
方案2:多输入分支合并(适配需要单独处理两类特征的场景)
如果需要给连续特征、one-hot特征分别配置不同的特征处理层,可以用Keras函数式API搭建多输入分支,在模型内部完成特征合并。
代码示例:
from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Dense, Concatenate # 定义两个独立输入分支 input_continuous = Input(shape=(3,), name='continuous_input') input_onehot = Input(shape=(4,), name='onehot_input') # 两个分支可以单独配置不同的处理层 dense_continuous = Dense(8, activation='relu')(input_continuous) dense_onehot = Dense(4, activation='relu')(input_onehot) # 合并两个分支的输出特征 merged_feat = Concatenate(axis=1)([dense_continuous, dense_onehot]) # 后续接全局任务层 output = Dense(1, activation='sigmoid')(merged_feat) # 初始化模型 model = Model(inputs=[input_continuous, input_onehot], outputs=output) # 训练时分别传入两类特征即可 # model.fit([continuous_feat, one_hot_feat], 标签数组, epochs=10, batch_size=32)
适用场景:需要对one-hot特征做降维、或对连续特征做特殊变换的个性化建模场景。
内容的提问来源于stack exchange,提问作者prze gee
相关产品推荐
相关产品推荐

