Python Keras值接近平均值的时间序列预测

Python Keras值接近平均值的时间序列预测,python,keras,Python,Keras,我正在使用Keras中使用LSTM的数据集上的15个以前的样本进行一步超前预测 可以在以下位置找到数据csv文件: () 使用第二列col[1]值。第一列中的值(时间戳)根本不使用 我使用以下代码: # convert an array of values into a dataset matrix def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(

我正在使用Keras中使用LSTM的数据集上的15个以前的样本进行一步超前预测

可以在以下位置找到数据csv文件: ()

使用第二列col[1]值。第一列中的值(时间戳)根本不使用

我使用以下代码:

# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):
        dataX, dataY = [], []
        for i in range(len(dataset)-look_back-1):
                a = dataset[i:(i+look_back), 0]
                dataX.append(a)
                dataY.append(dataset[i + look_back, 0])
        return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset
dataframe = pandas.read_csv('node70-3000.csv', usecols=[1],
engine='python', skipfooter=3)
dataset = dataframe.values
dataset = dataset.astype('float32')
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
# split into train and test sets
train_size = int(len(dataset) * 0.7)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], 
dataset[train_size:len(dataset),:]
# reshape into X=t and Y=t+1
look_back = 15
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], trainX.shape[1], 1))
testX = numpy.reshape(testX, (testX.shape[0], testX.shape[1], 1))
# create and fit the LSTM network
batch_size = 11
model = Sequential()
model.add(LSTM(32, batch_input_shape=(batch_size, look_back, 1),
stateful=True))      
#model.add(LSTM(32, stateful = True))
model.add(Dense(32))
model.add(Dense(1))
# default lr=0.001
optim = Adam(lr=0.05, beta_1=0.9, beta_2=0.999, epsilon=1e-08,
decay=0.1)
model.compile(loss='mean_squared_error', optimizer=optim)
for i in range(50):
        model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size,
            verbose=2, shuffle=False)   
        model.reset_states()
# make predictions
问题是:

我用这段代码预测了几个周期性的、干净的时间序列,效果很好。然而,对于这组数据,我使用了不同的Adam参数(学习率等)。不过,我得到的预测值与实际值有很大的偏差。似乎预测值总是接近数据值的平均值。请看下图。我在csv文件中有1850个数据点。这些被分成大小为15的序列。输入是大小为15的序列。输出应该是预测的下一个值。70%的数据用于培训,其余为测试数据集。对下图中分别以绿色和红色显示的列车和试验数据集进行预测

()

你知道为什么会发生这种情况,是什么原因造成的吗


谢谢

您的数据看起来非常像二进制数据+噪声。 下面是原始数据的柱状图和原始数据的第一个差值的柱状图。如果预测的准确值对您不重要,我建议将数据二元化,并使用不同的成本函数,例如二元交叉熵,尽管我怀疑它是否能给出下面的解释

如果存在具有多个可能的下一个值的类似序列,网络将尝试预测平均值。例如,考虑序列(0,0,1)和(0,0,0)和(0,0,1)和网络试图学习他们的最后值。有了这个玩具数据,任何预测模型的最佳MSE都是预测最后值的平均值,在这种情况下为0

我建议通过绘制目标值Y和预测目标值Y来检查网络正在学习什么。 希望这有帮助


非常感谢。你提到的非常有用的几点。使用您的评论,我开始思考我的数据集的性质,并检查了一些东西。您的建议是否意味着数据集中可能没有足够的模式/周期?而平均预测的原因是数据被网络视为随机集?考虑两种模式的数据:a)0之后以相等的概率为0或1;B) 1后面跟着0或1,概率相等。一个训练过的最小化均方误差的模型总是预测0.5,因为这种行为会产生最好的损失。这是有意义的。非常感谢。我将研究数据和输入序列的特征,以验证这一点。