时间序列数据和 LSTM 中分类的实体嵌入

2023-12-22

我正在尝试解决时间序列问题。简而言之,对于每个客户和材料(SKU代码),我过去都下了不同的订单。我需要建立一个模型来预测每个客户和材料下一次订单之前的天数。

我想做的是在 Keras 中构建一个 LSTM 模型,其中对于每个客户和材料,我有 50 个最大填充的历史时间步长,并且我使用数字的混合(自上一个订单以来的天数、AVG过去 60 天内订单之间的天数等...)和分类特征(SKU 代码、客户代码、SKU 类型等...)。

对于分类,我尝试使用流行的实体嵌入技术。我从 Github 上发布的一个示例开始,该示例没有使用 LSTM(它使用 input_lengh = 1 进行嵌入),并将其推广到可以处理更高输入的嵌入,我可以将其提供给 LSTM。

下面是我的代码。

from keras.regularizers import l2,l1

input_models=[]
output_embeddings=[]
numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

## features is this list features =['CAT_Cliente_le','CAT_Famiglia_le','CAT_Materiale_le','CAT_Settimana','CAT_Sotto_Famiglia_le','NUM_Data_diff_comprato','NUM_Data_diff_comprato_avg','NUM_Data_diff_comprato_avg_sf','NUM_Qty','NUM_Rank']

for categorical_var in np.arange(len(features)-5):    

 #Name of the categorical variable that will be used in the Keras Embedding layer
 cat_emb_name= features[categorical_var]+'_Embedding'

 # Define the embedding_size, max size is 10
 no_of_unique_cat = dataset_train.loc[:,features[categorical_var]].nunique()
 embedding_size = int(min(np.ceil((no_of_unique_cat+1)/2), 10 ))

 #One Embedding Layer for each categorical variable
 input_model = Input(shape=(MAX_TIMESTEP,)) 
 output_model = Embedding(no_of_unique_cat+1, embedding_size, name=cat_emb_name,input_length=MAX_TIMESTEP,mask_zero=True)(input_model)

 #Appending all the categorical inputs
 input_models.append(input_model)

 #Appending all the embeddings
 output_embeddings.append(output_model)

#Other non-categorical data columns (numerical). I have 5 of them
input_numeric = Input(shape=(MAX_TIMESTEP,len(['1','2','3','4','5']),))
mask_numeric = Masking(mask_value=0., input_shape=(MAX_TIMESTEP,5))(input_numeric)
input_models.append(input_numeric)
output_embeddings.append(mask_numeric)

output = Concatenate(axis=2)(output_embeddings)

output = LSTM(
           units= 25,
           input_shape=(MAX_TIMESTEP, 4),
           use_bias=True,
           kernel_initializer=he_normal(seed=14),
           recurrent_initializer=he_normal(seed=14),
           unit_forget_bias = True,
           return_sequences=True)(output)

output = TimeDistributed(Dense(1))(output)

model = Model(inputs=input_models, outputs=output)
model.compile(loss='mae', optimizer=SGD(lr=0.2, decay=0.001, momentum=0.9, nesterov=False),
          #clipvalue=0.75), epsilon=None, decay=0.00000, amsgrad=False),
          metrics=['mape'])`

我观察到: -模型仅通过数字特征表现出良好的性能 -添加分类对提高性能没有任何帮助(我至少希望模型通过生成非常具体的规则而过度拟合,例如客户 X 在 5 天后在 Z 周订购了材料 Y),但这永远不会发生

我的问题是,像这样在 LSTM 中使用实体嵌入在概念上是否存在错误?我应该改变什么吗?

预先非常感谢


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间序列数据和 LSTM 中分类的实体嵌入 的相关文章

随机推荐