使用Keras进行时间序列预测 - 值接近平均值

时间:2017-01-09 20:18:26

标签: python keras

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

可以在此处找到数据csv文件: (https://drive.google.com/file/d/0Byiipc0dArG0LVZJelB4NFBucms/view?usp=sharing

使用第二列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%的数据用于培训,其余的是测试数据集。在下图中分别以绿色和红色显示的列车和测试数据集进行预测。

https://drive.google.com/file/d/0Byiipc0dArG0OEN5el9lc0puNGM/view?usp=sharing

您是否知道为什么会发生这种情况以及可能导致这种情况发生的原因?

谢谢, Faezeh

1 个答案:

答案 0 :(得分:0)

您的数据看起来很像二进制数据+噪音。 下面是原始数据的直方图和原始数据的第一个差异的直方图。如果预测的确切值对您来说并不重要,我建议将数据二进制并使用不同的成本函数,例如:二元交叉熵,虽然我怀疑它会起作用给出下面的解释。

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

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

Raw Data Histogram 1st Difference Histogram