Прогнозирование / прогнозирование для разных временных рядов в Керасе - PullRequest
0 голосов
/ 16 октября 2018

Я использую это руководство по Kaggle для прогнозирования временных рядов (примерные данные прилагаются).

Вот код:

def create_dataset(dataset, window_size = 1):
    data_X, data_Y = [], []
    for i in range(len(dataset) - window_size - 1):
        a = dataset[i:(i + window_size), 0]
        data_X.append(a)
        data_Y.append(dataset[i + window_size, 0])
    return(np.array(data_X), np.array(data_Y))   

def fit_model(train_X, train_Y, window_size = 1):
    model = Sequential()

    model.add(LSTM(4, 
               input_shape = (1, window_size)))
    model.add(Dense(1))
    model.compile(loss = "mean_squared_error", 
              optimizer = "adam")
    model.fit(train_X, 
          train_Y, 
          epochs = 100, 
          batch_size = 1, 
          verbose = 0)

    return(model)

def predict_and_score(model, X, Y):
# Make predictions on the original scale of the data.
    pred = MinMaxScaler(feature_range = (0,1)).inverse_transform(model.predict(X))
# Prepare Y data to also be on the original scale for interpretability.
    orig_data = MinMaxScaler(feature_range = (0,1)).inverse_transform([Y])
# Calculate RMSE.

    score = math.sqrt(mean_squared_error(orig_data[0], pred[:, 0]))
    return(score, pred)

Вся эта вещь сейчасиспользуется в следующей функции:

def nnet(time_series, window_size=1,  ): 
    cmi_total_raw = vstack((time_series.values.astype('float32')))
    scaler = MinMaxScaler(feature_range = (0,1))
    cmi_total_scaled = scaler.fit_transform(cmi_total_raw)
    cmi_train_sc = (cmi_total_scaled[0:int(cmi_split*len(cmi_total_scaled))])
    cmi_test_sc = cmi_total_scaled[int(cmi_split*len(cmi_total_scaled)) : len(cmi_total_scaled)] 


    # Create test and training sets for one-step-ahead regression.
    window_size = 1
    train_X, train_Y = create_dataset(cmi_train_sc, window_size)
    test_X, test_Y = create_dataset(cmi_test_sc, window_size)

    # Reshape the input data into appropriate form for Keras.
    train_X = np.reshape(train_X, (train_X.shape[0], 1, train_X.shape[1]))
    test_X = np.reshape(test_X, (test_X.shape[0], 1, test_X.shape[1]))

    model = fit_model(train_X, train_Y, window_size)

    rmse_train, train_predict = predict_and_score(nn_model, train_X, train_Y)

    mape_test, test_predict = predict_and_score(model, test_X, test_Y)    
    return (mape_test, test_predict)   

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

Входные данные имеют 209 строк, и я хочу предсказать следующую (ые) строку (и).

Вот что я попробовал:

Поскольку то же самое делается в Auto-Arima с использованием метода forecast(steps= n_steps)Я искал что-то похожее в Керасе.

Из Кераса Документация :

predict(x, batch_size=None, verbose=0, steps=None)

Аргументы:

x: The input data, as a Numpy array (or list of Numpy arrays if the model has multiple inputs).

steps: Total number of steps (batches of samples) before declaring the prediction round finished. Ignored with the default value of None.

Я попытался изменить step, и это предсказало очень абсурдные значения порядка 100 000.Кроме того, длина test_predict не была близка к steps, который я дал.Поэтому я предполагаю, что step означает что-то еще здесь.

Вопрос - Можно ли использовать Keras для прогнозирования данных временных рядов (вне выборки) - Если да, есть ли forecast метод так же, как вышеупомянутый predict метод?- Если нет, можно ли каким-либо образом использовать существующий метод predict, чтобы выйти из выборочного прогноза?

Пример данных (cmi_total):

2014-05-25    272.459887
2014-06-01    272.446022
2014-06-08    330.301260
2014-06-15    656.838394
2014-06-22    670.575110
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...