【发布时间】:2022-06-30 20:07:29
【问题描述】:
我建立了一个多步骤、多变量的 LSTM 模型,通过 5 天的回溯预测未来 5 天的目标变量。该模型运行平稳(即使它必须进一步改进),但是一旦我得到我的预测,我就无法正确地反转应用的转换。 我在网上看到有很多方法可以预处理和转换数据。我决定按照以下步骤操作:
- 数据提取和清理
df = yfinance.download(['^GSPC', '^GDAXI', 'CL=F', 'AAPL'], period='5y', interval='1d')['Adj Close'];
df.dropna(axis=0, inplace=True)
df.describe()
数据集表
- 将数据集拆分为训练和测试
size = int(len(df) * 0.80)
df_train = df.iloc[:size]
df_test = df.iloc[size:]
- 使用 MinMaxScaler() 分别缩放训练集和测试集
scaler = MinMaxScaler(feature_range=(0,1))
df_train_sc = scaler.fit_transform(df_train)
df_test_sc = scaler.transform(df_test)
- 创建与 LSTM 模型兼容的 3D X 和 y 时间序列
我借用this article下面的函数
def create_X_Y(ts: np.array, lag=1, n_ahead=1, target_index=0) -> tuple:
"""
A method to create X and Y matrix from a time series array for the training of
deep learning models
"""
# Extracting the number of features that are passed from the array
n_features = ts.shape[1]
# Creating placeholder lists
X, Y = [], []
if len(ts) - lag <= 0:
X.append(ts)
else:
for i in range(len(ts) - lag - n_ahead):
Y.append(ts[(i + lag):(i + lag + n_ahead), target_index])
X.append(ts[i:(i + lag)])
X, Y = np.array(X), np.array(Y)
# Reshaping the X array to an RNN input shape
X = np.reshape(X, (X.shape[0], lag, n_features))
return X, Y
#In this example let's assume that the first column (AAPL) is the target variable.
trainX,trainY = create_X_Y(df_train_sc,lag=5, n_ahead=5, target_index=0)
testX,testY = create_X_Y(df_test_sc,lag=5, n_ahead=5, target_index=0)
- 模型创建
def build_model(optimizer):
grid_model = Sequential()
grid_model.add(LSTM(64,activation='tanh', return_sequences=True,input_shape=(trainX.shape[1],trainX.shape[2])))
grid_model.add(LSTM(64,activation='tanh', return_sequences=True))
grid_model.add(LSTM(64,activation='tanh'))
grid_model.add(Dropout(0.2))
grid_model.add(Dense(trainY.shape[1]))
grid_model.compile(loss = 'mse',optimizer = optimizer)
return grid_model
grid_model = KerasRegressor(build_fn=build_model,verbose=1,validation_data=(testX,testY))
parameters = {'batch_size' : [12,24],
'epochs' : [8,30],
'optimizer' : ['adam','Adadelta'] }
grid_search = GridSearchCV(estimator = grid_model,
param_grid = parameters,
cv = 3)
grid_search = grid_search.fit(trainX,trainY)
grid_search.best_params_
my_model = grid_search.best_estimator_.model
- 获取预测
yhat = my_model.predict(testX)
- 预测值和实际值的逆变换
我的问题从这里开始,因为我不确定该走哪条路。我已经阅读了很多教程,但似乎这些作者更喜欢在将数据拆分为训练和测试之前对整个数据集应用 MinMaxScaler()。我不同意这一点,因为否则,训练数据将被我们不应该使用的信息(即测试集)错误地缩放。所以,我遵循了我的方法,但我被困在这里。
我在另一篇文章中找到了这个可能的解决方案,但它对我不起作用:
# invert scaling for forecast
pred_scaler = MinMaxScaler(feature_range=(0, 1)).fit(df_test.values[:,0].reshape(-1, 1))
inv_yhat = pred_scaler.inverse_transform(yhat)
# invert scaling for actual
inv_y = pred_scaler.inverse_transform(testY)
事实上,当我从原始数据集中仔细检查目标的最后一个值时,它们与 testY 的反向缩放版本不匹配。
有人可以帮我解决这个问题吗?非常感谢您的支持!
【问题讨论】:
-
为什么要应用逆变换?为什么不在训练测试拆分之前进行标准化的标准缩放器并称之为好
-
因为否则您将使用您不应该拥有的信息(即测试集部分)缩放用于训练的数据集部分。
标签: python keras transformation multi-step multivariate-time-series