You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用CTGAN生成指定历史日期的合成数据?

解决CTGAN生成指定历史日期的方法

CTGAN的生成逻辑完全依赖训练数据的分布,你的原始数据仅包含2022-09-13、2022-09-14两个日期,模型自然无法生成未见过的更早日期。以下是三种可行的解决思路:

方法一:扩展原始训练数据集的日期样本

手动添加包含目标日期(2022-09-11、2022-09-12)的模拟样本,让模型学习到这些日期的分布。示例代码如下:

import pandas as pd
from ctgan import CTGAN

# 生成包含目标日期的模拟样本(字段取值参考原数据范围)
extra_samples = pd.DataFrame({
    'visit_date': ['2022-09-11', '2022-09-11', '2022-09-12', '2022-09-12'],
    'token_no': [210, 320, 245, 360],
    'patient_booking_time': ['09:25', '10:10', '08:50', '11:15']
})

# 合并原数据与模拟样本
extended_data = pd.concat([data, extra_samples], ignore_index=True)

# 训练CTGAN
ctgan = CTGAN(verbose=True)
ctgan.fit(extended_data, categorical_features, epochs=100)
samples = ctgan.sample(10)

方法二:后处理替换生成的日期

先生成与原数据日期一致的样本,再按需求比例将部分日期替换为目标更早日期。示例代码:

from ctgan import CTGAN
import numpy as np

# 原训练流程
ctgan = CTGAN(verbose=True)
ctgan.fit(data, categorical_features, epochs=100)
samples = ctgan.sample(10)

# 定义目标日期及对应概率(可按需调整比例)
target_dates = ['2022-09-11', '2022-09-12', '2022-09-13', '2022-09-14']
date_probs = [0.2, 0.2, 0.3, 0.3]

# 随机替换日期
samples['visit_date'] = np.random.choice(target_dates, size=len(samples), p=date_probs)

方法三:将日期转换为数值特征训练

把日期转换为连续数值(如距某基准日的天数),让模型生成插值后的数值,再转回日期格式:

import pandas as pd
from ctgan import CTGAN
from datetime import datetime

# 将原数据日期转为数值偏移量(基准日设为2022-09-13)
base_date = datetime(2022, 9, 13)
data['day_offset'] = data['visit_date'].apply(lambda x: (datetime.strptime(x, '%Y-%m-%d') - base_date).days)

# 添加目标日期的数值样本(-2对应11号,-1对应12号)
extra_samples = pd.DataFrame({
    'day_offset': [-2, -2, -1, -1],
    'token_no': [225, 290, 235, 310],
    'patient_booking_time': ['09:15', '10:25', '08:40', '11:05']
})
extended_data = pd.concat([data, extra_samples], ignore_index=True)

# 调整分类特征列表(移除原日期字段,day_offset为数值特征无需加入分类列表)
new_categorical_features = [feat for feat in categorical_features if feat != 'visit_date']

# 训练并生成样本
ctgan = CTGAN(verbose=True)
ctgan.fit(extended_data, new_categorical_features, epochs=100)
samples = ctgan.sample(10)

# 将数值偏移量转回日期格式
samples['visit_date'] = samples['day_offset'].apply(lambda x: (base_date + pd.Timedelta(days=x)).strftime('%Y-%m-%d'))
samples = samples.drop('day_offset', axis=1)  # 可选:移除中间字段

内容的提问来源于stack exchange,提问作者saad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 20:40:27