用于 RNN 的 Keras 数值和分类特征嵌入
Posted
技术标签:
【中文标题】用于 RNN 的 Keras 数值和分类特征嵌入【英文标题】:Keras Numerical and Categorical Features Embedding for RNNs 【发布时间】:2021-09-21 20:08:05 【问题描述】:我正在尝试构建一个简单的 Keras RNN 模型,以区别对待数值和分类特征,但没有成功。我使用的数据集是一个 Pandas Dataframe,格式如下:
| sequence_id | cat_f1 | cat_f2 | num_f1 | num_f2 |
------------------------------------------------------------------------------------
| seq1 | [bread, grissini] | [cat, dog] | [0.7, 0.1] | [0.1, 0.2] |
| seq2 | [pizza, mozzarella]| [lion, tiger] | [0.2, 0.2] | [0.3, 0.9] |
------------------------------------------------------------------------------------
实际DataFrame的形状是(1480, 3, 49),其中1480是样本数,3是序列长度(例子中是2),49是总数特征数(示例中为 4 个)。
重要的是要注意,序列的创建是一个个性化的过程,它考虑了不同的因素和不同的列。因此,这个过程不能在 Keras 模型中重现,必须在初始化模型之前完成。所有序列的长度相同。
我目前正在使用我的 RNN 数字特征。因此,我首先将字符串编码为整数(例如,bread->0、grissini->1、...),然后将 Pandas DataFrame 转换为 Numpy 数组(1480x3x49),然后按以下方式创建模型:
model = Sequential()
# window_size is 3, n_features is 49
model.add(Input(shape=(window_size, n_features)))
model.add(
RNN(
units=256,
recurrent_dropout=0.1,
return_sequences=False,
)
)
model.add(Dropout(0.1))
model.add(
Dense(
units=128,
activation="sigmoid",
)
)
model.add(Dropout(0.2))
model.add(Dense(n_classes, activation="softmax"))
但是,我想嵌入分类特征(示例中为 cat_f1 和 cat_f2)并传递数值特征(示例中为 num_f1 和 num_f2)照他们的样子。
我尝试使用 tf.feature_column.categorical_column_with_vocabulary_list
和 tf.feature_column.sequence_categorical_column_with_vocabulary_list
没有成功,因为第一个似乎不处理多维数据,第二个是实验性的,仅适用于 SparseTensor。
【问题讨论】:
【参考方案1】:我找到了解决办法。最好的方法是从顺序模型切换到功能 API。这样,我可以设置多个输入,嵌入分类输入并按原样传递数字输入。代码是:
from tensorflow.keras import Input
from tensorflow.keras.layers import Embedding, concatenate
inputs_num = Input(shape=(window_size, features_num.shape[2]), name='numerical')
masked_num = Masking(mask_value=0.0)(inputs_num)
inputs_cat = [Input(shape=(window_size, ), name=e_col) for e_col in embed_cols]
inputs = [inputs_num]+inputs_cat
embeds_cat = [Embedding(v_size, 64, mask_zero=True)(i_cat) for v_size, i_cat in zip(vocab_size, inputs_cat)]
inputs_concat = concatenate([masked_num]+embeds_cat)
我附上完整的模型图像以及形状,以下:
【讨论】:
以上是关于用于 RNN 的 Keras 数值和分类特征嵌入的主要内容,如果未能解决你的问题,请参考以下文章
对比学习用 Keras 搭建 CNN RNN 等常用神经网络