我正在尝试解决时间序列问题。简而言之,对于每个客户和材料(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 中使用实体嵌入在概念上是否存在错误?我应该改变什么吗?
预先非常感谢