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

Time series prediction with Keras - values close to average

我正在使用 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)

你知道为什么会这样吗?是什么原因造成的?

谢谢!

您的数据看起来很像二进制数据 + 噪声。 下面是原始数据的直方图和原始数据的一阶差分直方图。如果预测的确切值对您不重要,我建议将数据设为二进制并使用不同的成本函数,例如二元交叉熵,尽管我怀疑它是否会在下面给出解释。

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

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