Keras Prediction после тестовых значений - PullRequest
1 голос
/ 27 марта 2019

В настоящее время я пытаюсь построить нейронную сеть, чтобы иметь возможность прогнозировать временные ряды, но вопрос в том, можно ли прогнозировать дальше, чем просто набор тестовых данных.Я имею в виду, для моего примера, у меня есть набор данных около 3000 значений, из которых я оставляю 90% для обучения и 10% для тестирования.Затем, когда я сравниваю прогноз с фактическим тестовым значением, оно соответствует, но можно ли, например, попросить программу прогнозировать следующие 500 значений (т. Е. От 3001 до 3500)?

Вот фрагменткод, который я использую.

import csv
import numpy as np
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM, GRU
from keras.models import Sequential
from keras import optimizers
from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import learning_curve
from sklearn.kernel_ridge import KernelRidge
import time
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (-1, 1))


def load_data(datasetname, column, seq_len, normalise_window):
    # A support function to help prepare datasets for an RNN/LSTM/GRU
    data = datasetname.loc[:,column]

    sequence_length = seq_len + 1
    result = []
    for index in range(len(data) - sequence_length):
        result.append(data[index: index + sequence_length])

    result = np.array(result)
    result.reshape(-1,1)
    training_set_scaled = sc.fit_transform(result)

    print (result)
    #Last 10% is used for validation test, first 90% for training
    row = round(0.9 * training_set_scaled.shape[0])
    train = training_set_scaled[:int(row), :]
    #np.random.shuffle(train)
    x_train = train[:, :-1]
    y_train = train[:, -1]
    X_test = training_set_scaled[int(row):, :-1]
    y_test = training_set_scaled[int(row):, -1]
    print ("shape train", x_train)
    print ("shape train", X_test)
    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
    X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))  

    return [x_train, X_test, y_train, y_test]


def build_model():
    model = Sequential()
    layers = {'input': 100, 'hidden1': 150, 'hidden2': 256, 'hidden3': 100, 'output': 10}

    model.add(LSTM(
            50, 
            return_sequences=True, 

            input_shape=(200,1)
            ))
    model.add(Dropout(0.2))

    model.add(LSTM(
            layers['hidden2'],
            return_sequences=True,
           ))
    model.add(Dropout(0.2))

    model.add(LSTM(
            layers['hidden3'],
            return_sequences=False,
            ))
    model.add(Dropout(0.2))

    model.add(Activation("linear"))

    model.add(Dense(
            output_dim=layers['output']))


    start = time.time()
    model.compile(loss="mean_squared_error", optimizer="adam")
    print ("Compilation Time : ", time.time() - start)
    return model

dataset = pd.read_csv(
    'data.csv')
X_train, X_test, y_train, y_test = load_data(dataset, 'mean anomaly', 200, False)
model = build_model()
print ("train",X_train)
print ("test",X_test)

model.fit(X_train, y_train, batch_size=256, epochs=1,  validation_split=0.05)
predictions =  model.predict(X_test)
predictions = np.reshape(predictions, (predictions.size,))
plt.figure(1)
plt.subplot(311)
plt.title("Actual Test Signal w/Anomalies & noise")
plt.plot(y_test)
plt.subplot(312)
plt.title("predicted signal")
plt.plot(predictions, 'g')
plt.subplot(313)
plt.title("training signal")
plt.plot(y_train, 'b')
plt.plot(y_test, 'y')
plt.legend(['train', 'test'])
plt.show()

Я прочитал, что мне нужно увеличить выходную яркость плотного слоя, чтобы получить более 1 прогнозируемого значения, или увеличить размер моего окна в функции загрузки данных?

Вот результат, желтый график должен быть после синего, он представляет мои входные тестовые данные, первый график - это увеличение этих данных, а второй - прогноз.result

1 Ответ

0 голосов
/ 27 марта 2019

Если вы хотите предсказать выходное значение вашей серии на t + x на основе данных за время t , данные, которые необходимо передать в сеть, уже должны иметь это формат.

Формирование данных временных рядов:

Если у вас есть 3000 точек данных и вы хотите предсказать выходное значение для следующей «виртуальной» точки 500, вы должны сместить выходное значение на эту величину. Для примера:

В вашем наборе данных ваша 500-я точка данных соответствует 500-му выходному значению. Если вы хотите предсказать «будущие» значения, то у 500-й точки данных должно быть 1000-е выходное значение. Вы можете сделать это в пандах с помощью функции shift . Имейте в виду, что при этом вы потеряете последние 500 точек данных, если у них больше не будет выходного значения.

Тогда, когда вы прогнозируете точку данных xi, вы получите выходное значение yi + 500. На таких сайтах, как machinelearningmastery

, вы должны найти некоторые основные руководства по прогнозированию временных рядов.

Хорошая практика для оценки модели:

Если вы хотите лучше оценить качество своей модели, сначала найдите метрики, которые соответствуют вашей проблеме, и попробуйте увеличить процентное соотношение тестовых наборов. Хотя графика является хорошим способом визуализации результата, она может быть обманчива, попробуйте объединить ее с некоторыми показателями! (будьте осторожны с Mean Squarred Error, он может дать вам смещенную оценку со значением в диапазоне [-1; 1], поскольку квадрат ошибки в этом диапазоне всегда будет меньше, чем острая ошибка, вместо этого попробуйте Mean Absolute Error)

Утечка данных при отбрасывании данных:

Несмотря на то, что удаление данных, как правило, хорошо, вам нужно быть осторожным при этом. Вы допустили нечто, называемое утечкой данных. Вы использовали scalling для всего набора данных перед тем, как разбить его на обучающие и тестовые наборы. Дальнейшее чтение об этой утечке данных .

Обновление

Мне кажется, я неправильно понял вашу проблему.

Если вы хотите «прогнозировать дальше, чем просто набор тестовых данных», вам понадобятся некоторые невидимые / новые данные, чтобы сделать больше прогноза. Набор тестов предназначен только для оценки эффективности фазы обучения.

Теперь, если вы хотите прогнозировать дальше, чем просто следующий шаг (это не позволит вам «прогнозировать дальше, чем просто набор тестовых данных» из-за способа изменения набора данных, см. Ниже): Ваша модель в том виде, в котором она сделана, только когда-либо предскажет следующий шаг.

В вашем примере вы передаете алгоритму серию длины 'seq_len' и даете им в качестве выходного значения сразу после окончания этих рядов. Если вы хотите, чтобы ваш алгоритм научился предсказывать более чем один шаг в будущее, вы должны иметь значение y_train в соответствующее время в будущем, например:

x = [0,1,2,3,4,5,6,7,8,9,10,...]
seq_len = 5
step_to_predict = 5

Итак, чтобы предсказать не один шаг в будущее, а пять, ваша серия должна выглядеть следующим образом:

x_serie_1 = [0,1,2,3,4]
y_serie_1 = [9]
x_serie_2 = [1,2,3,4,5]
y_serie_2 = [10]

Это способ научить вашу модель тому, как делать прогнозы дальше в будущее, чем просто следующий шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...