首页 > 解决方案 > 对具有如此广泛值的 LSTM 模型(使用 Tensorflow)的数据进行归一化的最佳方法是什么?

问题描述

我是机器学习的新手,所以仍然试图围绕概念来思考,如果我的问题可能不像需要的那样简洁,请记住这一点。

我正在构建一个带有 LSTM 层的 Tensorflow JS 模型,用于时间序列预测 (RNN)。

使用的数据集每隔几百毫秒(以随机间隔)被 ping 一次。但是,产生的数据范围可能非常广泛,例如,收到的大多数数据的值将是 20、40、45 等。但有时这个值会在极端情况下达到 75,000。

所以数据范围在 1 到 75,000 之间。

当我使用标准最小/最大值方法对该数据进行规范化以生成 0-1 之间的值时,大多数数据请求的规范化数据将包含许多小的有效小数位。例如:'0.0038939328722009236'

所以我的问题是:

1)这个最小值/最大值是标准化此类数据的最佳方法吗?

2) RNN 模型能否在如此多的重要小数位和精度下正常工作?

3)我还应该规范化输出标签吗?(其中将有 1 个输出)

更新

我刚刚在 google 快速课程中发现了一个非常好的资源,它深入研究了为 ML 准备数据。建议的一种技术是在极端情况下“剪辑”数据。以为我会在此处添加以供参考:https ://developers.google.com/machine-learning/data-prep

标签: javascripttensorflowmachine-learningnormalization

解决方案


在做了更多研究之后,我认为我现在有了一个不错的解决方案;

我将执行两个步骤,第一个是使用“分位数分桶”(或有时称为“分箱”参考:https ://developers.google.com/machine-learning/data-prep/transform/bucketing )。

实际上,它涉及将值范围拆分为较小的子集范围,并将整数值应用于每个较小的值范围。例如,1 到 1,000,000 的初始范围可以分解为 100k 的范围。所以 1 到 100,000 将是范围号 1,100,001 到 200,000 将是范围号 2。

为了在每个桶范围内均匀分布样本,由于我拥有倾斜的数据集,我修改了子集范围,以便它们在每个“桶”范围内捕获大致相同的样本。例如,上面示例的第一个范围可以是 1 到 1,000,而不是 1 到 100,000。下一个存储桶范围是 1,001 到 2,000。第三个可能是 2,001 到 10,000,依此类推。

在我的用例中,我最终得到了 22 个不同的存储桶范围。下一步是我自己的适应,因为我不想拥有 22 种不同的功能(如链接中所建议的那样)。相反,我将标准的最小/最大缩放应用于这些存储桶范围,从而只需要 1 个功能。这给了我 0 到 1 之间的归一化数据的最终结果,它完美地处理了我的倾斜数据集。

现在我得到的最低归一化值(0 除外)是 0.05556。

希望这对其他人有帮助。


推荐阅读