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

时间:2019-07-16 08:16:22

标签: lstm word-embedding tf.keras

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

我想做的是在Keras中建立一个LSTM模型,其中对于每个客户和每个物料,我都有50个最大的填充历史时间步长,并且我使用的是数字混合(自上次以来的天数订单,最近60天内的订单之间的AVG天数等)和分类功能(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中使用实体嵌入在概念上有问题吗?我应该改变一些东西吗?

非常感谢

0 个答案:

没有答案