当前位置: 首页 > 科技观察

使用开源工具生成合成时间序列数据

时间:2023-03-13 15:32:04 科技观察

使用开源工具生成合成时间序列数据与表格数据一样,我们通常希望生成合成时间序列数据以保护敏感信息或在真实数据稀缺时创建更多训练数据。合成时间序列数据的一些应用包括:传感器读数、带时间戳的日志消息、金融市场价格和医疗记录。时间的额外维度(跨时间点的趋势和相关性与变量之间的相关性同样重要)对合成数据提出了额外的挑战。我们在Gretel之前曾发表过关于合成时间序列数据的博客,但一直在寻找可以改进合成数据生成的新模型。我们非常喜欢DoppelGANger模型和Lin等人合着的相关论文:《使用GAN共享网络时间序列数据:挑战、前景和未决问题》,并将该模型集成到我们的API和控制台中。作为这项工作的一部分,我们在PyTorch中重新实现了DoppelGANger模型,并很高兴将其作为开源gretel-synthetics库的一部分发布。本文概述了DoppelGANger模型,提供了PyTorch实现的示例用法,并展示了合成日常维基百科网络流量任务的出色合成数据质量:与TensorFlow1实现相比,运行时间快约40倍。DoppIGANger模型DoppelGANger基于生成对抗网络(GAN),对其进行了修改以更好地适应时间序列生成任务。作为GAN,该模型使用对抗训练方案通过比较合成数据和真实数据来同时优化鉴别器和生成器网络。经过训练后,输入噪声可以传递到生成器网络以创建任意数量的合成时间序列数据。在论文中,Lin等人。介绍了现有的合成时间序列方法和自己的观察以确定局限性,并提出了几个具体的改进——DoppelGANger由此而来,包括通用的GAN改进和时间特定的Sequencetricks。下面列出了一些关键修改:生成器包含一个用于生成序列数据的LSTM,但具有批处理设置,其中每个LSTM单元输出多个时间点以改善时间相关性。在训练和生成期间支持可变长度序列(已计划,但尚未在我们的PyTorch版本中实现)。比如说,一个模型可以使用并创建10或15秒的传感器测量值。支持不随时间变化的固定变量(属性)。这些信息通常伴随着时间序列数据,例如历史金融价格数据中与每只股票相关的行业或部门。支持连续变量的逐个样本缩放以处理具有大动态范围的数据。例如,流行的维基百科页面的页面浏览量与稀有的维基百科页面相差几个数量级。使用具有梯度惩罚的Wasserstein损失减少模式崩溃并改进训练。关于术语和数据设置的附注。DoppelGANger需要具有多个时间序列示例的训练数据。每个示例由0个或多个属性值、不随时间变化的固定变量以及在每个时间点观察到的1个或多个特征组成。当组合成训练数据集时,这些示例看起来像2d属性数组(示例x固定变量)和3d特征数组(示例x时间x时间变量)。根据任务和可用数据,此设置可能需要将几个较长的时间序列拆分为可用作训练示例的较短块。总的来说,这些对基础GAN的修改提供了一个富有表现力的时间序列模型,可以生成高保真合成数据。DoppelGANger学习和生成不同尺度(例如每周和每年趋势)的时间相关数据的能力给我们留下了特别深刻的印象。有关模型的完整详细信息,请阅读论文。示例用法我们的PyTorch实现支持两种输入样式(numpy数组或pandasDataFrame)以及模型的许多配置选项。有关完整的参考文档,请参阅https://synthetics.docs.gretel.ai/。要使用我们的模型,最简单的方法是使用pandasDataFrame中的训练数据。对于此设置,数据必须采用“宽”格式,其中每一行都是一个示例,一些列是属性,其余列是时间序列值。以下代码片段演示了从DataFrame训练和生成数据。#创建一些随机训练数据df=pd.DataFrame(np.random.random(size=(1000,30)))df.columns=pd.date_range("2022-01-01",periods=30)#包含一个属性columndf["attribute"]=np.random.randint(0,3,size=1000)#训练模型model=DGAN(DGANConfig(max_sequence_len=30,sample_len=3,batch_size=1000,epochs=10,#对于真实数据sets,100-1000epochsistypical))model.train_dataframe(df,df_attribute_columns=["attribute"],attribute_types=[OutputType.DISCRETE],)#Generatesyntheticdatasynthetic_df=model.generate_dataframe(100)如果你的数据不是然而,这种“宽”格式可以使用pandaspivot方法转换为预期的结构。DataFrame输入目前有些受限,但我们计划在未来支持其他接受时间序列数据的方式。为了获得最大的控制和灵活性,您还可以直接传递numpy数组进行训练(并在生成数据时类似地接收属性和特征数组),如下所示。#创建一些随机训练数据attributes=np.random.randint(0,3,size=(1000,3))features=np.random.random(size=(1000,20,2))#训练模型model=DGAN(DGANConfig(max_sequence_len=20,sample_len=4,batch_size=1000,epochs=10,#对于真实数据集,100-1000epochs是典型的))model.train_numpy(attributes,features,attribute_types=[OutputType.DISCRETE]*3,feature_types=[OutputType.CONTINUOUS]*2)#Generatesyntheticdatasynthetic_attributes,synthetic_features=model.generate_numpy(1000)这些代码片段的可运行版本可在sample_usage.ipynb获得。由于从TensorFlow1迁移到PyTorch的新实现(在优化器、参数初始化等低级组件方面存在潜在差异),我们想确认我们的PyTorch代码是否按预期运行。为此,我们复制了原始论文中的一些结果。由于我们当前的实现仅支持固定长度的序列,因此我们专注于维基百科网络流量(WWT)的数据集。Lin等人使用的WWT数据集。最初来自Kaggle,包含测量各种维基百科页面的每日流量的数据。每个页面都有三个不同的属性(域、访问类型和代理)。图1显示了WWT数据集中的几个示例时间序列。图1:三个维基百科页面按比例缩放的每日综合浏览量,页面属性列在右侧请注意,综合浏览量按对数比例缩放为[-1根据整个数据集的最小/最大综合浏览量,1]。我们在实验中使用的50K页训练数据(已缩放)在S3上以csv格式提供。我们提供的三个图表显示了合成数据保真度的不同方面。在每个图中,我们将真实数据与三个合成版本进行比较:1)具有更大批量和更小学习率的快速PyTorch实现,2)具有原始参数的PyTorch实现,以及3)TensorFlow1实现。在图2中,我们查看属性分布,其中合成数据与真实分布非常接近。图2:真实和合成WWT数据的属性分布WWT数据面临的挑战之一是不同的时间序列具有截然不同的页面浏览范围。一些维基百科页面始终获得大量流量,其他页面不太受欢迎,但偶尔会因相关新闻事件(例如与页面相关的突发新闻)而出现流量高峰。林等。发现DoppelGANger在生成不同尺度的时间序列方面非常有效(参见原论文的图6)。在图3中,我们提供了一个类似的图表,显示时间序列中的点分布。对于每个示例,中点是在550天内获得的最小和最大页面浏览量之间的中间值。我们的PyTorch实现显示了与中点相似的保真度。图3:真实和合成WWT数据的时间序列中点分布最后,大多数维基百科页面的流量呈现出每周和每年的模式。为了评估这些模式,我们使用自相关,即不同时间滞后(1天、2天等)页面浏览量的Pearson相关性。三个合成版本的自相关图如图4所示(类似于原始论文中的图1)。图4:真实和合成WWT数据的自相关。两个PyTorch版本都会生成在原始论文中观察到的每周和每年的趋势。TensorFlow1结果与Lin等人的图1不匹配,如上图所示,来自我们的实验。我们观察到在使用原始参数进行训练时存在一些不一致,模型偶尔没有观察到每年(甚至每周)的模式。我们的快速版本中使用的较低学习率(1e-4)和较大批次大小(1000)使再训练更加一致。本节中生成图像和训练三个模型的分析代码在Github上作为笔记本共享。运行时最后一个更复杂模型的一个关键方面是运行时。一个需要几周训练的好模型实际上比一个需要一个小时训练的模型更受限制。在这里,PyTorch实现相比之下表现得非常好(尽管作者在论文中指出他们没有对TensorFlow1代码执行性能优化)。所有模型均使用GPU进行训练,并在由NVIDIATeslaT4提供支持的GCPn1-standard-8实例(8个虚拟CPU和30GBRAM)上运行。从13小时到0.3小时对于这个伟大的模型在实践中更有用是至关重要的!版本训练时间TensorFlow112.9小时PyTorch,batch_size=100(原始参数)1.6小时PyTorch,batch_size-10000.3小时原标题:GenerateSyntheticTime-seriesDatawithOpen-sourceTools,作者:KendrickBoyd