【问题标题】:Use RobustScaler in a LSTM with Keras在带有 Keras 的 LSTM 中使用 RobustScaler
【发布时间】:2021-09-03 08:45:55
【问题描述】:

我想用异常值缩放时间序列数据,并将其用于带有 Keras 的 LSTM 模型。

我的缩放代码是:

# Train Data
scaler = RobustScaler().fit(train)
train = pd.DataFrame(scaler.fit_transform(train))
train = train.values
# Test Data
test = pd.DataFrame(scaler.transform(test))
test = test.values

之后,我将数据转换为 Keras 的 3D 格式:

# split a multivariate sequence into samples
def split_sequences(sequences, n_steps):
  X, y = list(), list()
  for i in range(len(sequences)):
    # find the end of this pattern
    end_ix = i + n_steps
    # check if we are beyond the dataset
    if end_ix > len(sequences)-1:
      break
    # gather input and output parts of the pattern
    seq_x, seq_y = sequences[i:end_ix, :], sequences[end_ix, :12]
    X.append(seq_x)
    y.append(seq_y)
  return np.array(X), np.array(y)

# choose a number of time steps
n_steps = 30

# convert into train input/output
X_trai, y_trai = split_sequences(train, n_steps)
print(X_trai.shape, y_trai.shape)

# convert into test input/output
X_test, y_test = split_sequences(test, n_steps)
print(X_test.shape, y_test.shape)

训练和预测效果很好,但是,我无法对测试数据集的预测 y 数据进行逆变换。

我的问题:

  1. 上述缩放方法正确吗?
  2. 如果是,我怎样才能恢复我的 y_hat 预测的原始规模,以将其与原始 y 测试数据集进行比较?

谢谢!

【问题讨论】:

    标签: python machine-learning keras neural-network scaling


    【解决方案1】:

    我对此很陌生,但这是我能够成功做到这一点的方式:

    1. 为各种功能创建一个转换器
    2. 为目标(即您要预测的事物)创建一个转换器
    3. 转换数据
    4. 创建数据集
    5. 创建并运行模型
    6. 使用“inverse_transform”函数将数据恢复为原始形式

    下面是我试图描述的示例。

    注意:这确实会导致我需要解决“带有复制警告的设置”,如“请参阅文档中的警告:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy iloc._setitem_with_indexer(indexer, value, self.name)"

    from sklearn.preprocessing import RobustScaler
    f_columns = ['A',
                 'B',
                 'C',
                 'D'
                 ]
    
    f_transformer = RobustScaler()
    target_transformer = RobustScaler()
    
    f_transformer = f_transformer.fit(train[f_columns].to_numpy())
    target_transformer = target_transformer.fit(train[['target']])
    
    train.loc[:, f_columns] = f_transformer.transform(train[f_columns].to_numpy()).copy()
    train['target'] = DA_transformer.transform(train[['target']]).copy()
    

    #步骤 4 和 5

    y_trai_inv = target_transformer.inverse_transform(y_trai.reshape(1, -1))
    y_test_inv = target_transformer.inverse_transform(y_test.reshape(1, -1))
    y_pred_inv = target_transformer.inverse_transform(y_pred)
    

    【讨论】:

      猜你喜欢
      • 2017-09-14
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2018-01-15
      • 2021-09-28
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多