【问题标题】:Problems with inverse_transform scaled predictions and y_test in multi-step, multi-variate LSTM多步、多变量 LSTM 中的 inverse_transform 缩放预测和 y_test 问题
【发布时间】:2022-06-30 20:07:29
【问题描述】:

我建立了一个多步骤、多变量的 LSTM 模型,通过 5 天的回溯预测未来 5 天的目标变量。该模型运行平稳(即使它必须进一步改进),但是一旦我得到我的预测,我就无法正确地反转应用的转换。 我在网上看到有很多方法可以预处理和转换数据。我决定按照以下步骤操作:

  1. 数据提取和清理
df = yfinance.download(['^GSPC', '^GDAXI', 'CL=F', 'AAPL'], period='5y', interval='1d')['Adj Close'];
df.dropna(axis=0, inplace=True)
df.describe()

数据集表

  1. 将数据集拆分为训练和测试
size = int(len(df) * 0.80)
df_train = df.iloc[:size]
df_test = df.iloc[size:]
  1. 使用 MinMaxScaler() 分别缩放训练集和测试集
scaler = MinMaxScaler(feature_range=(0,1))
df_train_sc = scaler.fit_transform(df_train)
df_test_sc = scaler.transform(df_test)
  1. 创建与 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)
  1. 模型创建
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

  1. 获取预测
yhat = my_model.predict(testX)
  1. 预测值和实际值的逆变换

我的问题从这里开始,因为我不确定该走哪条路。我已经阅读了很多教程,但似乎这些作者更喜欢在将数据拆分为训练和测试之前对整个数据集应用 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


【解决方案1】:

这里可以提到两件事。首先,你不能对你没有看到的东西进行逆变换。发生这种情况是因为您使用了两种不同的缩放器。 NN 将预测 Scaler 1 范围内的值,其中没有说这位于 Scaler 2 范围内(根据测试数据进行缩放)。其次,最佳实践是在训练集上安装你的缩放器,并在测试数据上使用相同的缩放器(仅转换)。现在,您应该能够对测试结果进行反向转换。第三,如果缩放关闭,因为测试集具有完全不同的值 - 例如发生在实时流数据中,由您来处理,例如min-max 缩放器将产生 > 1.0 的值。

【讨论】:

  • 我完全按照你写的做了:事实上,在第 3 节中,我使用了一个缩放器(MinMax Scaler),然后 fit_transform 训练集,同时只转换测试集。 --> df_train_sc = scaler.fit_transform(df_train) df_test_sc = scaler.transform(df_test)。问题是当我尝试对 y_hat 变量进行逆变换时出现错误,因为它的形状与原始缩放的 df_test 的形状不匹配。你知道我该如何处理吗?
【解决方案2】:

我也有同样的问题? 你的问题解决了吗?你能帮我解决我的问题吗

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2019-02-23
    • 1970-01-01
    • 2023-03-10
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多