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

2024-04-20 04:56:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

编辑1
我使用的是以时间序列建模的分类和数值数据。在这个特定的例子中,C是一个范畴时间序列(以one hot表示)。在


Tags: 数据模型编辑时间分类序列建模one
2条回答

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

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

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

回答你的另一个问题(如果我没有用这个变量训练我的模型,有可能吗?)在

  • 不,因为模型如何学习将4个输入字段映射到一个输出字段,在本例中是(C)。在

要理解这个问题,请比较一下你对波士顿住宅的态度。在

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()

我想说,它实现这一点的一个方法是让你的网络简单地预测C或者将C作为标签
我一次又一次地看到这个。不要把神经网络和实际情况混淆。你只需学习一个函数F来近似给定输入X的输出Y。这是你的 在您的例子中,输出很容易是C+其他输出 取决于其他输出是什么,您的网络可以收敛并获得良好的结果。很可能不是这样,所以你的问题在这一点上是不完整的。
你必须问自己一些问题,比如:

  1. C+Ohter_输出对给定输入是否有意义。在
  2. 有没有一个好的方法可以让我序列化C+其他输出?比如说,第一个K来自N的输出数组元素描述C,剩下的N-K描述其他输出?在
  3. 是否是一个多类问题,如果另一个输出是一个不同的问题,或者有可能变成一个同类的多类多类问题,那么这个问题可以与C一起收敛,或者使它们都是多标签问题?在

在选择架构之前,您至少需要问自己一些问题。
也就是说,不,除非你训练你的网络去学习A B DC之间的模式,否则它将无法预测缺失的输入。在

祝你好运,
加布里埃尔

相关问题 更多 >