【问题标题】:Predict a variable that is not in the input sequences with LSTM-Keras使用 LSTM-Keras 预测不在输入序列中的变量
【发布时间】:2018-07-03 08:27:13
【问题描述】:

假设我的数据集中有五列(A、B、C、D、E),我想通过仅在 A、B、D、E 上进行训练来构建 LSTM 模型(即我想排除 C)

我的问题是我仍然想使用这个模型来预测 C。如果我没有用这个变量训练我的模型是否可能?我该怎么做?

编辑 1
我正在处理建模为时间序列的分类和数值数据。在这种特定情况下,C 是一个分类时间序列(以 one-hot 表示形式给出)。

【问题讨论】:

  • 你真的应该详细解释每一列的含义,你有多少序列,序列长度是多少.....
  • 不,不是任何阅读意义上的,只是以一种非常迂回的方式,你为什么不希望你的模型看到你希望它预测的样本?
  • @VeltzerDoron 因为我的模型重复了目标信号的先前值,所以我试图混淆他的值。也许这不是一个好的解决方案,但我想实现这样的目标。
  • @Ghemon 我不确定我是否关注你,你的意思是它概括性差吗?
  • @VeltzerDoron 是的,我认为这就是问题所在。出于这个原因,我决定仅使用来自 A、B、D、E 的信息来预测 C。我说清楚了吗?

标签: python keras lstm


【解决方案1】:

我想说,实现此目的的一种方法是让您的网络简单地预测 C 或将 C 作为标签
我一次又一次地看到这个。不要将 NN 与比实际更多的东西混淆。您只需通过学习函数 F 来近似给定输入 X 的输出 Y。那是你的神经网络。
在您的情况下,输出很容易是 C + Other_Output 根据其他输出是什么,您的网络可以收敛并产生良好的结果。很可能不会,所以您的问题在这一点上根本不完整。
您必须问自己一些问题,例如:

  1. C + Ohter_Output 是否对给定输入有意义。
  2. 有没有的方法让我序列化 C + Other_Output ?就像 N 输出数组元素中的第一个 K 描述 C,其余的 NK 描述 Other_Output ?
  3. Cmulticlass 问题吗?如果是,Other_Output 是否是不同类型的问题,或者可能会变成multiclass 同类型的问题,可以与 C 一起收敛或使它们成为 multilabel 问题?

这些至少是您在选择架构之前需要问自己的一些问题。
话虽如此,不,除非您训练您的网络了解 ABDC 之间的模式,否则它将无法预测丢失的输入 .

祝你好运,
加布里埃尔

【讨论】:

    【解决方案2】:

    是的,你可以!但是,字段 C 和其他列之间需要存在相关性。如果不是,那么预测将接近随机。

    • 使用 A、B、D、E 作为输入 (x) 训练模型
    • 使 C 成为 (y)

    将数据集分为训练、测试和验证。

    回答你的其他问题(如果我没有用这个变量训练我的模型,是否也可以?)

    • 不,因为模型将如何学习将 4 个输入字段映射到一个输出字段,在这种情况下它将是 (C)。

    要了解这个问题,请将您的方法与波士顿住房dataset 进行比较。

    import pandas as pd
    import numpy as np
    
    # Read dataset into X and Y
    df = pd.read_csv('YOURDATASET.csv', delim_whitespace=True, header=None)
    
    dataset = df.values
    
    
    # for example, your dataset is all loaded into a matrix (aka an array with rows of data, and each Index representing those features mentioned A B C D E)
    
    
    X = dataset[:, 0:1] + dataset[:, 3:4]
    Y = dataset[:, 2]
    
    
    #print "X: ", X
    #print "Y: ", Y
    
    
    # Define the neural network
    from keras.models import Sequential
    from keras.layers import Dense
    
    def build_nn():
        model = Sequential()
        model.add(Dense(20, input_dim=5, init='normal', activation='relu'))
        # No activation needed in output layer (because regression)
        model.add(Dense(1, init='normal'))
    
        # Compile Model
        model.compile(loss='mean_squared_error', optimizer='adam')
        return model
    
    
    # Evaluate model (kFold cross validation)
    from keras.wrappers.scikit_learn import KerasRegressor
    
    # sklearn imports:
    from sklearn.cross_validation import cross_val_score, KFold
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    
    # Before feeding the i/p into neural-network, standardise the dataset because all input variables vary in their scales
    estimators = []
    estimators.append(('standardise', StandardScaler()))
    estimators.append(('multiLayerPerceptron', KerasRegressor(build_fn=build_nn, nb_epoch=100, batch_size=5, verbose=0)))
    
    pipeline = Pipeline(estimators)
    
    kfold = KFold(n=len(X), n_folds=10)
    results = cross_val_score(pipeline, X, Y, cv=kfold)
    
    print "Mean: ", results.mean()
    print "StdDev: ", results.std()
    

    【讨论】:

    • 我认为这个问题很容易被误解。如果它的意思是“如果我没有用这个变量作为输入来训练我的模型,是否也有可能?”那么答案是肯定的,答案是正确的。
    • 你说得对,我想我试图用更多的证据来证明我的回答是正确的,因为我不确定@Ghemon 的问题是什么方向
    猜你喜欢
    • 2021-04-21
    • 1970-01-01
    • 2018-09-04
    • 2018-06-25
    • 1970-01-01
    • 2021-10-02
    • 2019-04-14
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多