Прогноз на будущее с использованием набора данных временных рядов с Tensorflow - PullRequest
5 голосов
/ 20 марта 2019

У меня есть данные временного ряда в течение почти 5 лет.Используя эти данные, я хочу прогнозировать следующие 2 года.Как это сделать?

Я ссылался на многие сайты по этому поводу.Я заметил, что в основном прогнозы делаются только с тем же набором данных, которые используются для обучения, которые они не прогнозируют на будущее, например на следующие 30 дней.Если возможно достичь этого через TensorFlow.Могу ли я узнать, как этого добиться?

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout

dataset_train = pd.read_csv(r'C:\Users\Kavin\source\repos\SampleTensorFlow\SampleTensorFlow\data\traindataset.csv')
training_set = dataset_train.iloc[:, 1:2].values

sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)

X_train = []
y_train = []
for i in range(60, 2035):
    X_train.append(training_set_scaled[i-60:i, 0])
    y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))


regressor = Sequential()

regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))


regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)


dataset_test = pd.read_csv(r'C:\Users\Kavin\source\repos\SampleTensorFlow\SampleTensorFlow\data\testdataset.csv')
result = dataset_test[['Date','Open']]
real_stock_price = dataset_test.iloc[:, 1:2].values


dataset_total = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 76):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)

result['PredictedResult'] = pd.Series(predicted_stock_price.ravel(), index=result.index)

result.to_csv(r"C:\Users\Kavin\Downloads\PredictedStocks.csv", index=False)

ax = plt.gca()

result.plot(kind='line', x='Date', y='Open', color='red', label = 'Real Stock Price', ax=ax)
result.plot(kind='line', x='Date', y='PredictedResult', color='blue', label = 'Predicted Stock Price', ax=ax)

plt.show()

1 Ответ

1 голос
/ 22 марта 2019

для всех проблем машинного обучения вы хотите задать себе вопрос «Что я хочу предсказать и какие данные у меня есть?»

В вашем случае вы хотите предсказать значения в неопределенное время вБудущее, назовем это время T .

Мы предполагаем, что ваши текущие данные помечены, т.е.для каждого сэмпла / строки ( x ) у вас есть соответствующее значение ( y ).Пусть xt будет меткой времени ваших x данных

Если вы хотите предсказать y во время xt + T , то вы должны передать свой алгоритм с данными, такими как для каждого образца x , соответствующая метка y в момент времени xt + T .

Таким образом, ваш алгоритм «научится» предсказывать значение y во время xt + T из данных во время xt

С Pandas это может быть достигнуто с помощью shift .

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