Я пытаюсь проверить оценки прогноза LSTM для временных рядов для прогноза фондового рынка (ссылка на набор данных https://www.kaggle.com/camnugent/sandp500, я использую запас AAL). Данные имеют такую форму:
open high
0 15.07 15.12
1 14.89 15.01
2 14.45 14.51
3 14.30 14.94
4 14.94 14.96
... ... ...
1254 54.00 54.64
1255 53.49 53.99
1256 51.99 52.39
1257 49.32 51.50
1258 50.91 51.98
1259 rows × 2 columns
При использовании model.fit и model.predict я вижу, что результаты не очень хорошие, но по крайней мере показывают, что соответствует реальным данным. (Только изображение показывает прогноз, поэтому обучение составило 80% от набора данных)
Теперь при использовании cross_val_predict или cross_val_score результаты действительно плохие, как 0,30 в конце до 0,003. полный код:
import numpy as np
import math
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_predict
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from tscv import GapKFold
from keras.wrappers.scikit_learn import KerasClassifier
sc = MinMaxScaler()
# define parameters
prevision_days = 5
verbose, epochs, batch_size = 1, 20, 50
size_test = 0.2 #20%
# fix random seed for reproducibility
seed = 7
np.random.seed(seed)
# load the dataset file
original_dataset = pd.read_csv('..\\dataset\\all_stocks_5yr.csv')
original_dataset.loc[original_dataset['low'].isnull(),'low'] = original_dataset['close']
original_dataset.loc[original_dataset['open'].isnull(),'open'] = original_dataset['close']
original_dataset.loc[original_dataset['high'].isnull(),'high'] = original_dataset['close']
dataset = original_dataset[original_dataset.Name == 'AAL'].drop(['date', 'volume', 'Name'], axis=1)
dataset = dataset[['open','high']]
#breaking in train/test
test_size = -1*int(prevision_days * round((math.floor(len(dataset)*size_test))/prevision_days))
dataset_scaled = sc.fit_transform(dataset)
#Preparing the data
data = []
target = []
for i in range(prevision_days, len(dataset_scaled)):
data.append(dataset_scaled[i-prevision_days:i, 0])
target.append(dataset_scaled[i, 0])
data, target = np.array(data), np.array(target)
data = np.reshape(data, (data.shape[0], data.shape[1], 1))
# Function to create model, required for KerasClassifier
def create_model():
# create model
model = Sequential()
model.add(LSTM(units = 50, return_sequences = True, input_shape = (data.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(units = 50, return_sequences = True))
model.add(Dropout(0.2))
model.add(LSTM(units = 50))
model.add(Dropout(0.2))
model.add(Dense(units = 1))
model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics=['accuracy'])
return model
model = KerasClassifier(build_fn=create_model, epochs=epochs, batch_size=batch_size, verbose=verbose)
results = cross_val_predict(model, data, target, cv=5)
print(results)
результаты:
[[0.30032859]
[0.30032859]
[0.30032859]
...
[0.00306681]
[0.00306681]
[0.00306681]]
Есть идеи, что может быть причиной этих результатов? Я уже увеличил эпоху до 50 и batch_size также до 50, но результаты точно такие же, что тоже странно.
Большое спасибо, Жуан