【问题标题】:Increase the complexity of RNNs增加 RNN 的复杂性
【发布时间】:2018-02-13 08:13:56
【问题描述】:

我一直在研究一个大数据集,我一直在尝试不同的机器学习算法。我使用 XGBoost 得到了非常好的结果,但我得到的最好结果来自 SVM。但由于我的数据分布在 8 年,而且它是一个时间序列模型,因此我也想到了使用 RNN。我一直在通过增加层数或每层的节点数来试验 RNN-LSTM 的超参数,因为没有这样的经验法则。但我什至还没有接近我的 XGBoost 结果。我注意到的奇怪的事情是,即使我将 epoch 的数量从 100 增加到 1000,或者我将隐藏层的数量从 1 增加到 3,或者我改变每层的节点,模型的性能总是相同的既适用于训练集,也适用于测试集。我正在分享我的 RNN-LSTMs 代码,如果我遗漏了什么,请告诉我。从理论上讲,它至少与 SVM 一样好,如果不是更好的话,因为数据质量也非常好而且很长。

# Getting the inputs and the ouputs
X = allData.iloc[:-48,:-1].values
y = allData.iloc[:-48,-1].values
y = y.reshape(-1,1)

# Feature Scaling
from sklearn.preprocessing import MinMaxScaler
sc_x = MinMaxScaler()
sc_y = MinMaxScaler()
X = sc_x.fit_transform(X)
y = sc_y.fit_transform(y)
y = np.ravel(y)
X = np.reshape(X, (-1,1,X.shape[1]))
y = np.reshape(y, (-1,1,1))

# Building RNN
regressor = Sequential()
regressor.add(LSTM(units = 8,activation = 'tanh',recurrent_activation = 'relu',return_sequences = True, input_shape = (X.shape[1],X.shape[2])))
regressor.add(LSTM(units = 3,activation = 'tanh', recurrent_activation ='relu', return_sequences = True))
regressor.add(TimeDistributed(Dense(units = 1)))
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X, y, batch_size = 32,shuffle = False, epochs = 100,validation_split=0.1)

我无法从这个模型中获得可比的准确度。我还可以在 RNN 中尝试哪些其他事情,以使其执行至少类似于其他机器学习算法?

【问题讨论】:

  • X 和 y 在发送到 RNN 之前的最终形状是什么?另外,您为什么不在 LSTM 中使用默认激活?我从不碰那些选项。除非您使用有状态的 LSTM,否则 Shuffle 应该始终为真。
  • X 的最终形状是 (3163,24,5),y 的最终形状是 (3163,24,1)。 24 是因为数据是每小时数据,所以我认为 24​​ 将为 LSTM 提供最佳信息。我也尝试使用默认激活,但结果相同。我将 shuffle 设为 false,因为我不确定如果 2016 年的一批与 2013 年的一批相关联(如果我对 shuffle 有正确的理解),时间序列将如何保持。我尝试使用有状态 LSTM,但它们的表现更差。
  • 只是一些提示。 1. 使用 Standard Scaler 2. 你对 XgBoost 使用相同的标量吗? 3. 使用默认激活 4. 增加你的批量大小,比如 256 5. 增加单位到至少 32。 6. 您需要以特殊顺序准备数据以输入有状态 LSTM(暂时忽略有状态)。 7. 在上面发布 XgBoost 与 LSTM MSE 的结果。
  • 是的,谢谢你的提示。 1) 3) 4) 5) 会试试这个。 2) 对于 SVM 和 XGBoost,没有使用缩放器。 6. 你到底是什么意思?我该如何准备特殊订单?与 SVM 和 XGBoost 相比,我为 RNN 做的特征工程较少,例如,由于假设 RNN 包含这些信息,因此没有采取任何滞后。 7. SVM-243、XGBoost-270、RNN-350 的 MSE。
  • 我尝试进行这些更改,但 MSE 大约为 450。@Sachin_ruk

标签: python algorithm machine-learning keras rnn


【解决方案1】:

我建议在调整它以包含 RNN 层之前尝试一个简单的多级感知器模型。我遇到了类似的情况,最后我使用了 XGBoost 模型,不是因为准确率可比,而是更容易解释和理解。

此外,尝试将您的问题转换为分类一(将 Y 分类为类等)。

【讨论】:

  • 完全同意 XGBoost 的透明度因子,是的,我也会尝试一个简单的多级感知器模型,只是为神经网络模型设置基准。但是,如果现在最终结果(准确性)是我唯一关心的事情,即使它来自黑匣子,只要它是稳健的,这可以从它在验证和测试集上的表现中看出?有时将其转换为分类问题也很有用,但我需要获得确切的数字而不是范围,因此在这种情况下无法做到,但感谢您的想法。
【解决方案2】:

我会尝试使用有状态的 LSTM,以获得长期依赖的全部好处。我还建议不要使用 min-max 缩放,也许尝试 mean-std 缩放,然后在 -1,1 或 0,1 之间裁剪值。此外,在循环连接中使用 relu 对我来说似乎很奇怪。也许尝试使用对称的。

【讨论】:

  • 是的,将尝试有状态的 LSTM。我很困惑何时在运行它时使用 reset_state() 参数,就好像我将批量大小设置为 1,然后在每个 epoch 之后使用 reset_state() 它会记住整个系列,这意味着整个 5 6 年。我希望它比年度更能记住季节性模式,所以希望我可以相应地重置状态。这种缩放是否意味着 2 层缩放。首先我们进行标准化,然后我们使用 min max 并使所有内容都在 (-1,1) 或 (0,1) 的范围内?将尝试使用 tanh 或 sigmoid 然后进行循环连接。
  • 我实际上认为最好使用一些固定的缩放器并裁剪数据。有时,如果存在归因于最小值或最大值的异常值,则使用 min max 可能会损失很多方差。在批量大小 1 之后调用 reset_state() 是对的,这意味着它不会每年重置,但只会在整个 5-6 年后重置。如果您想在每年之后重置,只需拆分为 5-6 个年度示例并在每个示例之间再次重置状态,批量大小为 1。
  • 数据裁剪不会影响数据的时间序列性质吗?所以我尝试了一个有状态的 LSTM,而不是整个 5 到 6 年,我只用了 1 年,然后让模型学习一切。当我将激活用作 relu 时,我的训练损失为 nan,所以我将其更改为 sigmoid,现在 mse 接近 400。我认为现在发生了一些过度拟合。不过谢谢你的建议。
  • 不,我的意思是在小于最大最小值的范围内进行规范化。因此,您将拥有诸如 1.2 或 -0.2 之类的值,但您可以将它们重新分配为 1 或 0。祝您建模的其余部分好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2017-04-23
  • 1970-01-01
相关资源
最近更新 更多