javascript - 对具有如此广泛值的 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
解决方案
在做了更多研究之后,我认为我现在有了一个不错的解决方案;
我将执行两个步骤,第一个是使用“分位数分桶”(或有时称为“分箱”参考: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。
希望这对其他人有帮助。
推荐阅读
- c++ - 当前形式的“std::exception”是多余的吗?
- reactjs - React Native Audio 向后端发送语音注释
- python - 深度学习无法运行 model.fit 函数
- asp.net-core-middleware - 在 Per-request 依赖项中使用多个实现的中间件
- javascript - Jquery自动增加和减少输入
- oracle - PL/SQL: PL/SQL: ORA-00942: 表或视图不存在
- android - getViewTreeObserver 用于 2 个视图
- go - 生成邀请码的字符串编号
- grammar - 用列表扩展 Antlr 语法文件
- json - 将 JSON 发送到 Django 后端