Я делаю предсказание на один шаг вперед, используя 15 предыдущих образцов в наборе данных, используя LSTM в Keras.Прогнозирование временных рядов с помощью Keras - значения близки к среднему
Файл CSV данные можно найти здесь: (https://drive.google.com/file/d/0Byiipc0dArG0LVZJelB4NFBucms/view?usp=sharing)
Второй столбец цв [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
Проблема:
Я использовал этот код, чтобы предсказать еще несколько периодических и чистый временных рядов, и она работает хорошо. Однако для этого набора данных я использовал разные параметры Адама (скорость обучения и т. Д.). Тем не менее, я получаю предсказание с большим смещением от фактических значений. Похоже, что предсказанные значения всегда близки к средним значениям данных. См. Следующий график. У меня есть 1850 точек данных в файле csv. Они сгруппированы в последовательности размером 15. Вход представляет собой последовательность размером 15. Выход должен быть следующим прогнозируемым значением. 70% данных используется для обучения, а остальное - набор тестовых данных. Предсказание выполняется на наборах поездов и испытаний, показанных зеленым и красным соответственно на следующем изображении.
(https://drive.google.com/file/d/0Byiipc0dArG0OEN5el9lc0puNGM/view?usp=sharing)
Есть ли у вас какие-либо идеи, почему это происходит и что может быть причиной?
Спасибо, Faezeh
Спасибо большое. Очень полезные моменты, которые вы упомянули. Используя ваши комментарии, я начал думать о характере моего набора данных и проверил несколько вещей. Предполагается ли, что вы предположили, что в наборе данных может быть недостаточно шаблона/периодичности? И причина, по которой прогнозируется среднее, заключается в том, что данные воспринимаются как случайные сети? –
Рассмотрим данные с двумя шаблонами: A) 0 следует 0 или 1 с равной вероятностью; B) 1 следует 0 или 1 с равной вероятностью. Модель, прошедшая обучение с минимальной среднеквадратической ошибкой, всегда будет прогнозировать 0,5, потому что это поведение приводит к лучшим потерям. – rafaelvalle
Делает смысл. Спасибо. Я буду исследовать характеристики данных и входных последовательностей, чтобы проверить это. –