CTGAN 合成数据生成与验证脚本学习笔记
CTGAN 合成数据生成与验证脚本学习笔记
本笔记详细讲解如何使用 CTGAN 对混凝土材料数据进行合成、物理约束筛选,并进行统计与分布验证。适合数据科学、材料科学相关领域学习者参考。
1. 导入依赖与数据读取
首先导入所需库,并读取原始数据:
import pandas as pd
import numpy as np
from ctgan import CTGAN
from sklearn.preprocessing import QuantileTransformer
import warningswarnings.filterwarnings('ignore')
# 读取数据
....
2. 数据预处理
将所有数据列转换为 float,并用 QuantileTransformer 统一分布(有助于后续建模):
# 数据预处理
for column in real_data.columns:real_data.loc[:, column] = real_data[column].astype(float)# QuantileTransformer进行分布转换
transformer = QuantileTransformer(output_distribution='normal')
transformed_data = pd.DataFrame(transformer.fit_transform(real_data),columns=real_data.columns
)
3. CTGAN 模型构建与训练
设置 CTGAN 参数并训练生成模型:
# 定义离散列
discrete_columns = []# 优化CTGAN模型参数
ctgan = CTGAN(epochs=2000, # 训练轮数batch_size=100, # 批次大小pac=5, # pac参数generator_dim=(512, 1024, 2048, 1024, 512), # 网络结构discriminator_dim=(512, 1024, 2048, 1024, 512),generator_lr=1e-5, #学习率discriminator_lr=1e-5,discriminator_steps=3, # 判别器训练步数verbose=True
)# 训练模型
print("开始训练模型...")
ctgan.fit(transformed_data, discrete_columns)
4. 生成与反向转换数据
生成十倍于原始数据量的合成数据,并反向转换回原始分布:
# 生成数据后筛选
n_synthetic = len(real_data) * 10 # 生成数据
synthetic_transformed = ctgan.sample(n_synthetic)# 反向转换数据
synthetic_data = pd.DataFrame(transformer.inverse_transform(synthetic_transformed),columns=real_data.columns
)
5. 物理约束函数
apply_physical_constraints
为合成数据添加物理约束,确保各成分比例合理,且分布接近原始数据。
def apply_physical_constraints(data, real_data):# 确保所有值非负for col in data.columns:data.loc[:, col] = np.maximum(data[col], 0)#归一化binder_sum = data[binder_columns].sum(axis=1)for col in binder_columns:data.loc[:, col] = data[col] / binder_sum#物理约束constraints = {#范围约束}# 硬约束for col, (min_val, max_val) in constraints.items():data.loc[:, col] = data[col].clip(min_val, max_val)
6. 分布相似性筛选函数
select_best_samples_with_distribution
用 Wasserstein 距离筛选与原始分布最接近的合成样本。
def select_best_samples_with_distribution(synthetic_data, real_data, n_select):from scipy.stats import wasserstein_distance# Wasserstein距离distances = []for i in range(len(synthetic_data)):sample = synthetic_data.iloc[i:i + 1]# 特征Wasserstein距离总和dist_sum = 0for col in real_data.columns:# 权重weight = 2.0 if col in ['Cement', 'FA', 'GGBFS', 'F-D', 'F-L'] else 1.0dist = wasserstein_distance(sample[col], real_data[col]) * weightdist_sum += distdistances.append(dist_sum)# 选择距离最小n_selectbest_indices = np.argsort(distances)[:n_select]return synthetic_data.iloc[best_indices]
7. 约束与筛选后的数据保存与验证
应用物理约束与分布筛选后,保存合成数据并进行多项统计验证:
synthetic_data = apply_physical_constraints(synthetic_data, real_data)
synthetic_data = select_best_samples_with_distribution(synthetic_data, real_data, len(real_data))
8.结果(部分)
##本文档仅供学习参考,实际使用时请结合具体数据和业务需求调整参数与约束条件。