Как предсказать будущие значения с помощью глубокого обучения?

#python #keras #deep-learning #prediction

#python #keras #глубокое обучение #прогнозирование

Вопрос:

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

Мой набор данных с 1 августа 2015 года по 1 августа 2020 года. Я хочу предсказать 1 августа 2020 года — 1 сентября 2020 года; но он прогнозирует до 1 августа 2020 года последним.

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

 def train_test_split(df, test_size=0.2):
    split_row = len(df) - int(test_size * len(df))
    train_data = df.iloc[:split_row]
    test_data = df.iloc[split_row:]
    return train_data, test_data
train, test = train_test_split(hist, test_size=0.2)

def line_plot(line1, line2, label1=None, label2=None, title=Crypto, lw=2):
    fig, ax = plt.subplots(1, figsize=(13, 7))
    ax.plot(line1, label=label1, linewidth=lw)
    ax.plot(line2, label=label2, linewidth=lw)
    ax.set_ylabel('price [USD]', fontsize=14)
    #ax.set_xlabel('Time [day]', fontsize=14)
    ax.set_title(title, fontsize=16)
    ax.legend(loc='best', fontsize=16)
line_plot(train[target_col], test[target_col], 'training', 'test', title='')

def normalise_zero_base(df):
    return df / df.iloc[0] - 1

def normalise_min_max(df):
    return (df - df.min()) / (df.max() - df.min())

def extract_window_data(df, window_len=5, zero_base=True):
    window_data = []
    for idx in range(len(df) - window_len):
        tmp = df[idx: (idx   window_len)].copy()
        if zero_base:
            tmp = normalise_zero_base(tmp)
        window_data.append(tmp.values)
    return np.array(window_data)

def prepare_data(df, target_col, window_len=10, zero_base=True, test_size=0.2):
    train_data, test_data = train_test_split(df, test_size=test_size)
    X_train = extract_window_data(train_data, window_len, zero_base)
    X_test = extract_window_data(test_data, window_len, zero_base)
    y_train = train_data[target_col][window_len:].values
    y_test = test_data[target_col][window_len:].values
    if zero_base:
        y_train = y_train / train_data[target_col][:-window_len].values - 1
        y_test = y_test / test_data[target_col][:-window_len].values - 1

    return train_data, test_data, X_train, X_test, y_train, y_test

def build_lstm_model(input_data, output_size, neurons=100, activ_func='linear', dropout=0.2, loss='mse', optimizer='adam'):
    model = Sequential()
    model.add(LSTM(neurons, input_shape=(input_data.shape[1], input_data.shape[2])))
    model.add(Dropout(dropout))
    model.add(Dense(units=output_size))
    model.add(Activation(activ_func))
    model.compile(loss=loss, optimizer=optimizer)
    return model

np.random.seed(42)
window_len = 5
test_size = 0.2
zero_base = True
lstm_neurons = 100
epochs = 100
batch_size = 32
loss = 'mse'
dropout = 0.2
optimizer = 'adam'

train, test, X_train, X_test, y_train, y_test = prepare_data(
    hist, target_col, window_len=window_len, zero_base=zero_base, test_size=test_size)
model = build_lstm_model(
    X_train, output_size=1, neurons=lstm_neurons, dropout=dropout, loss=loss,
    optimizer=optimizer)
history = model.fit(
    X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=1, shuffle=True)

targets = test[target_col][window_len:]
preds = model.predict(X_test).squeeze()
mean_absolute_error(preds, y_test)
# 0.027955859325876943

preds = test[target_col].values[:-window_len] * (preds   1)
preds = pd.Series(index=targets.index, data=preds)
line_plot(targets, preds, 'actual', 'prediction', lw=3)
 

Пример набора данных
Фото примера набора данных

Обучение Фото результатов обучения

Прогнозирование Фотография вывода прогноза

Комментарии:

1. Что вы пробовали до сих пор, что работает не так, как вам нравится. В принципе, что это за код, который вы нам показываете? 🙂

2. Извините, я здесь новичок: (Мой набор данных с 1 августа 2015 года по 1 августа 2020 года. Я хочу предсказать 1 августа 2020 года — 1 сентября 2020 года; но он прогнозирует до 1 августа 2020 года последним. По сути, я хочу предсказать даты, которые еще не включены в dataset.

Ответ №1:

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

Следующий рисунок позволяет лучше понять, как это работает. * Указывает на прогнозируемое значение, в отличие от реальных значений. Итак 1 ... 8 9 10 , ваши 10 последних реальных значений. -> Указывает на вашу функцию модели.

 input -> output*

1 ... 8 9 10 -> 11*

2 ... 9 10 11* -> 12*

3 ... 10 11* 12* -> 13*

...

n-9* ... n-2* n-1* n* -> n 1*

 

Комментарии:

1. Но мой код не предсказывает вперед, не так ли? 1 … 8 9 10 -> 10*