Python 如何将向量中的数值和分类值组合为LSTM的输入?

Python 如何将向量中的数值和分类值组合为LSTM的输入?,python,keras,deep-learning,lstm,categorical-data,Python,Keras,Deep Learning,Lstm,Categorical Data,我在上面分享了一个代码示例。我的问题是,我应该如何将数值变量和分类变量结合起来作为LSTM的输入 输入向量应该是什么样的 它是否应该像[0.123,0,1,0,0…](像代码中的X)dim=(1,8) 它是否应该像[0.123、[0,1,0,0…]]dim(1,2) 或者是否有特定的方式/方法将输入传递给ANN或RNN等。如果有,是什么,为什么我们应该使用它/它们(赞成/反对) 我读了一些关于嵌入的东西,但这些解释对我来说似乎不够,因为我想了解所有这些背后的逻辑 像这样的 import pand

我在上面分享了一个代码示例。我的问题是,我应该如何将数值变量和分类变量结合起来作为LSTM的输入

输入向量应该是什么样的

  • 它是否应该像[0.123,0,1,0,0…](像代码中的X)dim=(1,8)
  • 它是否应该像[0.123、[0,1,0,0…]]dim(1,2)
  • 或者是否有特定的方式/方法将输入传递给ANN或RNN等。如果有,是什么,为什么我们应该使用它/它们(赞成/反对)
  • 我读了一些关于嵌入的东西,但这些解释对我来说似乎不够,因为我想了解所有这些背后的逻辑

    像这样的

    import pandas as pd
    import numpy as np
    
    rands = np.random.random(7)
    days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
    dates = pd.date_range('2018-01-01', '2018-01-07')
    
    df = pd.DataFrame({'date': dates, 'days': days, 'y': rands})
    
    df_days_onehot = pd.get_dummies(df.days)[days]
    df[days] = df_days_onehot
    df['target'] = df.y.shift(-1)
    
    df.drop('days', axis=1, inplace=True)
    df.set_index('date', inplace=True)
    
    X = df.iloc[:, :-1].values
    y = df.iloc[:, -1].values
    

    任何指导、链接、解释或帮助都将被告知。。。祝你度过愉快的一天。

    在处理各种范围的输入时,可以查看各种预处理(如标准化等)。一个热表示法当然是表示类别的好方法

    如果类别元素太多,导致一个热编码非常大,则使用嵌入。它们提供了对给定输入进行编码的矢量表示(可能是可训练的)。你可以在下面的链接中阅读更多关于它们的信息。嵌入的使用在NLP中非常常见

    除此之外,您还可以利用Keras建模支持多个输入层这一事实

    对于您的具体案例,下面是一个虚构的示例,可能会帮助您开始。再一次,我添加了几个密集的隐藏层来演示这一点。这应该是不言自明的

    model = Sequential()
    model.add(LSTM(64, batch_input_shape=(batch_size, look_back, 1), stateful=True, return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(32, batch_input_shape=(batch_size, look_back, 1), stateful=True))
    model.add(Dropout(0.3))
    model.add(Dense(1))
    model.compile(loss='mean_squared_error', optimizer=adam)
    model.fit(trainX, trainY, epochs=100, batch_size=batch_size, verbose=2, shuffle=False)
    
    另一种方法(可能更优雅)是对分类变量(其值不会随时间而改变)设置条件

    我们举一个例子,来自两个不同城市的天气数据:巴黎和旧金山。您希望根据历史数据预测下一个温度。但与此同时,你预计天气会随着城市的变化而变化。您可以:

    • 将辅助功能与时间序列数据相结合(您在此处提出的建议)

    • 将辅助特征与RNN层的输出连接起来。这是某种RNN后调整,因为RNN层不会看到此辅助信息

    • 或者仅使用已知的条件表示(例如巴黎或旧金山)初始化RNN状态

    我写了一个库来调节辅助输入。它抽象了所有的复杂性,并设计为尽可能方便用户:


    希望有帮助

    首先,谢谢你的回答。这真的很有帮助。但是,我将使用顺序模型,我需要在其中添加一个LSTM层。您能简单地将示例代码转换为带有层的顺序模型吗?我将编辑我的上述问题与某物我将期待做。顺序模型不支持多个输入或共享层。您仍然可以使用LSTM层在与示例中相同的行中创建功能模型。如果您无法避免顺序模型,则需要将所有输入组合到一个输入层中。组合所有输入是什么意思?创建一个像[0.123,0,1,0,0,0,…]这样的输入向量是否有效?我的意思是,这就是你所说的把它们结合起来的意思吗?是的。根据问题的不同,它当然有可能完成这项工作。最后,我只是想知道为什么我们不能像使用[real,real,real,…]一样使用它们,就像我们使用[real,real,real,…]作为输入向量一样。缺点是什么。如果你对此有答案,我将不胜感激。谢谢你抽出时间。我将尝试一些可能的案例。
    X1 = rands  
    X2 = df_days_onehot
    Y = np.random.random(7)
    
    float_input = Input(shape=(1, ))
    one_hot_input = Input(shape=(7,) )
    
    first_dense = Dense(3)(float_input)
    second_dense = Dense(50)(one_hot_input)
    
    merge_one = concatenate([first_dense, second_dense])
    dense_inner = Dense(10)(merge_one)
    dense_output = Dense(1)(dense_inner)
    
    
    model = Model(inputs=[float_input, one_hot_input], outputs=dense_output)
    
    
    model.compile(loss='mean_squared_error',
                  optimizer='adam',
                  metrics=['accuracy'])
    
    model.summary()
    
    model.fit([X1,X2], Y, epochs=2)