用于 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_listtf.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+RNN vs 传统机器学习

如何使用 keras RNN 在数据集中进行文本分类?

文本分类:Keras+RNN vs传统机器学习

对比学习用 Keras 搭建 CNN RNN 等常用神经网络

Tensorflow.keras:RNN 对 Mnist 进行分类

使用 Keras、Tensorflow 进行具有多个时间序列维度的 RNN 时间序列预测