对具有如此大范围值的 LSTM 模型(使用 Tensorflow)进行数据标准化的最佳方法是什么?
What would be the best approach to normalise data for an LSTM model (using Tensorflow) with this wide range of values?
我是机器学习的新手,所以仍在努力思考概念,如果我的问题可能不够简洁,请记住这一点。
我正在构建一个带有 LSTM 层的 Tensorflow JS 模型,用于时间序列预测 (RNN)。
所使用的数据集每隔几百毫秒(随机间隔)执行一次 ping 操作。然而,产生的数据范围可能非常广泛,例如接收到的大部分数据将具有 20、40、45 等值。但是有时该值会在最末端达到 75,000。
所以数据范围在1到75000之间。
当我使用标准 min/max 方法规范化此数据以生成 0-1 之间的值时,大多数数据请求的规范化数据将保留许多小的有效小数位。例如:'0.0038939328722009236'
所以我的问题是:
1) 这是min/max标准化此类数据的最佳方法吗?
2) RNN 模型在有这么多有效小数位和精度的情况下是否能正常工作?
3) 我是否也应该规范化输出标签? (其中会有1个输出)
更新
我刚刚在 google 快速课程中发现了一个非常好的资源,它深入研究了为 ML 准备数据。建议的一种技术是 'clip' 极端数据。以为我会在这里添加它以供参考:https://developers.google.com/machine-learning/data-prep
经过更多的研究,我想我现在有了一个不错的解决方案;
我将执行两个步骤,第一个是使用 'quantile bucketing'(或有时称为 'binning' 参考:https://developers.google.com/machine-learning/data-prep/transform/bucketing)。
实际上,它涉及将值范围拆分为更小的子集范围,并将整数值应用于每个更小的值范围。例如1 到 1,000,000 的初始范围可以分解为 100k 的范围。所以 1 到 100,000 将是范围编号 1,100,001 到 200,000 将是范围编号 2。
为了在每个存储桶范围内均匀分布样本,由于我有倾斜的数据集,我修改了子集范围,以便它们在每个 'bucket' 范围内捕获大致相同的样本。例如,上面示例的第一个范围可以是 1 到 1,000,而不是 1 到 100,000。下一个存储桶范围是 1,001 到 2,000。第三个可能是 2,001 到 10,000 等等..
在我的用例中,我最终得到了 22 个不同的桶范围。下一步是我自己的改编,因为我不想拥有 22 个不同的功能(正如 link 中所建议的那样)。相反,我将标准 min/max 缩放应用于这些桶范围,结果只需要 1 个特征。这给了我 0 和 1 之间的归一化数据的最终结果,它完美地处理了我的倾斜数据集。
现在我得到的最小归一化值(0 除外)是 0.05556。
希望这对其他人有帮助。
我是机器学习的新手,所以仍在努力思考概念,如果我的问题可能不够简洁,请记住这一点。
我正在构建一个带有 LSTM 层的 Tensorflow JS 模型,用于时间序列预测 (RNN)。
所使用的数据集每隔几百毫秒(随机间隔)执行一次 ping 操作。然而,产生的数据范围可能非常广泛,例如接收到的大部分数据将具有 20、40、45 等值。但是有时该值会在最末端达到 75,000。
所以数据范围在1到75000之间。
当我使用标准 min/max 方法规范化此数据以生成 0-1 之间的值时,大多数数据请求的规范化数据将保留许多小的有效小数位。例如:'0.0038939328722009236'
所以我的问题是:
1) 这是min/max标准化此类数据的最佳方法吗?
2) RNN 模型在有这么多有效小数位和精度的情况下是否能正常工作?
3) 我是否也应该规范化输出标签? (其中会有1个输出)
更新
我刚刚在 google 快速课程中发现了一个非常好的资源,它深入研究了为 ML 准备数据。建议的一种技术是 'clip' 极端数据。以为我会在这里添加它以供参考:https://developers.google.com/machine-learning/data-prep
经过更多的研究,我想我现在有了一个不错的解决方案;
我将执行两个步骤,第一个是使用 'quantile bucketing'(或有时称为 'binning' 参考:https://developers.google.com/machine-learning/data-prep/transform/bucketing)。
实际上,它涉及将值范围拆分为更小的子集范围,并将整数值应用于每个更小的值范围。例如1 到 1,000,000 的初始范围可以分解为 100k 的范围。所以 1 到 100,000 将是范围编号 1,100,001 到 200,000 将是范围编号 2。
为了在每个存储桶范围内均匀分布样本,由于我有倾斜的数据集,我修改了子集范围,以便它们在每个 'bucket' 范围内捕获大致相同的样本。例如,上面示例的第一个范围可以是 1 到 1,000,而不是 1 到 100,000。下一个存储桶范围是 1,001 到 2,000。第三个可能是 2,001 到 10,000 等等..
在我的用例中,我最终得到了 22 个不同的桶范围。下一步是我自己的改编,因为我不想拥有 22 个不同的功能(正如 link 中所建议的那样)。相反,我将标准 min/max 缩放应用于这些桶范围,结果只需要 1 个特征。这给了我 0 和 1 之间的归一化数据的最终结果,它完美地处理了我的倾斜数据集。
现在我得到的最小归一化值(0 除外)是 0.05556。
希望这对其他人有帮助。