我对机器学习还是新手,所以还在努力理解各种概念,请理解我的问题可能不够简洁明了。
我正在构建一个使用LSTM层的TensorFlow JS模型,用于时间序列预测(RNN)。
所使用的数据集每隔几百毫秒被ping一次(时间间隔随机)。然而,产生的数据可能具有非常广泛的范围,例如,接收到的数据大多数值为20、40、45等,但有时这个值会达到极端的75,000。
所以数据范围在1到75,000之间。
当我使用标准的最小/最大方法来标准化这些数据,产生0到1之间的值时,大多数数据请求的标准化数据会变成许多小数点后的有效数字。例如:’0.0038939328722009236′
所以我的问题是:
1) 这种最小/最大方法是否是标准化这类数据的最佳方法?
2) RNN模型是否能很好地处理如此多的有效数字和精度?
3) 我是否也应该标准化输出标签?(输出标签将只有一个)
更新
我刚刚发现了一个谷歌快速课程中的非常好的资源,深入探讨了为机器学习准备数据。建议的一个技术是“剪裁”极端数据。我在这里添加它供参考: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。
希望这能帮助其他人。