2017-01-09 4 views
0

Я делаю предсказание на один шаг вперед, используя 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

ответ

0

Ваши данные выглядит как двоичные данные + шум. Ниже представлена ​​гистограмма исходных данных и гистограмма первой разности исходных данных. Если точное значение предсказания для вас не важно, я бы предложил сделать двоичный файл данных и использовать другую функцию стоимости, например. но я скептически отношусь к тому, что он будет работать, объясняя это ниже.

Если есть похожие последовательности с несколькими возможными следующими значениями, сеть попытается предсказать среднее значение. Например, рассмотрим последовательности (0,0,1) и (0,0,0) и (0,0, -1) и сеть, пытающуюся узнать их последние значения. С помощью данных игрушек лучшая MSE для любой предсказательной модели должна прогнозировать среднее значение последних значений, 0 в этом случае ...

Я предлагаю проверить, что изучает сеть, путем печати целевых значений Y и прогнозируемых целевых значений , Y_hat. Надеюсь, это поможет!

Raw Data Histogram1st Difference Histogram

+0

Спасибо большое. Очень полезные моменты, которые вы упомянули. Используя ваши комментарии, я начал думать о характере моего набора данных и проверил несколько вещей. Предполагается ли, что вы предположили, что в наборе данных может быть недостаточно шаблона/периодичности? И причина, по которой прогнозируется среднее, заключается в том, что данные воспринимаются как случайные сети? –

+0

Рассмотрим данные с двумя шаблонами: A) 0 следует 0 или 1 с равной вероятностью; B) 1 следует 0 или 1 с равной вероятностью. Модель, прошедшая обучение с минимальной среднеквадратической ошибкой, всегда будет прогнозировать 0,5, потому что это поведение приводит к лучшим потерям. – rafaelvalle

+0

Делает смысл. Спасибо. Я буду исследовать характеристики данных и входных последовательностей, чтобы проверить это. –

Смежные вопросы