使用LSTM-Keras预测输入序列中不存在的变量

时间:2018-01-24 10:20:44

标签: python keras lstm

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

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

编辑1
我正在使用模拟为时间序列的分类和数字数据。在这种特定情况下,C是分类时间序列(以单热表示给出)。

2 个答案:

答案 0 :(得分:2)

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

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

将数据集划分为Train,Test and Validate。

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

  • 不,因为模型如何学会将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()

答案 1 :(得分:1)

我之所以说这样做的一种方法是让您的网络只需预测C C 作为标签
我一次又一次地看到这个。不要将NN与实际上的东西混淆。您只需通过学习函数 F 给出输入 X 来近似输出 Y 。那是你的NN 在您的情况下,输出很容易 C + Other_Output 根据其他输出的不同,您的网络可以收敛并获得良好的结果。它很可能不会,所以你的问题只是在这一点上不完整。
你必须问自己一些问题,如:

  1. C + Ohter_Output 对于给定输入是否有意义。
  2. 我是否有好的方式序列化 C + Other_Output ?就像描述 C N 输出数组元素中的第一个 K 一样,其余 NK 描述其他_Output
  3. C 多类问题,如果是 Other_Output ,则会出现其他类型的问题,或者可能会变成多类相同类型的问题,可能会与 C 一起收敛或使它们同时成为多标记问题?
  4. 这些至少是在选择架构之前需要问自己的一些问题 话虽这么说,不,除非你训练你的网络来了解 ABD C 之间的模式,否则它将无法预测丢失的输入

    祝你好运,
    加布里埃尔