使用ydata-synthetic的TimeGAN生成时序数据整数输入输出为小数求助
TimeGAN生成整数时序输出为小数的问题排查与解决
问题根因
- TimeGAN基于生成对抗网络实现,神经网络的输出层默认使用连续型激活函数(如Sigmoid、Tanh),原生输出就是浮点数值,不会直接生成整数
- 原代码缺少输入数据归一化预处理、生成数据逆转换步骤,且训练步数仅设置为10步,模型尚未收敛,无法拟合原始整数的分布特征
修复方案
1. 补充数据预处理与后处理逻辑
训练前先将原始0600000的整数归一化到01区间,生成数据后先做逆缩放,再通过取整操作转换为整数
2. 调整训练参数
将训练步数提升到1000步及以上,保证模型充分拟合数据分布
3. 修改后完整代码
from os import path import pandas as pd import numpy as np import matplotlib.pyplot as plt from ydata_synthetic.synthesizers import ModelParameters from ydata_synthetic.synthesizers.timeseries import TimeGAN import torch # 原始整数数据 arr_data = np.random.randint(0,600000,(100,1)) # 记录原始数据的最大最小值用于逆转换 data_min = arr_data.min() data_max = arr_data.max() # 将数据归一化到0-1区间 norm_data = (arr_data - data_min) / (data_max - data_min) # TimeGAN参数 seq_len=20 n_seq = 1 # 列数 hidden_dim=24 gamma=1 noise_dim = 32 dim = 128 batch_size = len(norm_data) - seq_len learning_rate = 5e-4 gan_args = ModelParameters(batch_size=batch_size, lr=learning_rate, noise_dim=noise_dim, layers_dim=dim) # 构造时序样本 lst_temp = [] for i in range(0,len(norm_data) - seq_len): _x = norm_data[i:i+20] lst_temp.append(_x) lst_rand_data = np.array(lst_temp) synth = TimeGAN(model_parameters=gan_args, hidden_dim=24, seq_len=seq_len, n_seq=n_seq, gamma=1) # 调整训练步数为1000 synth.train(lst_rand_data, train_steps=1000) synth_data = synth.sample(len(lst_rand_data)) # 生成数据逆缩放+取整转为整数 synth_data = (synth_data * (data_max - data_min) + data_min).round().astype(int) print(synth_data.shape) cols = ['Car price'] for j, col in enumerate(cols): df = pd.DataFrame({'Real': arr_data[-seq_len:, j],'Synthetic': synth_data[-1][:, j]}) df.plot(title = "Car price",secondary_y='Synthetic data', style=['-', '--']) print(df)
效果说明
修改后生成的synth_data就是符合0~600000范围的整数时序数据,且分布特征和原始数据对齐。
内容的提问来源于stack exchange,提问作者seounggue kang
相关产品推荐
相关产品推荐

