数据结构
在我们决定了为LSTM准备数据的正确顺序之后,我们需要选择使用哪种合适的数据结构。数据结构大致可以分为以下三种:
- Pandas DataFrame
- Numpy Arrays
- Lists
Pandas DataFrame
Pandas 是一个可靠的且便于操作的数据处理库。而我们在编写人工智能算法时,总是需要在进程的任何一步检查数据以便于调试。在 Pandas 库中可以很方便地做到这一点:
df.head()
Pandas 示例:谷歌股票
通过 Pandas 可以打印出数据情况,以检查在程序运行过程中是否出现错误。
Pandas 示例:一个模拟有监督学习问题的pandas dataframe
相比较而言, List 则具有多维度、不易于理解的缺点,对于调试工作不太友好。
Numpy Arrays
所有数据集或多或少都会转换为 NumPy Arrays 以进行编辑或缩放操作。例如,如果我们希望在0和1之间缩放数据集,可以使用名为MinMaxScaler的工具:
from sklearn.preprocessing import MinMaxScaler #df is pandas DataFrame #conversion to numpy array df = df.Values scaler = MinMaxScaler(feature_range=(0, 1)) scaled_values = scaler.fit_transform(df)
将整个数据集作为NumPy Array 的问题在于,无法详细查看其中的内容。不能够以列名称的方式查看数据(将数据集转换为有监督的学习问题时,这一点非常重要)。并且对于算法的调试工作不够友好。
幸运的是,可以轻松地从NumPy Arrays 切换回 DataFrame。
Lists
将数据集的内容存储在多维列表中是十分低效的。以 Kaggle 上发表的一段代码为例:
List 示例:一个四维的时间序列数据存储
不难发现,通过 Lists 难以直接定位数据并查看数据,并且不能够通过列名称的方式组织数据。
总结
规范化这个问题并不局限于LSTM,但是在 LSTM 编程过程中十分普遍。缺乏规范化导致在实际编程中,不能够直接一个接一个地调用程序或函数。
现有的情况下,代码看起来可能很简单而且很快,但是搜索错误、调试代码是个很大的问题。在函数声明过程中,输入数据的名称可能会更改,因此当想要检查隐藏在代码中的变量的值或输出时,往往不能简单地调用原始的数据名称,必须使用它所涉及到的所有代码才能提取该数据的真实值。
这就是本文推荐使用统一的数据框架的原因。通过统一使用 Pandas Dataframe,可以轻松地检查每个函数地输出,更好地进行算法调试工作。
deephub 小组经验
基本上所有的所有的编程语言的数字下标都是从0开始的,这就使得我们在处理序列数据的时候需要改掉以 1为起始的现实中的习惯。并且在python处理分片的时候使用的是左闭右开(绝大部分,并不是全部)的原则,这也是导致了我们对时序数组的操作需要特别的注意。
实际案例:LSTM需要通过前30天的数据,预测当天的数据,处理输入数据的数组下标如何写,有兴趣的小伙伴可以手动试试。